在apache .htaccess文件中创建和使用自己的变量

Create and use your own variables in apache .htaccess file

提问人:DevArchitectMaster 提问时间:11/5/2023 最后编辑:DevArchitectMaster 更新时间:11/14/2023 访问量:41

问:

简单地谈谈我有点不寻常的问题,不幸的是,在浩瀚的互联网中,我还没有找到合适的答案:

我想在 Apache (2.4) .htaccess-file 中定义一个局部变量,并在同一文件中使用它,即读取它。

我还看到了其他贡献,例如这个。但是,我不想使用 中的变量,但如下例所示。RewriteCond

初始情况:我有一条静态路径,我经常不得不将其放在各种相对路径的前面。此问题阻止我手动添加路径 (DRY)。我想避免这种冗余,并回到变量的概念上。

.htaccess

# however variables are defined
VAR_TO_PATH = "/abs/path/to/"

# use of the variable
AuthUserFile VAR_TO_PATH."/htdata/.htpasswd"
AuthGroupFile VAR_TO_PATH."/htdata/.htgroup"

谁能帮我满足我的要求?

干杯

已测试不满意

.htaccess

# definition of variables
SetEnv root_path "C:/xampp/htdocs/my/"

# use of the variable
AuthUserFile "%{SERVER:root_path}htdata/.htpasswd"
AuthGroupFile "%{ENV:root_path}htdata/.htgroup"

error.log

[Sun Nov 12 21:53:56.703673 2023] [core:alert] [pid 20688:tid 1900] [client 127.0.0.1:51989] C:/xampp/htdocs/my/.htaccess: AuthUserFile: Invalid file path '%{ENV:root_path}.htdata/.htpasswd'

[Sun Nov 12 21:54:11.942883 2023] [core:alert] [pid 20688:tid 1900] [client 127.0.0.1:52011] C:/xampp/htdocs/my/.htaccess: AuthGroupFile: Invalid file path '%{SERVER:root_path}.htdata/.htgroup'
.htaccess 全局变量

评论

0赞 arkascha 11/12/2023
我不知道重写模块中有这样的功能。你可以引用环境变量,这是要走的路。您上面提到的答案不限于 .您也应该能够将它用于您的目的。RewriteCond
0赞 DevArchitectMaster 11/13/2023
@arkascha 非常感谢您的建议。我已经在上面包含了我的测试。不幸的是,我没有成功,即使有你的建议。你能够自己验证这一点吗?
0赞 arkascha 11/13/2023
不,我自己没有验证过,对不起。自从我上次在这个领域工作以来,已经有很长一段时间了。一般情况下,环境变量需要有大写名称。并尝试使用...%{ENV:ROOT_PATH}

答:

1赞 MrWhite 11/14/2023 #1

不幸的是,对于这些特定指令(您需要访问服务器配置),这还不能单独使用(目前还可能),原因如下:.htaccess

  • AuthUserFile(mod_authn_file的一部分)和(mod_authz_groupfile的一部分)不支持表达式语法,该语法允许使用以下形式的语法引用环境变量(从操作系统导入或设置)。(在 Apache 2.4 的更高版本中,许多模块/指令已更新为允许此语法,但不幸的是,相关指令没有。AuthGroupFileSetEnvIf%{reqenv:VARIABLE}

  • 您需要访问主服务器配置(例如。 container),以便服务器变量可用于其他配置指令。如果您有权访问服务器配置,则可以使用语法定义可在任何配置指令中使用的变量 - 这些变量是早期解析的,因此不依赖于相关指令。<VirtualHost>Define${VARIABLE}

    例如:

    # Main server config
    <VirtualHost: *443>
        Define VAR_TO_PATH /abs/path/to/
        :
    

    # .htaccess
    AuthUserFile ${VAR_TO_PATH}/htdata/.htpasswd
    AuthGroupFile ${VAR_TO_PATH}/htdata/.htgroup
    

但是,这两个选项都不是真正被视为“局部”变量。环境变量是环境的“本地”,而 'd 服务器变量可以说是“全局的”(它们设置在“本地化”容器中,例如 or,但随后可以在该容器外部访问)。Define<VirtualHost><Directory>


旁白:

# definition of variables
SetEnv root_path "C:/xampp/htdocs/my/"

关于使用 (mod_env) 设置环境变量。此指令(模块)处理得很晚。为时已晚,无法被大多数其他配置指令所接受。如果需要设置其他指令使用的环境变量,则几乎总是需要改用 SetEnvIf (mod_setenvif),这是早期处理的。SetEnv

(您还可以使用 mod_rewrite 设置 env 变量,该变量的处理时间也较早,但晚于 。除非您主要使用 mod_rewrite,或者具有复杂的条件,否则不会使用 mod_rewrite over mod_setenvif来设置 env vars。RewriteRuleSetEnvIf

评论

0赞 DevArchitectMaster 11/14/2023
非常感谢您提供的信息丰富且非常好的解释!那么我现在能做的就是希望并提交功能请求。我是否正确阅读了,“AuthUserFile”以及“AddIcon”或“ErrorDocument”的路径必须始终是绝对的?到目前为止,我只遇到过相对路径的问题......