ОП предпочел пример. Кроме того, то, что написал @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: Внутренний блок локации - "break"
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 тоже выходит за рамки!