C'est une question intéressante et comme elle n'est pas expliquée de manière très explicite dans la documentation, je vais y répondre en parcourant la rubrique code source de mod_rewrite ; démontrant un grand avantage de la open-source .
Dans la partie supérieure, vous repérerez rapidement la rubrique Définitions utilisées pour nommer ces drapeaux :
#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 du drapeau est le mise en œuvre effective où vous trouverez la boucle qui parcourt toutes les RewriteConditions d'une RewriteRule, et ce qu'elle fait essentiellement est (dépouillé, 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 en mesure d'interpréter cela ; cela signifie que OR a une plus grande priorité, et votre exemple conduit en effet à if ( (A OR B) AND (C OR D) )
. Si vous avez, par exemple, 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 )
.