এটি একটি আকর্ষণীয় প্রশ্ন এবং যেহেতু ডকুমেন্টেশনে এটি খুব স্পষ্টভাবে ব্যাখ্যা করা হয়নি তবে আমি মোড_উরাইটের উত্সকোডটি দিয়ে এই উত্তর দেব ; মুক্ত-উত্সের একটি বড় সুবিধা প্রদর্শন করে ।
উপরের অংশে আপনি এই পতাকাগুলির নাম দেওয়ার জন্য ব্যবহৃত সংজ্ঞাগুলি দ্রুত খুঁজে পাবেন :
#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 )
।