如何在htaccess的RewriteCond中实现(A and B) or (C and D)逻辑?
mod_rewrite RewriteCond组合逻辑实现解答
基础规则先明确
- RewriteCond之间默认是逻辑AND关系,没有特殊标记时,必须所有条件全部匹配才会触发后续RewriteRule
- [OR]标记会将当前条件和下一个条件的关系改为逻辑OR,且OR的优先级高于默认的AND,运算从左到右依次执行
你给出的两个写法的实际逻辑
第一个写法:
RewriteCond A RewriteCond B [OR] RewriteCond C RewriteCond D
你猜的没错,它的实际逻辑是 A AND (B OR C) AND D,完全不符合你要的 (A AND B) OR (C AND D) 需求,这个写法是错误的。
第二个写法:
RewriteCond A RewriteCond B RewriteCond C [OR] RewriteCond D
它的实际逻辑是 A AND B AND (C OR D),不是你猜的 (A AND B AND C) OR D。
如何实现(A AND B) OR (C AND D)逻辑
不需要硬凑单组RewriteCond,有两种常用的实现方案:
方案1:拆分多条RewriteRule(最推荐,可读性最高不容易出错)
把两组逻辑拆成两条独立的RewriteRule,执行相同的跳转/处理逻辑即可:
# 匹配第一组条件(A AND B) RewriteCond A RewriteCond B RewriteRule ^your-pattern$ /target-path [L] # 匹配第二组条件(C AND D) RewriteCond C RewriteCond D RewriteRule ^your-pattern$ /target-path [L]
方案2:用环境变量标记后统一判断(适合不想拆分规则的场景)
先给满足任意一组条件的请求打上统一标记,再判断标记执行规则:
# 满足(A AND B)打标记 RewriteCond A RewriteCond B RewriteRule ^ - [E=MATCH_REQ:1] # 满足(C AND D)打相同标记 RewriteCond C RewriteCond D RewriteRule ^ - [E=MATCH_REQ:1] # 统一判断标记存在就执行规则 RewriteCond %{ENV:MATCH_REQ} =1 RewriteRule ^your-pattern$ /target-path [L]
内容的提问来源于stack exchange,提问作者dansan
相关产品推荐
相关产品推荐

