Apache RewriteCond 默认按AND组合,显式用[OR]实现或逻辑,且不支持括号分组,需靠顺序和标志隐含逻辑关系,每个条件仅作用于后续单条RewriteRule。

Apache 的 RewriteCond 支持多条件组合,关键在于用 [AND] 或 [OR] 标志控制逻辑关系,默认是 AND(即所有条件都必须满足)。
多个条件默认是 AND 关系
不加标志时,连续的 RewriteCond 自动按“与”处理:
RewriteCond %{HTTP_HOST} ^example\.com$<br>RewriteCond %{REQUEST_URI} !^/admin/<br>RewriteCond %{HTTPS} off<br>RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
上面三条条件必须**同时成立**才触发重写:域名是 example.com、请求路径不是 /admin/ 开头、且当前未使用 HTTPS。
显式使用 [AND] 或 [OR]
虽然默认是 AND,但可显式写出增强可读性;若需“或”逻辑,必须用 [OR]:
-
[AND]:前一个条件为真时,才检查下一个(和默认行为一致) -
[OR]:只要有一个条件为真,就继续匹配后续条件(注意:只影响相邻两条 RewriteCond 的关系)
例如,想对多个域名或路径做统一跳转:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteCond %{HTTP_HOST} ^old1\.com$ [OR]<br>RewriteCond %{HTTP_HOST} ^old2\.com$ [OR]<br>RewriteCond %{HTTP_HOST} ^old3\.com$<br>RewriteRule ^(.*)$ https://new.com/$1 [R=301,L]
注意:前两个用了 [OR],第三个没加标志 → 实际等价于 (A OR B) OR C,整体仍是“任一域名匹配即触发”。
混合 AND 和 OR 要小心顺序和分组
Apache 不支持括号分组,所以逻辑靠顺序和标志隐含。常见需求如:“(域名是 a.com 或 b.com) 且 路径不是 /api”:
RewriteCond %{HTTP_HOST} ^a\.com$ [OR]<br>RewriteCond %{HTTP_HOST} ^b\.com$<br>RewriteCond %{REQUEST_URI} !^/api/<br>RewriteRule ^(.*)$ /redirect.html [L]
这里前两条构成“域名匹配”,第三条是额外约束 → 整体效果就是:满足域名条件 且 路径不以 /api/ 开头。
常用变量和注意事项
确保条件中使用的变量有效,例如:
-
%{HTTP_HOST}:来自 Host 请求头,注意带端口时可能含:80或:443 -
%{REQUEST_URI}:包含开头的/,如/index.html -
%{QUERY_STRING}:不含?,如id=123&type=test - 正则中特殊字符(如
.、$)要转义,\.匹配字面量点 - 每个
RewriteCond只作用于紧随其后的RewriteRule
多个规则之间条件不共享,不要跨规则复用条件逻辑。

















