นี่เป็นคำถามที่น่าสนใจและเนื่องจากมันไม่ได้อธิบายมากอย่างชัดเจนในเอกสารที่ผมจะตอบคำถามนี้โดยจะผ่านsourcecode ของ 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;
}
แฟล็กที่เกิดขึ้นครั้งต่อไปคือการนำไปใช้งานจริงซึ่งคุณจะพบลูปที่ผ่าน RewriteConditions ทั้งหมดที่ RewriteRule มีอยู่และสิ่งที่ทำโดยทั่วไปคือ (ขีดฆ่าความคิดเห็นที่เพิ่มเพื่อความชัดเจน):
# 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 )
มันจะถูกตีความว่าเป็น