Apache mod_rewrite [E] 使用 RewriteCond 重定向前缀

问题描述

在 Apache 服务器中,如果匹配特定 URL,我需要禁用 keepalive。
为此,我使用 mod_rewrite 对其进行设置,然后让脚本运行。

RewriteCond %{REQUEST_URI} ^/specific_url
RewriteRule  ^ - [E=nokeepalive]
.......
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

现在我的问题是,如果匹配,nokeepalive 最终会被前缀/重命名为 REDIRECT_
从这个问题:When setting environment variables in Apache RewriteRule directives,what causes the variable name to be prefixed with "REDIRECT_"?
我认为这是由于 RewriteRule
但是如果我删除了 RewriteCond(这将禁用 keepAlive 全局与任何 URL)
有没有办法用 RewriteCond 防止这种前缀?
我不能使用 SetEnvIf,因为我使用了 mod_rewrite,所以我必须使用 RewriteRule

SetEnv/SetEnviF 也无法工作,因为它们无法读取未使用 SetEnv/SetEnvif 分配的变量。 我尝试使用 SetEnvIf 仅定义 REDIRECT_nokeepalive 是否存在(因为只需要定义 nokeepalive,而不管值如何) - 但无济于事。

解决方法

我不能使用 SetEnvIf,因为我使用了 mod_rewrite,所以我必须使用 RewriteRule。

您可以将 mod_setenvif 与 <If> 一起使用。

<If "%{REQUEST_URI} =~ /regextomatchurl/">
# or use <If "%{REQUEST_URI} == 'urlstring'">
SetEnv nokeepalive 1
</If>

您可以删除该重写规则。

或:

你可以添加这个,它可能会工作,没有测试:

SetEnv nokeepalive ${REDIRECT_nokeepalive}

编辑:

记得在 PassEnv REDIRECT_nokeepalive 之前添加 SetEnv,因为 SetEnv 无法从 mod_rewrite 读取环境变量。

只是指出:

这里有两个空格,这可能会导致其他 RewriteRule 将来出现问题:

RewriteRule  ^ - [E=nokeepalive]
           ^^