OP thích một ví dụ. Ngoài ra, những gì @minaev viết, chỉ là một phần của câu chuyện! Vì vậy, ở đây chúng tôi đi ...
Ví dụ 1: Không có cờ (ngắt hoặc cuối)
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;
}
Kết quả:
# curl example.com/test.txt
finally matched location /documents
Giải trình:
Đối với rewrite
, các cờ là tùy chọn!
Ví dụ 2: Khối vị trí bên ngoài (ngắt hoặc cuối)
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
}
Kết quả:
# curl example.com/test.txt
finally matched location /notes
Giải trình:
Bên ngoài khối vị trí, cả hai break
và last
cư xử theo cách chính xác ...
- không phân tích cú pháp các điều kiện viết lại
- Công cụ nội bộ Nginx chuyển sang giai đoạn tiếp theo (tìm kiếm
location
kết quả khớp)
Ví dụ 3: Khối vị trí bên trong - "phá vỡ"
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';
}
}
Kết quả:
# curl example.com/test.txt
finally matched location /
Giải trình:
Trong một khối vị trí, break
cờ sẽ làm như sau ...
- không phân tích cú pháp các điều kiện viết lại
- Động cơ nội bộ Nginx tiếp tục phân tích
location
khối hiện tại
Ví dụ 4: Khối vị trí bên trong - "cuối cùng"
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';
}
}
Kết quả:
# curl example.com/test.txt
finally matched location /notes
Giải trình:
Trong một khối vị trí, last
cờ sẽ làm như sau ...
- không phân tích cú pháp các điều kiện viết lại
- Công cụ nội bộ Nginx bắt đầu tìm kiếm một vị trí phù hợp khác dựa trên kết quả của
rewrite
kết quả.
- không phân tích cú pháp các điều kiện viết lại, ngay cả trên vị trí phù hợp tiếp theo!
Tóm lược:
- Khi một
rewrite
điều kiện với cờ break
hoặc last
khớp, Nginx ngừng phân tích cú pháp nữa rewrites
!
- Bên ngoài một khối vị trí, với
break
hoặc last
, Nginx thực hiện cùng một công việc (dừng xử lý các điều kiện viết lại nữa).
- Bên trong một khối vị trí, với
break
, Nginx chỉ dừng xử lý các điều kiện ghi lại nữa
- Bên trong một khối vị trí, với
last
, Nginx dừng xử lý lại các điều kiện viết lại và sau đó bắt đầu tìm kiếm một location
khối khớp mới ! Nginx cũng bỏ qua bất kỳ rewrites
trong location
khối mới !
Lưu ý cuối cùng:
Tôi đã bỏ lỡ để bao gồm một số trường hợp cạnh hơn (thực sự vấn đề phổ biến với viết lại, chẳng hạn như 500 internal error
). Nhưng, điều đó nằm ngoài phạm vi của câu hỏi này. Có lẽ, ví dụ 1 cũng nằm ngoài phạm vi!