나는 break와 last의 차이점을 이해하지 못한다. 문서가 다소 모호합니다. 일부 구성에서 두 구성을 전환하려고 시도했지만 동작의 차이점을 발견하지 못했습니다. 누군가이 플래그를 더 자세히 설명 할 수 있습니까? 바람직하게는, 하나의 플래그를 다른 플래그로 플립 할 때 상이한 행동을 나타내는 예가있다.
답변
위치마다 다른 재 작성 규칙 세트가있을 수 있습니다. 다시 쓰기 모듈이 충족되면 last
현재 세트 처리를 중지하고 다시 작성된 요청이 다시 한 번 전달되어 적절한 위치 (및 새로운 다시 쓰기 규칙 세트)를 찾습니다. 규칙이로 끝나면 break
다시 쓰기도 중지되지만 다시 작성된 요청은 다른 위치로 전달되지 않습니다.
즉, loc1과 loc2의 두 위치가 있고 loc1에 loc1을 loc2로 변경하고로 끝나는 다시 쓰기 규칙이 있으면 last
요청이 다시 작성되어 위치 loc2로 전달됩니다. 규칙이로 끝나는 경우 break
위치 loc1에 속합니다.
답변
OP는 예를 선호했습니다. 또한 @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도 범위를 벗어났습니다!