如何让Apache RewriteCond条件应用到多条独立RewriteRule规则?
解决Apache RewriteCond作用于多条RewriteRule的问题
方法1:使用Apache 2.4+的<If>指令(推荐)
把所有需要受主机条件限制的RewriteRule放到<If>块内,条件会批量作用于块里的所有规则,无需重复编写RewriteCond:
<If "%{HTTP_HOST} =~ /^foo\.bar\.com$/i"> RewriteRule ^alpha(.*) https://alpha.sample.com/$1 [L,R=301] RewriteRule ^bravo(.*) https://bravo.sample.edu/$1 [L,R=301] RewriteRule ^charlie(.*) https://sample.com/$1 [L,R=301] </If>
/^foo\.bar\.com$/i里的i标记实现不区分大小写匹配,和原配置的[NC]效果一致。<If>是Apache 2.4及以上版本新增的语法,逻辑清晰,代码更整洁。
方法2:通过环境变量传递匹配状态(兼容低版本Apache)
如果你的Apache版本低于2.4,无法使用<If>,可以先通过RewriteCond设置环境变量,再让每条规则检查这个变量:
# 主机匹配时,设置环境变量HOST_MATCHED RewriteCond %{HTTP_HOST} ^foo\.bar\.com$ [NC,E=HOST_MATCHED:1] # 每条规则仅在环境变量存在时执行重写 RewriteRule ^alpha(.*) https://alpha.sample.com/$1 [L,R=301,ENV=!HOST_MATCHED] RewriteRule ^bravo(.*) https://bravo.sample.edu/$1 [L,R=301,ENV=!HOST_MATCHED] RewriteRule ^charlie(.*) https://sample.com/$1 [L,R=301,ENV=!HOST_MATCHED]
ENV=!HOST_MATCHED用于匹配后清除环境变量,避免后续规则重复触发(因每条规则带[L]标记强制终止处理,不加也可,但加上更严谨)。
原配置失效原因
Apache Rewrite的规则逻辑是:单个RewriteCond仅对紧跟其后的第一条RewriteRule生效,后续规则不会继承前面的条件,所以原配置里只有第一条RewriteRule受HTTP_HOST限制,后面的规则会忽略主机条件直接执行。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

