यह एक दिलचस्प सवाल है और चूंकि इसे प्रलेखन में बहुत स्पष्ट रूप से नहीं समझाया गया है, इसलिए मैं mod_rewrite के सोर्सकोड के माध्यम से जाकर इसका उत्तर दूंगा ; ओपन-सोर्स का एक बड़ा लाभ प्रदर्शित करना ।
शीर्ष अनुभाग में आप इन झंडों को नाम देने के लिए उपयोग किए जाने वाले परिभाषितों को जल्दी से देख लेंगे :
#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
और CONDFLAG_ORNEXT की खोज इस बात की पुष्टि करती है कि इसका उपयोग [या] ध्वज के अस्तित्व के आधार पर किया जाता है :
else if ( strcasecmp(key, "ornext") == 0
|| strcasecmp(key, "OR") == 0 ) {
cfg->flags |= CONDFLAG_ORNEXT;
}
झंडे की अगली घटना वास्तविक कार्यान्वयन है जहां आपको वह लूप मिलेगा जो सभी रिवेट्रिटकॉन्डिशन के माध्यम से जाता है, जो कि एक रिवरराइट है, और यह मूल रूप से क्या करता है (छीन लिया गया, टिप्पणी स्पष्टता के लिए जोड़ा गया):
# 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 )
।