OP wolał przykład. To, co napisał @minaev, było tylko częścią historii! Więc zaczynamy...
Przykład 1: Brak flag (przerwa lub ostatnia)
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1;
rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}
Wynik:
# curl example.com/test.txt
finally matched location /documents
Wyjaśnienie:
Ponieważ rewrite
flagi są opcjonalne!
Przykład 2: Zewnętrzny blok lokalizacji (przerwa lub ostatni)
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1 break; # or last
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
Wynik:
# curl example.com/test.txt
finally matched location /notes
Wyjaśnienie:
Poza bloku lokalizacja, zarówno break
i last
zachowują się dokładnie w sposób ...
- koniec analizowania warunków ponownego zapisu
- Wewnętrzny silnik Nginx przechodzi do następnej fazy (szukanie
location
dopasowania)
Przykład 3: Wewnętrzny blok lokalizacji - „przerwa”
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 break;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
}
Wynik:
# curl example.com/test.txt
finally matched location /
Wyjaśnienie:
Wewnątrz bloku lokalizacji break
flaga wykona następujące czynności ...
- koniec analizowania warunków ponownego zapisu
- Wewnętrzny silnik Nginx kontynuuje analizowanie bieżącego
location
bloku
Przykład 4: Wewnętrzny blok lokalizacji - „ostatni”
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 last;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed, either!
}
location /documents {
echo 'finally matched location /documents';
}
}
Wynik:
# curl example.com/test.txt
finally matched location /notes
Wyjaśnienie:
Wewnątrz bloku lokalizacji last
flaga wykona następujące czynności ...
- koniec analizowania warunków ponownego zapisu
- Silnik wewnętrzny Nginx zaczyna szukać innego dopasowania lokalizacji na podstawie wyniku
rewrite
wyniku.
- koniec analizy warunków zapisu, nawet przy następnym dopasowaniu lokalizacji!
Podsumowanie:
- Kiedy
rewrite
warunek z flagą break
lub last
dopasowaniami, Nginx przestaje się parsować rewrites
!
- Poza blokiem lokalizacji, przy pomocy
break
lub last
, Nginx wykonuje to samo zadanie (przestaje przetwarzać warunki ponownego zapisu).
- Wewnątrz bloku lokalizacji
break
, Nginx przestaje przetwarzać już tylko warunki przepisywania
- Wewnątrz bloku lokalizacji
last
Nginx przestaje przetwarzać warunki ponownego zapisu, a następnie zaczyna szukać nowego dopasowania location
bloku! Nginx ignoruje również dowolne rewrites
w nowym location
bloku!
Uwaga końcowa:
Brakowało mi, aby dołączyć więcej przypadków krawędzi (w rzeczywistości częsty problem z przepisywaniem, np. 500 internal error
). Ale to byłoby poza zakresem tego pytania. Prawdopodobnie przykład 1 również jest poza zakresem!