如何在Apache上使用“AND”,“OR”作为RewriteCond?

这是如何使用AND,或者在Apache上的RewriteCond

 rewritecond A [or] rewritecond B rewritecond C [or] rewritecond D RewriteRule ... something 

if ( (A or B) and (C or D) ) rewrite_it

所以看起来“OR”的优先级高于“AND”? 有没有一种方法可以像(A or B) and (C or D)语法一样轻松地进行分析?

这是一个有趣的问题,因为它没有在文档中明确解释,我将通过检查mod_rewrite的源代码来回答这个问题 。 展示了开源的大好处

在上面的部分中,您将很快find用于命名这些标志的定义 :

 #define CONDFLAG_NONE 1<<0 #define CONDFLAG_NOCASE 1<<1 #define CONDFLAG_NOTMATCH 1<<2 #define CONDFLAG_ORNEXT 1<<3 #define CONDFLAG_NOVARY 1<<4 

并searchCONDFLAG_ORNEXT确认它是基于[OR]标志的存在使用的 :

 else if ( strcasecmp(key, "ornext") == 0 || strcasecmp(key, "OR") == 0 ) { cfg->flags |= CONDFLAG_ORNEXT; } 

该标志的下一个出现是实际的实现 ,你会发现遍历RewriteRule所有RewriteCondition的循环,它基本上做了什么(剥离,为清晰起见添加注释):

 # loop through all Conditions that precede this Rule for (i = 0; i < rewriteconds->nelts; ++i) { rewritecond_entry *c = &conds[i]; # execute the current Condition, see if it matches rc = apply_rewrite_cond(c, ctx); # does this Condition have an 'OR' flag? if (c->flags & CONDFLAG_ORNEXT) { if (!rc) { /* One condition is false, but another can be still true. */ continue; } else { /* skip the rest of the chained OR conditions */ while ( i < rewriteconds->nelts && c->flags & CONDFLAG_ORNEXT) { c = &conds[++i]; } } } else if (!rc) { return 0; } } 

你应该可以解释这一点; 这意味着OR具有更高的优先级,并且您的示例确实导致if ( (A OR B) AND (C OR D) ) 。 例如,如果你有这些条件:

 RewriteCond A [or] RewriteCond B [or] RewriteCond C RewriteCond D 

它将被解释为if ( (A OR B OR C) and D )