Apache 2.4 从另一个变量或条件定义变量

Apache 2.4 从另一个变量或条件定义变量

我想要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-IPCountryheader的值

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>

相关内容