Apache服务器中如何避免带RewriteCond的mod_rewrite设置nokeepalive时变量被添加REDIRECT_前缀
我完全懂你的困扰——当用mod_rewrite结合RewriteCond设置nokeepalive环境变量时,Apache自动给变量加REDIRECT_前缀,导致没法正常禁用keepalive。这个问题的核心是内部重定向触发的环境变量重命名机制,下面给你两个可行的解决方案:
方案1:使用[END] flag终止重写处理(推荐,适用于Apache 2.4.10+)
当你用[L] flag时,在.htaccess上下文里,Apache会重启重写规则的处理循环,这就会触发内部重定向,进而给环境变量加上REDIRECT_前缀。而[END] flag是Apache 2.4.10引入的,它会完全终止所有重写处理,不会触发内部重定向,这样环境变量就能保持原名。
调整你的配置如下:
# 匹配特定URL时设置nokeepalive,用END终止重写 RewriteCond %{REQUEST_URI} ^/specific_url RewriteRule ^ - [E=nokeepalive,END] # 其他规则(如果有的话) RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L]
这样设置后,匹配到/specific_url时,重写处理直接终止,不会触发内部重定向,nokeepalive变量就不会被重命名。
方案2:调整规则顺序,避免后续重写触发内部重定向
如果你的Apache版本低于2.4.10,无法使用[END],可以把设置环境变量的规则放在所有重写规则的最后,确保设置变量后没有后续的重写操作触发内部重定向:
# 先处理其他规则 RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] # 最后设置nokeepalive变量 RewriteCond %{REQUEST_URI} ^/specific_url RewriteRule ^ - [E=nokeepalive]
这样当匹配到特定URL时,变量设置后没有后续的重写规则需要处理,也就不会触发内部重定向,变量名得以保留。
为什么会出现REDIRECT_前缀?
简单来说,当mod_rewrite执行了RewriteRule(哪怕是^ -这种不修改URL的规则),如果后续还有规则需要处理,或者因为.htaccess的上下文导致规则循环,Apache会发起一次内部重定向。在这个过程中,之前设置的环境变量会被加上REDIRECT_前缀,用来区分原始请求和内部重定向后的请求。而你去掉RewriteCond全局设置时,没有触发任何重写规则的循环,所以变量不会被重命名。
内容的提问来源于stack exchange,提问作者R.Damasinoro

