You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:27:13