나는 break와 last의 차이점을 이해하지 못한다. 문서가 다소 모호합니다. 일부 구성에서 두 구성을 전환하려고 시도했지만 동작의 차이점을 발견하지 못했습니다. 누군가이 플래그를 더 자세히 설명 할 수 있습니까? 바람직하게는, 하나의 플래그를 다른 플래그로 플립 할 때 상이한 행동을 나타내는 예가있다.
나는 break와 last의 차이점을 이해하지 못한다. 문서가 다소 모호합니다. 일부 구성에서 두 구성을 전환하려고 시도했지만 동작의 차이점을 발견하지 못했습니다. 누군가이 플래그를 더 자세히 설명 할 수 있습니까? 바람직하게는, 하나의 플래그를 다른 플래그로 플립 할 때 상이한 행동을 나타내는 예가있다.
답변:
위치마다 다른 재 작성 규칙 세트가있을 수 있습니다. 다시 쓰기 모듈이 충족되면 last
현재 세트 처리를 중지하고 다시 작성된 요청이 다시 한 번 전달되어 적절한 위치 (및 새로운 다시 쓰기 규칙 세트)를 찾습니다. 규칙이로 끝나면 break
다시 쓰기도 중지되지만 다시 작성된 요청은 다른 위치로 전달되지 않습니다.
즉, loc1과 loc2의 두 위치가 있고 loc1에 loc1을 loc2로 변경하고로 끝나는 다시 쓰기 규칙이 있으면 last
요청이 다시 작성되어 위치 loc2로 전달됩니다. 규칙이로 끝나는 경우 break
위치 loc1에 속합니다.
OP는 예를 선호했습니다. 또한 @minaev가 쓴 것은 이야기의 일부일뿐입니다! 자, 우리는 간다 ...
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
플래그는 선택 사항입니다!
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
정확한 방식으로 행동 ...
location
일치 검색).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
플래그는 다음을 수행합니다.
location
블록을 계속 구문 분석합니다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
플래그는 다음을 수행합니다.
rewrite
.rewrite
플래그로 조건 break
또는 last
일치, Nginx에 더 이상 구문 분석을 중지 rewrites
!break
또는 로 위치 블록 외부 last
에서 Nginx는 동일한 작업을 수행합니다 (더 이상 재 작성 조건 처리 중지).break
에서 Nginx는 더 이상 다시 쓰기 조건 처리를 중지합니다.last
에서 Nginx는 더 이상 재 작성 조건 처리를 중지 하고 새로운 블록 일치 를 찾기 시작합니다location
! Nginx는 rewrites
새로운 location
블록 에서도 무시합니다 !더 많은 경우를 포함시키지 못했습니다 (실제로 재 작성과 같은 일반적인 문제 500 internal error
). 그러나 그것은이 질문의 범위를 벗어났습니다. 아마도 예제 1도 범위를 벗어났습니다!