Nginx 노트 의 Rewrite 규칙

Nginx 에서 Rewrite 규칙 은 주로 URL 의 재 작성 을 실현 하 는 데 사 용 됩 니 다.Rewrite 규칙 을 통 해 규범 화 된 URL 을 실현 하고 변수 에 따라 URL 방향 을 바 꾸 고 설정 을 선택 할 수 있 습 니 다.
Rewrite 규칙 관련 명령
  • break
  • if
  • return
  • rewrite
  • set

  • break 명령
    break 의 역할 은 현재 규칙 집합 을 완성 하고 rewrite 명령 을 처리 하지 않 습 니 다.
    if ($slow)
    {
        limit_rate 10k;
        break;
    }

    if 명령
    if 조건 판단, 조건 이 일치 하 는 지 판단 하고 코드 세그먼트 내 명령 을 실행 합 니 다.Nginx 내 if 명령 은 내장 되 어 있 지 않 으 며, 여러 조건 으로 처리 되 는 것 도 지원 되 지 않 습 니 다 (& & 또는 | |)
    if 명령 은 Rewrite 규칙 에서 많이 사용 되 는 명령 으로 많은 정 보 를 if 의 조건 으로 판단 할 수 있 습 니 다.크게 다음 과 같은 몇 가지 로 나 뉜 다.
  • 변수 이름 이 비어 있 는 지 여부
  • 변수 비교: =,! =
  • 정규 일치
  • 모호 일치 ~ *
  • 완전 일치 ~
  • 일치 하지 않 음
  • 완전 일치 하지 않 습 니 다! ~
  • 모호 하지 않 게 일치 합 니 다! ~ *


  • 파일 존재 여부 - f |! -f
  • 디 렉 터 리 존재 여부 - d |! -d
  • 파일 이나 디 렉 터 리 가 존재 하 는 지 - e |! -e
  • 파일 실행 가능 여부 - x |! -x

  • 예 를 들 면:
    if ($http_user_agent ~ MSIE)
    {
        rewrite ^(.*)$ /msie/$1 break;
    }
    if ($http_cookie ~* "id=([^;] +)(?:;|$)")
    {
        set $id $1;
    }
    if ($request_method = POST)
    {
        return 405;
    }
    if (!-f $request_filename)
    {
        break;
        proxy_pass http://127.0.0.1;
    }
    if ($slow)
    {
        limit_rate 10k;
    }
    if ($invalid_referer)
    {
        return 403;
    }
    if ($args ^~ post=140)
    {
        rewrite ^ http://example.com/ permanent;
    }

    return 명령
    return 명령 은 규칙 의 실행 을 끝내 고 상태 코드 정 보 를 클 라 이언 트 에 게 되 돌려 줍 니 다.자주 사용 할 수 있 는 상태 코드 는 다음 과 같 습 니 다.
  • 403 Forbidden, 서버 실행 거부
  • 404 Not Found, 요청 한 자원 은 찾기
  • 500 Internet Server Error, 서버 에 오류 가 발생 하여 요청 처 리 를 완료 할 수 없습니다 (서버 에 자주 나타 나 는 프로그램 코드 에 오류 가 발생 했 을 때)
  • 502 Bad Gateway, 게 이 트 웨 이 또는 대리 무효
  • 503 Service Unabailable, 서버 가 임시로 유지보수 또는 과부하 로 인해 요청 을 처리 할 수 없습니다
  • 504 Gateway Timeout 은 게 이 트 웨 이 나 프 록 시 서버 로 요청 을 처리 할 때 상위 서버 에서 응답 을 받 지 못 했 습 니 다.

  • rewrite (핵심)
    rewrite 규칙 의 핵심 명령 으로서 rewrite 명령 은 표현 식 에 따라 URI 를 바 꾸 거나 문자열 을 수정 합 니 다.설정 파일 에 있 는 순서대로 명령 을 실행 합 니 다.
    표현 식 을 다시 쓰 는 것 이 상대 경로 에 유효 합 니 다.호스트 이름 과 일치 하려 면 if 명령 을 설정 해 야 합 니 다.
    rewrite 문법: rewrite regex replacement flagrewrite 명령 이 지원 하 는 flag:
  • last 가 rewrite 를 완 료 했 습 니 다. apache 의 [L] 태그 와 유사 합 니 다
  • break 본 규칙 이 일치 한 후 매 칭 을 종료 하고 후속 규칙 이 일치 하지 않 습 니 다
  • redirect 반환 상태 코드 302, 임시 적 인 재 설정
  • permanent 반환 상태 코드 301, 영구 리 셋
  • last 와 break 는 URI 재 작성 을 실현 하 는 데 사 용 됩 니 다. 브 라 우 저 에 표 시 된 URI 주 소 는 변 하지 않 지만 서버 측 이 방문 하 는 경로 가 변 했 습 니 다.redirect 와 permanent 는 URI 점프 를 실현 하 는 데 사 용 됩 니 다. 브 라 우 저 는 점프 후의 URI 주 소 를 표시 합 니 다.
    last 는 이 rewrite 규칙 이 실 행 된 후에 다시 블록 내 에서 요청 을 합 니 다. break 는 이 규칙 이 일치 한 후에 매 칭 을 종료 합 니 다. 따라서 last 는 어떤 경우 에 잘못 사용 하면 사 순환 을 초래 할 수 있 습 니 다.일반적으로 루트 location 이나 server 탭 에 rewrite 규칙 을 직접 작성 합 니 다. last 를 사용 하 는 것 을 추천 합 니 다.비 루트 location 에서 break 를 사용 합 니 다.예 를 들 면:
    #   location / {...}   ,          ,  location
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$1.mp3 last;
    return 403;
    
    location 、download/ {
        rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$1.mp3 break;
        return 403;
    }

    만약 교 체 된 URI 에 인자 (예: / app / test. php? id = 5) 가 포함 되 어 있다 면, 기본 매개 변 수 는 자동 으로 교 체 된 문자열 에 추 가 됩 니 다. 우 리 는 교 체 된 문자열 의 끝 에 추가 할 수 있 습 니까?이 문 제 를 해결 하 겠 습 니 다.
    rewrite ^/user/(.*)$ /show?user=$1? last;
    
    #     ?
    # rewrite ^/test(.*)$ http://www.aaa.com/home permanent;
    #     http://www.aaa.com/test?id=5,      http://www.aaa.com/home?id=5
    
    #    ?
    # rewrite ^/test(.*)$ http://www.aaa.com/home? permanent;
    #     http://www.aaa.com/test?id=5,      http://www.aaa.com/home

    set 명령
    set 명령 은 변 수 를 정의 하 는 데 사용 되 며 변 수 를 할당 할 수 있 습 니 다.if 에 맞 추 면 여러 조건 을 실현 할 수 있 습 니 다.예컨대
    if ($host ~* ^(.*?)\.aaa\.com$)
    {
        set $var_test '1';
    }
    if ($host ~* ^localhost)
    {
        set $var_test '1';
    }
    if ($var_test !~ '1')
    {
        rewrite ^/(.*)$ http://www.aaa.com/ redirect;
    }

    Nginx 와 아파 치 의 Rewrite 규칙 인 스 턴 스 비교
    일반적으로 간단 한 nginx 와 apache 의 rewrite 규칙 은 차이 가 크 지 않 고 작은 복구 만 이 호 환 을 실현 할 수 있 습 니 다.
    아파 치 재 작성 규칙:
    RewriteRule ^/(.*)$ http://www.aaa.com/$1 [L]

    Nginx Rewrite 규칙:
    rewrite ^/(.*)$ http://www.aaa.com/$1 last;

    양자 의 미세한 차이
  • URL 건 너 뛰 기
  • # nginx
    # nginx       URL    :http://$host
    rewrite ^/(.*)$ http://www.aaa.com/$1/ permanent;
    
    # apache
    RewriteRule ^/(.*)$ /$1/ [R=301,L]
  • 변수 이름
  • # apache    
    ${HTTP_HOST}
    
    # nginx    
    $host

    둘 의 유사 명령
    apache
    nginx
    RewriteCond
    if
    RewriteRule
    rewrite
    [R]
    redirect
    [P]
    last
    [R,L]
    redirect
    [P,L]
    last
    [PT,L]
    last
    본 고 는 책 속 의 어떤 장 에 대한 지식 을 정리 하여 잊 혀 지지 않도록 하 는 독서 노트 이다.

    좋은 웹페이지 즐겨찾기