ОП віддав перевагу прикладу. Також те, що написав @minaev, було лише частиною історії! Отже, ось ми йдемо ...
Приклад 1: Немає (розрив чи останній) прапорів
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;
}
Результат:
# curl example.com/test.txt
finally matched location /documents
Пояснення:
Бо rewriteпрапори необов’язково!
Приклад 2: Блок зовнішнього місцезнаходження (перерва або останній)
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
}
Результат:
# curl example.com/test.txt
finally matched location /notes
Пояснення:
Поза блоком локації обидва breakі lastведуть себе точно ...
- більше немає розбору умов перезапису
- Внутрішній двигун Nginx переходить до наступної фази (пошук
locationвідповідності)
Приклад 3: Блок розташування всередині - "перерва"
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';
}
}
Результат:
# curl example.com/test.txt
finally matched location /
Пояснення:
Всередині блоку розташування breakпрапор робив би таке:
- більше немає розбору умов перезапису
- Внутрішній двигун Nginx продовжує розбирати поточний
locationблок
Приклад 4: Блок розташування всередині - "останній"
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';
}
}
Результат:
# curl example.com/test.txt
finally matched location /notes
Пояснення:
Всередині блоку розташування lastпрапор робив би таке:
- більше немає розбору умов перезапису
- Внутрішній двигун Nginx починає шукати ще одну відповідність місцеположенням на основі результату
rewriteрезультату.
- більше немає розбору умов перезапису навіть у наступному матчі локації!
Підсумок:
- Коли
rewriteумова з прапором breakабо lastзбігається, Nginx перестає аналізувати більше rewrites!
- Поза блоком локації, з
breakабо lastNginx виконує ту саму роботу (припиняє обробку більше переписаних умов).
- Всередині блоку локації, з
break, Nginx лише припиняє обробляти більше умови перезапису
- Всередині блоку локації, з
last, Nginx припиняє обробляти більше умови перезапису, а потім починає шукати нову відповідність locationблоку! Nginx також ігнорує будь-які rewritesв новому locationблоці!
Заключна примітка:
Я пропустив включити ще кілька кращих справ (насправді загальна проблема з переписувачами, наприклад 500 internal error). Але це не виходить за межі цього питання. Можливо, приклад 1 теж поза сферою дії!