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

나는 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

설명:

위치 블록, 모두 외부 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도 범위를 벗어났습니다!


답변