nginx URL 재 작성 : 중단과 마지막 차이


45

나는 break와 last의 차이점을 이해하지 못한다. 문서가 다소 모호합니다. 일부 구성에서 두 구성을 전환하려고 시도했지만 동작의 차이점을 발견하지 못했습니다. 누군가이 플래그를 더 자세히 설명 할 수 있습니까? 바람직하게는, 하나의 플래그를 다른 플래그로 플립 할 때 상이한 행동을 나타내는 예가있다.


답변을 모르지만 답변을 받으면 wiki.nginx.org를 업데이트하십시오. 또한, 영어 nginx 메일 링리스트는 상당히 활발하며, Igor (주 개발자)는 한 달에 수백 가지 질문에 답변하므로 아마도 거기에서 물어보십시오.
rmalayter

@rmalayter-이 질문은 nginx 메일 링리스트에서 요청되었습니다. 이고르가 대답했지만 그 대답도 나에게 의미가 없었습니다. pubbs.net/nginx/200908/46047

도메인이 인수되면서 pubbs.net 링크가 끊어졌습니다. 죄송합니다. 어디를 가리켜 야하는지 알 수 없었습니다. ; (
Tino

답변:


40

위치마다 다른 재 작성 규칙 세트가있을 수 있습니다. 다시 쓰기 모듈이 충족되면 last현재 세트 처리를 중지하고 다시 작성된 요청이 다시 한 번 전달되어 적절한 위치 (및 새로운 다시 쓰기 규칙 세트)를 찾습니다. 규칙이로 끝나면 break다시 쓰기도 중지되지만 다시 작성된 요청은 다른 위치로 전달되지 않습니다.

즉, loc1과 loc2의 두 위치가 있고 loc1에 loc1을 loc2로 변경하고로 끝나는 다시 쓰기 규칙이 있으면 last요청이 다시 작성되어 위치 loc2로 전달됩니다. 규칙이로 끝나는 경우 break위치 loc1에 속합니다.


다시 쓰기에 중단 플래그가 있으면 일치하는 위치 블록을 검색하지 않으므로 위치 loc1에 속합니다.
Martin Fjordvald

바로 그거죠. 결정된.
minaev

43

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

설명:

위치 블록, 모두 외부 breaklast정확한 방식으로 행동 ...

  • 다시 쓰기 조건을 더 이상 구문 분석하지 않아도됩니다.
  • 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도 범위를 벗어났습니다!


오류 : "오류 코드와 함께 제어 프로세스가 종료되어 nginx.service가 실패했습니다."... 알 수없는 지시어 "echo"
Peter Krauss

nginx.com/resources/wiki/modules/echo . Ubuntu 14.04와 같은 일부 Linux 배포판에서는이 모듈을 특정 패키지 (예 : nginx-extras)에 번들로 제공합니다. 도움이 되길 바랍니다.
Pothi Kalimuthu

1
예 1에서 다시 쓰기 규칙이 세 위치 지시문 모두 위에 놓이면 차이가 있습니까?
Craig Hicks

1
@CraigHicks 아니오, 그렇지 않습니다. 다시 쓰기 규칙이 우선 순위가 높으며 위치가 일치하기 전에 처음에 실행됩니다.
Pothi Kalimuthu

1
이것이 가장 좋은 대답이어야합니다. 이 예제를 참조하고 nginx 문서를 읽으면 이해하기 쉽습니다.
돈 Dilanga
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.