nginx rewrite 명령 last break 구별

nginx 의 공식 주석 은 다음 과 같 습 니 다.
last
   stops processing the current set of ngx_http_rewrite_module directives followed by a search for a new location matching the changed URI;

break
   stops processing the current set of ngx_http_rewrite_module directives;

 
우 리 는 nginx 운행 이 11 개의 집행 단계 로 나 뉘 는 것 을 알 고 있 습 니 다. 위 에서 언급 한 ngxhttp_rewrite_mode, 그 중의 한 단계 - rewrite 단계 로 이해 할 수 있 습 니 다.
typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,
    NGX_HTTP_SERVER_REWRITE_PHASE,
    NGX_HTTP_FIND_CONFIG_PHASE,
    NGX_HTTP_REWRITE_PHASE,           //rewrite     
    NGX_HTTP_POST_REWRITE_PHASE,
    NGX_HTTP_PREACCESS_PHASE,
    NGX_HTTP_ACCESS_PHASE,
    NGX_HTTP_POST_ACCESS_PHASE,
    NGX_HTTP_TRY_FILES_PHASE,
    NGX_HTTP_CONTENT_PHASE,
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

 
그래서 우 리 는 last 와 break 의 차 이 를 다시 이해 합 니 다. last: 현재 이 요청 을 중단 하고 rewrite 에 맞 는 규칙 에 따라 다시 요청 합 니 다.새 요청 은 첫 번 째 단계 부터 실 행 됩 니 다. break: last 에 비해 break 는 요청 을 다시 시작 하지 않 습 니 다. 현재 rewrite 단 계 를 건 너 뛰 고 이 요청 의 후속 실행 단 계 를 수행 합 니 다.
 
우 리 는 예 를 하나 보 자.
server {
    listen 80 default_server;
    server_name dcshi.com;
    root www;

    location /break/ {
        rewrite ^/break/(.*) /test/$1 break;
        echo "break page";
    } 

    location /last/ {
         rewrite ^/last/(.*) /test/$1 last;
         echo "last page";
    }    

    location /test/ {
       echo "test page";
    }
}

 요청:http://dcshi.com/break/* * 출력: break page 분석: 위 에서 논의 한 바 와 같이 break 는 현재 요청 한 rewrite 단 계 를 뛰 어 넘 고 본 요청 을 계속 수행 하 는 다른 단계 입 니 다. 분명 합 니 다. / foo 에 대응 하 는 content 단계 의 출력 은 echo "break page" 입 니 다.(content 단 계 는 데이터 출력 을 만 드 는 단계 로 간단하게 이해 할 수 있 습 니 다. 예 를 들 어 정적 페이지 로 돌아 가 는 내용 도 content 단계 에 있 습 니 다. echo 명령 도 content 단계 에서 실 행 됩 니 다. 일반적인 상황 에서 content 단 계 는 하나의 출력 명령 만 대응 할 수 있 습 니 다. 마치 하나의 location 에서 두 개의 echo 를 설정 하 는 것 처럼 최종 적 으로 하나의 echo 명령 만 실 행 됩 니 다)물론 / break / 에 있 는 echo 명령 을 주석 한 다음 에 다시 방문 / break / xx 는 404 를 보고 합 니 다. 이것 은 우리 가 예상 한 것 과 같 습 니 다. 비록 / break / xx 는 / test / xx 로 바 뀌 었 지만 break 명령 은 새로운 요청 을 다시 시작 하지 않 고 계속 일치 하기 때문에 nginx 는 아래 의 / test / 이 location 에 일치 하지 않 습 니 다.echo 명령 이 주석 되 어 있 는 상황 에서 / break / 이 location 에 서 는 nginx 의 기본 content 명령 만 실행 할 수 있 습 니 다. 즉, / test / xx 라 는 html 페이지 를 찾 아 내용 을 출력 하려 고 합 니 다. 사실 이 페이지 는 존재 하지 않 기 때문에 404 의 오 류 를 보고 할 수 있 습 니 다.
 
요청: http://dcshi.com/last/* * 출력: test page 분석: last 와 break 의 가장 큰 차이 점 은 last 가 새로운 요청 을 다시 시작 하고 location 과 다시 일치 하기 때문에 / last 에 대해 서 는 요청 을 다시 일치 시 킨 후에 / test / 와 일치 하기 때문에 최종 적 으로 대응 하 는 content 단계 의 출력 은 test page 입 니 다.
 
nginx 의 운행 단계 에 대해 대략적인 이 해 를 가지 고 있다 고 가정 하면 last 와 break 를 이해 하 는 데 문제 가 없습니다.
location ~ ^/testtest/ {
default_type text/html;
echo 111;
}
rewrite ^/testtest/  /test.php last;
/ testest / 에 접근 할 때 출력 값 은 / test. php 의 내용 입 니 다. 분명히 rewrite 에 다시 썼 습 니 다. rewrite 와 location 위 치 를 교환 하고 실행 결과 가 변 하지 않 습 니 다. 이것 은 위치 와 무관 하 다 는 것 을 설명 합 니 다.

좋은 웹페이지 즐겨찾기