C'est une question intéressante et comme elle n'est pas expliquée très explicitement dans la documentation, je vais y répondre en passant par le code source de mod_rewrite ; démontrant un grand avantage de l' open-source .
Dans la section supérieure, vous repérerez rapidement les définitions utilisées pour nommer ces indicateurs :
#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
et la recherche de CONDFLAG_ORNEXT confirme qu'il est utilisé sur la base de l'existence de l'indicateur [OR] :
else if ( strcasecmp(key, "ornext") == 0
|| strcasecmp(key, "OR") == 0 ) {
cfg->flags |= CONDFLAG_ORNEXT;
}
La prochaine occurrence de l'indicateur est l' implémentation réelle où vous trouverez la boucle qui traverse toutes les RewriteConditions d'une RewriteRule, et ce qu'elle fait essentiellement est (supprimée, commentaires ajoutés pour plus de clarté):
# 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;
}
}
Vous devriez être capable d'interpréter cela; cela signifie que OR a une priorité plus élevée, et votre exemple mène effectivement à if ( (A OR B) AND (C OR D) )
. Si vous souhaitez, par exemple, avoir ces conditions:
RewriteCond A [or]
RewriteCond B [or]
RewriteCond C
RewriteCond D
il serait interprété comme if ( (A OR B OR C) and D )
.