apache rewritecond 默认按and执行,用[or]实现短路or逻辑,混合逻辑需靠条件顺序安排,正则匹配必须显式使用~操作符。

Apache 的 RewriteCond 本身不支持括号分组,但能通过顺序、操作符和标志(如 [OR])实现清晰的与/或逻辑。关键不是“怎么写复杂表达式”,而是“怎么安排条件链让 Apache 正确理解你的意图”。
默认是 AND:所有条件必须同时成立
连续多行 RewriteCond 不加任何标志时,Apache 自动按“与”处理——只有每一条都匹配成功,后续的 RewriteRule 才会执行。
- 例如,只对非 HTTPS、非 admin 路径、且域名精确为 example.com 的请求强制跳转:
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
这三条必须全部为真,规则才触发。等价于:(host == example.com) AND (path not start with /admin/) AND (HTTPS is off)。
用 [OR] 实现 OR 逻辑:短路判断,需配合收尾条件
[OR] 不是“任意一个真就执行规则”,而是“只要当前条件为真,就跳过后续条件检查,直接进入规则匹配阶段”。它只影响相邻两条 RewriteCond 的关系,且必须和最后一个无 [OR] 的条件搭配使用,否则逻辑会出错。
- 想把 old1.com 或 old2.com 的请求统一跳转到 new.com:
RewriteCond %{HTTP_HOST} ^old1\.com$ [OR]
RewriteCond %{HTTP_HOST} ^old2\.com$
RewriteRule ^(.*)$ https://new.com/ [R=301,L]
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
这里实际含义是:(old1.com OR old2.com) AND true(隐含),因为第二条没带 [OR],所以它作为“终值条件”参与判断。如果漏掉第二条,规则永远不会生效。
混合 AND 和 OR:靠分组+顺序控制逻辑流向
Apache 不支持 (A OR B) AND (C OR D) 这类嵌套,但可通过重复规则或拆解条件逼近效果。更稳妥的做法是把“或分支”提前收束,再叠加共同约束。
- 需求:对 blog.example.com 或 api.example.com 的请求,且路径不是静态资源(js/css/png),才代理到后端:
RewriteCond %{HTTP_HOST} ^blog\.example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^api\.example\.com$
RewriteCond %{REQUEST_URI} !\.(js|css|png|jpg|gif|ico)$ [NC]
RewriteRule ^(.*)$ http://backend/$1 [P,L]
前两行构成“域名或”,第三行是所有域名都必须满足的附加约束(AND),整体即:(blog OR api) AND NOT static_ext。
正则匹配必须显式启用 ~ 操作符
很多逻辑错误源于误以为 ^/api/ 是正则——其实没有 ~,Apache 就当它是普通字符串。锚点 ^、$、量词 +、分组 () 等只有在正则模式下才生效。
- 正确写法(区分大小写):
RewriteCond %{REQUEST_URI} ~"^/api/v[12]/"
RewriteCond %{HTTP_USER_AGENT} ~"Mobile"
- 不区分大小写加
~*;取反用!~或!~*;文件存在性判断(如!-f)不用正则,直接用标志即可。










