Apache RewriteCond默认为AND逻辑,多条件需全部满足才触发规则;加[OR]标志可实现相邻条件间的OR关系,但不可跨行或用于末尾条件,复杂逻辑需拆分规则或交由应用层处理。

Apache 的 RewriteCond 本身不支持直接写 AND/OR 关键字,但可以通过多个条件的排列顺序和 flags(如 [OR])来控制组合逻辑。默认是 所有条件都必须满足(隐式 AND),加 [OR] 才变成 任一满足即可(OR)。
默认是 AND:所有条件同时成立才触发规则
只要写多个 `RewriteCond`,它们会自动按顺序“与”运算:
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]上面三行条件必须全部为真:域名是 example.com、请求路径不是 /admin/、且当前不是 HTTPS —— 才执行跳转。
用 [OR] 实现 OR 逻辑
在某个 `RewriteCond` 后加 [OR],表示它和下一个条件之间是“或”关系。注意:[OR] 只作用于紧邻的下一行条件,不能跨多行链式 OR。
例如:匹配任意一个子域就重定向:
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^blog\.example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^shop\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]这里前两个条件带 `[OR]`,第三个没加,所以整体等价于:
(www.example.com OR blog.example.com) OR shop.example.com → 即三个域名任一匹配都触发。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
⚠️ 注意:最后一个条件不能加 `[OR]`,否则 Apache 会报错或行为异常。
混合 AND 和 OR:靠分组 + 顺序控制
没有括号语法,只能靠条件顺序和 `[OR]` 的作用范围来模拟逻辑分组。比如要实现:
(A AND B) OR (C AND D)
写法是:
RewriteCond %{HTTP_HOST} ^a\.com$ [OR]
RewriteCond %{HTTP_HOST} ^b\.com$
RewriteCond %{REQUEST_URI} ^/api/
RewriteRule ^(.*)$ /maintenance.html [L]这实际是:
(%{HTTP_HOST} == a.com OR %{HTTP_HOST} == b.com) AND %{REQUEST_URI} starts with /api/
想表达更复杂的混合逻辑(如 `(A OR B) AND (C OR D)`),需拆成多个 `RewriteRule` 块,或借助 `RewriteMap` 或外部脚本 —— 纯 `.htaccess` 很难优雅实现。
常见陷阱和建议
- `[OR]` 必须写在条件行末尾,且只影响它和下一行 `RewriteCond` 的关系
- 不要在最后一个 `RewriteCond` 加 `[OR]`,Apache 不允许
- 条件中变量为空时(如 `%{ENV:VAR}` 未设置),默认视为空字符串,可用 `-n`(非空)或 `-z`(为空)判断
- 调试时开启 `LogLevel alert rewrite:trace3`(Apache 2.4+)看每条条件的匹配过程
- 避免过度嵌套逻辑;复杂路由建议交给应用层(如 PHP/Node)处理,更清晰可控

















