Dies ist eine interessante Frage, und da sie in der Dokumentation nicht sehr explizit erklärt wird, beantworte ich sie, indem ich den Quellcode von mod_rewrite durchführe . Demonstration eines großen Vorteils von Open Source .
Im oberen Bereich finden Sie schnell die Definitionen, mit denen diese Flags benannt 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
Wenn Sie nach CONDFLAG_ORNEXT suchen, wird bestätigt, dass es basierend auf dem Vorhandensein des [OR] -Flag verwendet wird :
else if ( strcasecmp(key, "ornext") == 0
|| strcasecmp(key, "OR") == 0 ) {
cfg->flags |= CONDFLAG_ORNEXT;
}
Das nächste Vorkommen des Flags ist die eigentliche Implementierung, in der Sie die Schleife finden, die alle RewriteConditions durchläuft, die eine RewriteRule hat, und im Grunde genommen (entfernt, Kommentare zur Klarheit 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 dies interpretieren können; Dies bedeutet, dass der OP eine höhere Priorität hat und Ihr Beispiel tatsächlich dazu führt if ( (A OR B) AND (C OR D) )
. Wenn Sie zum Beispiel folgende Bedingungen hätten:
RewriteCond A [or]
RewriteCond B [or]
RewriteCond C
RewriteCond D
es würde interpretiert werden als if ( (A OR B OR C) and D )
.