基于自定义 HTTP 标头的 Apache IF 条件

基于自定义 HTTP 标头的 Apache IF 条件

我在 Apache 中有一个 RewriteRule 指令,我希望仅当存在自定义 HTTP 标头时才应用该指令。

我已尝试过:

<If "%{HTTP:X-MyCustomHeader} in { 'present' }">
RewriteRule ^/$ /present.html [NC,R=301,L]
</If>
<Else>
RewriteRule ^/$ /absent.html [NC,R=301,L]
</Else>

这根本不起作用,RewriteRule 都没有应用。

我尝试过的替代方案:

<If "-n req_novary('X-MyCustomHeader')">

也不起作用。

我正在用 curl 测试

curl -is http://example.com/ -H X-MyCustomHeader:present

为了验证标题是否存在且可见,我尝试使用环境变量:

SetEnvIf  X-MyCustomHeader ^(present)$ MY_CUSTOM_VAR=$1
Header always set X-MyCustomHeader "### FOUND ###" env=MY_CUSTOM_VAR

这按预期工作,并且我在响应中得到了 FOUND。

但是当我尝试在 IF 语句中使用 env 变量时,它不会被触发,例如

<If "-n env('MY_CUSTOM_VAR')">

我该如何使用 IF 来做到这一点?是的,我知道有一个 RewriteCond 条件可以检查环境变量,但我还需要使用其他指令,所以我想在 IF 块中切换它们。

根据文档:https://httpd.apache.org/docs/trunk/en/expr.html#functions

当在条件中查找环境变量时,重要的是要考虑在请求处理过程中此解析发生得有多早。作为指导原则,在虚拟主机上下文(目录、位置、htaccess)之外定义的任何指令都不太可能有机会执行。虚拟主机范围内的 SetEnvIf 是在此解析之前运行的一个指令。

因此根据文档,SetEnvIf 变量应该可以工作,但是却不能?

相关内容