Czy to jest jak używać AND, OR dla RewriteCond
na Apache?
rewritecond A [or]
rewritecond B
rewritecond C [or]
rewritecond D
RewriteRule ... something
staje się if ( (A or B) and (C or D) ) rewrite_it
.
Więc wygląda na to, że „OR” ma wyższy priorytet niż „AND”? Czy jest sposób, aby łatwo to stwierdzić, jak w (A or B) and (C or D)
składni?
mod-rewrite
apache-config
brak biegunowości
źródło
źródło
Odpowiedzi:
Jest to interesujące pytanie, a ponieważ nie zostało to wyjaśnione w dokumentacji, odpowiem na nie, przechodząc przez kod źródłowy mod_rewrite ; demonstrując dużą korzyść z open-source .
W górnej sekcji szybko zauważysz definicje używane do nazwania tych flag :
a wyszukanie CONDFLAG_ORNEXT potwierdza, że jest ono używane na podstawie istnienia flagi [OR] :
Następnym wystąpieniem flagi jest rzeczywista implementacja, w której znajdziesz pętlę, która przechodzi przez wszystkie RewriteConditions, które ma RewriteRule, i to, co w zasadzie robi (pozbawione, komentarze dodane dla przejrzystości):
Powinieneś być w stanie to zinterpretować; oznacza to, że OR ma wyższy priorytet, a twój przykład rzeczywiście do tego prowadzi
if ( (A OR B) AND (C OR D) )
. Jeśli chciałbyś, na przykład, mieć te Warunki:zostanie zinterpretowany jako
if ( (A OR B OR C) and D )
.źródło
Po wielu zmaganiach i uzyskaniu ogólnego, elastycznego i bardziej czytelnego rozwiązania, w moim przypadku zapisałem wyniki OR w zmiennych ENV i wykonałem operacje AND tych zmiennych.
Wymagania :
źródło