Dies ist eine interessante Frage und da es nicht sehr explizit in der Dokumentation erklärt wird, beantworte ich dies durch die sourcecode of mod_rewrite; demonstriert einen großen Vorteil von open-source.
Im oberen Bereich finden Sie schnell die defines used to name these flags beschmutzen werden:
#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
und die Suche nach CONDFLAG_ORNEXT bestätigt, dass es based on the existence of the [OR] flag verwendet wird:
else if ( strcasecmp(key, "ornext") == 0
|| strcasecmp(key, "OR") == 0 ) {
cfg->flags |= CONDFLAG_ORNEXT;
}
Das nächste Vorkommen der Flagge ist die actual implementation Hier finden Sie die Schleife, die alle RewriteConditions durchläuft, die eine RewriteRule hat, und was sie im Grunde tut (stripped, Kommentare wurden zur besseren Übersicht hinzugefügt):
# 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;
}
}
Sie sollten in der Lage sein, dies zu interpretieren; Es bedeutet, dass OR eine höhere Priorität hat, und Ihr Beispiel führt tatsächlich zu if ((A OR B) AND (C OR D))
. Wenn Sie zum Beispiel folgende Umstände:
RewriteCond A [or]
RewriteCond B [or]
RewriteCond C
RewriteCond D
würde es als if ((A OR B OR C) and D)
interpretiert werden.
Ja, richtig. [OR] hat eine höhere Priorität als das (implizite) "AND". Die kombinierte Bedingung ist tatsächlich ((A oder B) und (C oder D)). – Doin
Sie finden die Details in http://www.ckollars.org/apache-rewrite-htaccess.html#precedence hilfreich. –