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

问题描述 投票:0回答:1

简要回答我的有点不寻常的问题,不幸的是我尚未在浩瀚的互联网中找到合适的答案:

我想在 Apache (2.4)

.htaccess
文件中定义一个局部变量,并在同一个文件中使用它,即读取它。

我还看到了其他贡献,例如这个。但是,我不想使用

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 variables global-variables
1个回答
0
投票

不幸的是,这(还?)不可能单独使用

.htaccess
来处理这些特定指令(您需要访问服务器配置),原因如下:

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

  • 您需要访问主服务器配置(例如

    <VirtualHost>
    容器),以便
    Define
    可以在其他配置指令中使用的服务器变量。如果您有权访问服务器配置,那么您可以使用语法 Define
     在任何配置指令中使用 
    ${VARIABLE}
     变量 - 这些变量会被解析为 early,因此不依赖于相关指令。

    例如:

    # 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
    

但是,这些选项都不是真正被视为“局部”变量。环境变量对于 environment 来说是“本地”的,而

Define
'd 服务器变量可以说是“全局”的(它们设置在“本地化”容器中,例如
<VirtualHost>
<Directory>
但可以在外部访问)该容器的)。


旁白:

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

关于使用

SetEnv
(mod_env)设置环境变量。该指令(模块)的处理非常。大多数其他配置指令都太晚了。如果您需要设置一个环境变量供其他指令使用,那么您几乎总是需要使用
SetEnvIf
(mod_setenvif) 来代替,它会被提前处理。

© www.soinside.com 2019 - 2024. All rights reserved.