Đây là một câu hỏi thú vị và vì nó không được giải thích rõ ràng trong tài liệu nên tôi sẽ trả lời điều này bằng cách xem qua mã nguồn của mod_rewrite ; thể hiện lợi ích lớn của mã nguồn mở .
Trong phần trên cùng, bạn sẽ nhanh chóng phát hiện ra các định nghĩa được sử dụng để đặt tên cho các cờ này :
#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
và tìm kiếm CONDFLAG_ORNEXT xác nhận rằng nó được sử dụng dựa trên sự tồn tại của cờ [OR] :
else if ( strcasecmp(key, "ornext") == 0
|| strcasecmp(key, "OR") == 0 ) {
cfg->flags |= CONDFLAG_ORNEXT;
}
Lần xuất hiện tiếp theo của cờ là quá trình triển khai thực tế , nơi bạn sẽ tìm thấy vòng lặp đi qua tất cả các Điều kiện của RewriteRule mà RewriteRule có và về cơ bản nó làm được gì (bị loại bỏ, nhận xét được thêm vào để làm rõ):
# 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;
}
}
Bạn sẽ có thể giải thích điều này; nó có nghĩa là OR có mức độ ưu tiên cao hơn và ví dụ của bạn thực sự dẫn đến if ( (A OR B) AND (C OR D) )
. Ví dụ: nếu bạn sẽ có các Điều kiện sau:
RewriteCond A [or]
RewriteCond B [or]
RewriteCond C
RewriteCond D
nó sẽ được hiểu là if ( (A OR B OR C) and D )
.