ОП віддав перевагу прикладу. Також те, що написав @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
або last
Nginx виконує ту саму роботу (припиняє обробку більше переписаних умов).
- Всередині блоку локації, з
break
, Nginx лише припиняє обробляти більше умови перезапису
- Всередині блоку локації, з
last
, Nginx припиняє обробляти більше умови перезапису, а потім починає шукати нову відповідність location
блоку! Nginx також ігнорує будь-які rewrites
в новому location
блоці!
Заключна примітка:
Я пропустив включити ще кілька кращих справ (насправді загальна проблема з переписувачами, наприклад 500 internal error
). Але це не виходить за межі цього питання. Можливо, приклад 1 теж поза сферою дії!