我想要Define
从最初通过 nginx 收到的值中获取一个变量proxy_set_header MYVAR "some_value";
DocumentRoot
然后应在、Directory
和中使用该变量Alias
。
RewriteRule .* - [E=MYVAR:%{HTTP:MYVAR}]
SetEnv MYVAR "%{HTTP:MYVAR}"
Define MYVAR ${MYVAR}
根据 Apache 文档,这似乎是不可能的,因为该文档仅提供了如何设置静态值的示例。因此我尝试了这个:
<If "%{HTTP:MYVAR} == 'value1'">
Define MYVAR value1
</If>
<If "%{HTTP:MYVAR} == 'value2'">
Define MYVAR value2
</If>
这也不起作用。它总是Define
从最后一个开始执行<If>
。如果我添加
<Else>
Define MYVAR undefined
</Else>
这将被执行,所以也许我的语法有问题或者整个逻辑没有像我想象的那样工作?
我没什么主意了……
Define
编辑:一般来说,在 内不起作用是真的吗<If>
?
答案1
看着https://httpd.apache.org/docs/2.4/mod/core.html#define我认为你不能。定义是在启动时预处理和设置的 - 该值由当时最后定义它的指令固定(因此它采用后者的值,而不管<If>
),并且您以后无法通过编程更改它。
由于您的示例在前一行设置了一个 EnvVar,为什么不直接使用它呢?
答案2
要根据 Apache 从 Nginx 代理收到的标头值设置变量,您应该使用mod_setenvif
模块及其设置EnvIfNoCase像这样的选项:
其中CF_COUNTRY_CODE
是变量,其值设置为CF-IPCountry
header的值
SetEnvIfNoCase CF-IPCountry "(.*)" CF_COUNTRY_CODE=$1
然后您可以CF_COUNTRY_CODE
在目录路径中使用变量
答案3
我的问题是,每当我有一个未定义的模块时,即使条件<IF>
不匹配,我也会在启动时收到语法错误。显然语法检查不会让设置通过。
对我来说,解决方案是使用<IFDefine>
错误的:
<If "${VAR}=='a'">
LoadModule module1 "path_to_module1"
</If>
<Else>
LoadModule module2 "path_to_module2"
</Else>
正确的:
Define "FFF${VAR}"
<IfDefine FFFa>
LoadModule module1 "path_to_module1"
</IfDefine>
<IfDefine !FFFa>
LoadModule module2 "path_to_module2"
</IfDefine>