问题描述
在 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]
^^