mod rewrite Apache पर RewriteCond के लिए "AND", "OR" का उपयोग कैसे करें?



mod-rewrite apache-config (1)

यह एक दिलचस्प सवाल है और चूंकि इसे दस्तावेज़ीकरण में बहुत स्पष्ट रूप से समझाया नहीं गया है, इसलिए मैं 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 की खोज करने से पुष्टि होती है कि इसका उपयोग [OR] ध्वज के अस्तित्व के आधार पर किया जाता है:

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;
    }
}

आपको इसकी व्याख्या करने में सक्षम होना चाहिए; इसका मतलब है कि या उच्च प्राथमिकता है, और आपका उदाहरण वास्तव में 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 )

क्या यह अपाचे पर RewriteCond का उपयोग करने के लिए है, या?

rewritecond A [or]
rewritecond B
rewritecond C [or]
rewritecond D
RewriteRule ... something

बन जाता if ( (A or B) and (C or D) ) rewrite_it

तो ऐसा लगता है कि "या" "AND" की तुलना में अधिक प्राथमिकता है? क्या आसानी से बताने का कोई तरीका है, जैसे (A or B) and (C or D) वाक्यविन्यास?