Apache 2.4 .htaccess中<If>块内RewriteRule失效求助
Apache 2.4中块内RewriteRule失效问题解决方法
问题描述
RewriteRule单独使用时正常,但放入AddType application/x-lsphp83 .php测试),当前配置如下:
SetEnv MAINTENANCE_MODE 1 RewriteEngine On # REWRITE REQUESTS TO /MAINTENANCE(/) TO /MAINTENANCE.HTML RewriteRule ^maintenance/?$ /maintenance.html [L,END] <If "%{ENV:MAINTENANCE_MODE} == '1'"> # EXCLUDE IPS FROM THIS REWRITE RewriteCond %{REMOTE_ADDR} !=1.2.3.41 RewriteCond %{REMOTE_ADDR} !=1.2.3.42 # EXCLUDE MAINTENANCE.HTML AND THE MAINTENANCE URL ITSELF FROM BEING REDIRECTED RewriteCond %{REQUEST_URI} !^/maintenance\.html$ RewriteCond %{REQUEST_URI} !^/maintenance/?$ # REDIRECT ALL OTHER IPS TO THE MAINTENANCE PAGE RewriteRule ^(.*)$ /maintenance/ [R=302,L] </If>
问题原因
Apache 2.4中,<If>指令的处理阶段晚于mod_rewrite的URL重写阶段。即使
解决方法
方法一:将条件转换为RewriteCond(推荐)
直接用mod_rewrite原生的RewriteCond检查环境变量,移除
SetEnv MAINTENANCE_MODE 1 RewriteEngine On # REWRITE REQUESTS TO /MAINTENANCE(/) TO /MAINTENANCE.HTML RewriteRule ^maintenance/?$ /maintenance.html [L,END] # 仅当MAINTENANCE_MODE为1时执行后续重定向规则 RewriteCond %{ENV:MAINTENANCE_MODE} == '1' # 排除指定IP RewriteCond %{REMOTE_ADDR} !=1.2.3.41 RewriteCond %{REMOTE_ADDR} !=1.2.3.42 # 排除维护页面本身 RewriteCond %{REQUEST_URI} !^/maintenance\.html$ RewriteCond %{REQUEST_URI} !^/maintenance/?$ # 重定向到维护页面 RewriteRule ^(.*)$ /maintenance/ [R=302,L]
方法二:在块内重新启用RewriteEngine
如果坚持使用RewriteEngine On,强制mod_rewrite在
SetEnv MAINTENANCE_MODE 1 RewriteEngine On # REWRITE REQUESTS TO /MAINTENANCE(/) TO /MAINTENANCE.HTML RewriteRule ^maintenance/?$ /maintenance.html [L,END] <If "%{ENV:MAINTENANCE_MODE} == '1'"> RewriteEngine On # 重新启用,确保块内规则被处理 # EXCLUDE IPS FROM THIS REWRITE RewriteCond %{REMOTE_ADDR} !=1.2.3.41 RewriteCond %{REMOTE_ADDR} !=1.2.3.42 # EXCLUDE MAINTENANCE.HTML AND THE MAINTENANCE URL ITSELF FROM BEING REDIRECTED RewriteCond %{REQUEST_URI} !^/maintenance\.html$ RewriteCond %{REQUEST_URI} !^/maintenance/?$ # REDIRECT ALL OTHER IPS TO THE MAINTENANCE PAGE RewriteRule ^(.*)$ /maintenance/ [R=302,L] </If>
说明
推荐使用方法一,mod_rewrite的原生条件判断更适配重写逻辑,可避免因Apache阶段处理顺序导致的规则失效问题。
内容的提问来源于stack exchange,提问作者golabs
相关产品推荐
相关产品推荐

