我在 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 变量应该可以工作,但是却不能?