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ż rewriteflagi 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 breaki lastzachowują się dokładnie w sposób ...
- koniec analizowania warunków ponownego zapisu
- Wewnętrzny silnik Nginx przechodzi do następnej fazy (szukanie
locationdopasowania)
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 breakflaga wykona następujące czynności ...
- koniec analizowania warunków ponownego zapisu
- Wewnętrzny silnik Nginx kontynuuje analizowanie bieżącego
locationbloku
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 lastflaga wykona następujące czynności ...
- koniec analizowania warunków ponownego zapisu
- Silnik wewnętrzny Nginx zaczyna szukać innego dopasowania lokalizacji na podstawie wyniku
rewritewyniku.
- koniec analizy warunków zapisu, nawet przy następnym dopasowaniu lokalizacji!
Podsumowanie:
- Kiedy
rewritewarunek z flagą breaklub lastdopasowaniami, Nginx przestaje się parsować rewrites!
- Poza blokiem lokalizacji, przy pomocy
breaklub 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
lastNginx przestaje przetwarzać warunki ponownego zapisu, a następnie zaczyna szukać nowego dopasowania locationbloku! Nginx ignoruje również dowolne rewritesw nowym locationbloku!
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!