nginx location 및 rewrite 재 설정

10379 단어
location 정규 쓰기
하나의 예시:
location  = / {
  #      / ,             
  [ configuration A ] 
}

location  / {
  #           /   ,              
  #                
  [ configuration B ] 
}

location /documents/ {
  #       /documents/      ,      ,        
  #                 ,          
  [ configuration C ] 
}

location ~ /documents/Abc {
  #       /documents/      ,      ,        
  #                 ,          
  [ configuration CC ] 
}

location ^~ /images/ {
  #       /images/      ,      ,        ,     。
  [ configuration D ] 
}

location ~* \.(gif|jpg|jpeg)$ {
  #       gif,jpg jpeg      
  #   ,     /images/        config D   ,   ^~          
  [ configuration E ] 
}

location /images/ {
  #       /images/,    ,    ^~   
  [ configuration F ] 
}

location /images/abc {
  #         /images/abc,    ,    ^~   
  # F G           
  [ configuration G ] 
}

location ~ /images/abc/ {
  #      config D    :      config G      ,      ,        ,  
    [ configuration H ] 
}

location ~* /js/.*/\.js

  • 이미 = 시작 은 A 에서 루트 디 렉 터 리 의 끝 에 만 일치 하 는 요청 과 정확하게 일치 하 는 것 을 표시 합 니 다. 그 다음 에는 문자열 을 가 져 갈 수 없습니다.
  • ^~ 시작 은 uri 가 일반적인 문자열 로 시작 하 는 것 이지 정규 일치 가 아 닙 니 다
  • ~ 시작 부분 은 대소 문 자 를 구분 하 는 정규 일치 임 을 나타 낸다.
  • ~ * 대소 문 자 를 구분 하지 않 는 정규 일치
  • / 공통 일치, 다른 일치 가 없 으 면 모든 요청 이 일치 합 니 다
  • 순서 no 우선 순위: (location =) > (location 전체 경로) > (location ^ ~ 경로) > (location, * 정규 순서) > (location 부분 시작 경로) > (/)
    위의 일치 결 과 는 위의 location 에 따라 작성 하고 아래 의 일치 예제 가 성립 됩 니 다.
  • / - > config A 가 정확하게 일치 하고 / index. html 도 일치 하지 않 습 니 다
  • / downloads / download. html - > config B 가 B 와 일치 한 후 아래 에 일치 하 는 것 이 없 으 며 B
  • 를 사용 합 니 다.
  • / images / 1. gif - > configuration D 는 F 에 일치 하고, 아래로 D 에 일치 하 며, 아래로 정지
  • / images / abc / def - > config D 는 G 와 가장 길 게 일치 합 니 다. D 와 아래로 일치 합 니 다. 아래로 멈 추 면 D 와 일치 하고 멈 추 는 것 을 볼 수 있 습 니 다. FG 는 여기에 쓰 여 있 는 것 은 아무런 의미 가 없습니다. H 는 영원히 돌아 가지 않 습 니 다. 여 기 는 일치 하 는 순 서 를 설명 하기 위 한 것 입 니 다
  • / documents / document. html - > config C 가 C 에 일치 하고 아래 에 일치 하지 않 으 며 C
  • 를 사용 합 니 다.
  • / documents / 1. jpg - > configuration E 가 C 에 일치 하고 아래 정규 가 E
  • 에 일치 합 니 다.
  • / documents / Abc. jpg - > config CC 는 C 까지 최 장 일치 하 며, 아래 정규 순 서 는 CC 까지 일치 하 며, E 까지 내 려 가지 않 습 니 다
  • 실제 사용 제안
           ,               ,  :
    #       ,              ,         ,     。
    #                ,          
    #        
    location = / {
        proxy_pass http://tomcat:8080/index
    }
    #                 ,  nginx  http      
    #        ,         ,         
    location ^~ /static/ {
        root /webroot/static/;
    }
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    #           ,                
    #               ,        
    #            , .php,.jsp        
    location / {
        proxy_pass http://tomcat:8080/
    }
    
    

    http://tengine.taobao.org/book/chapter_02.html http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
    재 작성 규칙
    rewrite 기능 은 nginx 가 제공 하 는 전역 변수 나 자신 이 설정 한 변 수 를 사용 하여 정규 표현 식 과 표지 위 치 를 결합 하여 url 재 작성 과 재 설정 을 실현 하 는 것 입 니 다.rewrite 는 server {}, location {}, if {} 에 만 놓 을 수 있 고 도 메 인 이름 뒤에 전 달 된 매개 변 수 를 제외 한 문자열 에 만 작용 할 수 있 습 니 다. 예 를 들 어 http://seanlook.com/a/we/index.php?id=1&u=str 는 / a / we / index. php 에 만 다시 쓸 수 있 습 니 다.문법 rewrite regex replacement [flag];도 메 인 이름 이나 매개 변수 문자열 에 대응 하면 전역 변 수 를 사용 할 수도 있 고 proxy 를 사용 할 수도 있 습 니 다.패스 역방향 에이전트.
    rewrite 와 location 기능 이 비슷 하고 모두 점프 를 실현 할 수 있 음 을 나타 낸다. 주요 차이 점 은 rewrite 는 같은 도 메 인 이름 에서 자원 을 얻 는 경 로 를 변경 하 는 것 이 고 location 은 같은 경 로 를 제어 하거나 역방향 대 리 를 할 수 있 으 며 proxy다른 기계 로 패스 하 다.rewrite 도 location 에 쓰 이 는 경우 가 많 습 니 다. 실행 순 서 는:
  • server 블록 의 rewrite 명령 을 실행 합 니 다
  • 실행 위치 일치
  • 선 택 된 location 의 rewrite 명령 을 실행 합 니 다
  • 이 중 한 단계 URI 가 재 작성 되면 실제 존재 하 는 파일 을 찾 을 때 까지 1 - 3 을 다시 반복 합 니 다.10 회 이상 순환 하면 500 내부 서버 오류 로 돌아 갑 니 다.
    플래그 위치
  • last: Apache 에 해당 하 는 [L] 태그, rewrite 완료
  • break: 현재 가상 호스트 의 후속 rewrite 명령 집합 실행 정지
  • redirect: 302 임시 방향 을 되 돌려 주 고 주소 표시 줄 에 점프 후의 주소
  • 가 표 시 됩 니 다.
  • permanent: 301 을 되 돌려 영구적 으로 방향 을 바 꾸 면 주소 표시 줄 에 점프 후의 주소 가 표 시 됩 니 다
  • 301 과 302 는 상태 코드 만 간단하게 되 돌 릴 수 없고 방향 을 바 꾸 는 URL 도 있어 야 하기 때문에 return 명령 이 301, 302 로 돌아 갈 수 없 는 이유 입 니 다.여기 last 와 break 의 차 이 는 이해 하기 어렵다.
  • last 는 보통 server 와 if 에 쓰 이 고 break 는 location 에 사용 합 니 다
  • last 는 재 작성 후의 url 매 칭 을 중지 하지 않 습 니 다. 즉, 새로운 url 은 server 에서 매 칭 절 차 를 한 번 더 걷 고 break 는 재 작성 후의 매 칭 을 중지 합 니 다
  • break 와 last 는 뒤의 rewrite 명령 을 계속 수행 할 수 있 습 니 다
  • if 명령 과 전역 변수
    if 판단 명령 문법 if(condition){...} 으로 주어진 조건 condition 을 판단 합 니 다.만약 사실 이 라면, 대괄호 안에 있 는 rewrite 명령 이 실 행 될 것 입 니 다. if 조건 (conditon) 은 다음 과 같은 내용 일 수 있 습 니 다.
  • 표현 식 이 하나의 변수 일 때 값 이 비어 있 거나 0 으로 시작 하 는 문자열 이 모두 false
  • 로 간 주 됩 니 다.
  • 변수 와 내용 을 직접 비교 할 때 사용 = 또는 !=
  • ~ 정규 표현 식 일치, ~* 대소 문자 의 일치, !~ 대소 문자 의 일치 하지 않 음
  • -f!-f 파일 존재 여 부 를 판단 하 는 데 사용 -d!-d 파일 존재 여 부 를 판단 하 는 데 사용 -e, !-e 파일 실행 여 부 를 판단 하 는 데 사용 -x예 를 들 면:
    if ($http_user_agent ~ MSIE) {
        rewrite ^(.*)$ /msie/$1 break;
    } //  UA  "MSIE",rewrite   /msid/   
    
    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
        set $id $1;
     } //  cookie    ,    $id        
    
    if ($request_method = POST) {
        return 405;
    } //       POST,     405(Method not allowed)。return    301,302
    
    if ($slow) {
        limit_rate 10k;
    } //  ,$slow     set     
    
    if (!-f $request_filename){
        break;
        proxy_pass  http://127.0.0.1; 
    } //           ,      localhost 。   break    rewrite  
    
    if ($args ~ post=140){
        rewrite ^ http://example.com/ permanent;
    } //  query string   "post=140",      example.com
    
    location ~* \.(gif|jpg|png|swf|flv)$ {
        valid_referers none blocked www.jefflei.com www.leizhenfang.com;
        if ($invalid_referer) {
            return 404;
        } //   
    }
    
    

    전역 변수 아래 는 if 로 판단 할 수 있 는 전역 변수 입 니 다.
  • !-x: \ # 이 변 수 는 요청 줄 의 인자 와 같 습 니 다. $args
  • $query_string: 요청 헤더 의 Content - length 필드 입 니 다.
  • $content_length: 요청 헤더 의 Content - Type 필드 입 니 다.
  • $content_type: 현재 루트 명령 에서 지정 한 값 을 요청 합 니 다.
  • $document_root: 호스트 헤드 필드 를 요청 합 니 다. 그렇지 않 으 면 서버 이름 입 니 다.
  • $host: 클 라 이언 트 에이전트 정보
  • $http_user_agent: 클 라 이언 트 쿠키 정보
  • $http_cookie: 이 변 수 는 연결 속 도 를 제한 할 수 있 습 니 다.
  • $limit_rate: 클 라 이언 트 가 요청 한 동작 은 보통 GET 또는 POST 입 니 다.
  • $request_method: 클 라 이언 트 의 IP 주소.
  • $remote_addr: 클 라 이언 트 의 포트.
  • $remote_port: Auth Basic Module 에서 검 증 된 사용자 이름 입 니 다.
  • $remote_user: 현재 요청 한 파일 경 로 는 루트 나 alias 명령 과 URI 요청 으로 생 성 됩 니 다.
  • $request_filename: HTTP 방법 (예: http, https).
  • $scheme: 사용 을 요청 하 는 프로 토 콜 은 보통 HTTP / 1.0 또는 HTTP / 1.1 입 니 다.
  • $server_protocol: 서버 주 소 는 시스템 호출 을 완료 한 후에 이 값 을 확인 할 수 있 습 니 다.
  • $server_addr: 서버 이름.
  • $server_name: 서버 에 도착 할 포트 번 호 를 요청 합 니 다.
  • $server_port: 요청 매개 변 수 를 포함 하 는 원본 URI 입 니 다. 예 를 들 어 "/ foo / bar. php? arg = baz" 와 같은 호스트 이름 은 포함 되 지 않 습 니 다.
  • $request_uri: 요청 인자 가 없 는 현재 URI, $uri 는 호스트 이름 을 포함 하지 않 습 니 다. 예 를 들 어 "/ foo / bar. html".
  • $uri: $uri 와 같 습 니 다.

  • 예: $document_uri $host: localhost $serverport:88 $request_uri:http://localhost:88/test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:/var/www/html $request_filename:/var/www/html/test1/test2/test.php
    정규
  • http://localhost:88/test1/test2/test.php: 줄 바 꿈 자 를 제외 한 임의의 문자 와 일치 합 니 다
  • .: 0 회 또는 1 회 반복
  • ?: 한 번 반복 하거나 여러 번 반복
  • +: 0 회 이상 반복
  • *: 일치 하 는 숫자
  • \d: 일치 하 는 문자열 의 시작
  • ^: 문자열 에 대한 소개
  • $: n 회 반복
  • {n}: n 회 이상 반복
  • {n,}: 단일 문자 c
  • 와 일치 합 니 다.
  • [c]: a - z 소문 자 와 일치 하 는 임의의 하나
  • 소괄호 [a-z] 사이 에 일치 하 는 내용 은 뒤에서 () 를 통 해 인용 할 수 있 으 며, $1 는 앞의 두 번 째 $2 안의 내용 을 나타 낸다.정규 안에 곤 혹 스 러 운 것 은 () 전의 특수 문자 다.
    인 스 턴 스 다시 쓰기
    예 1:
    http {
        #   image    
        log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
        #       
        rewrite_log on;
    
        server {
            root /home/www;
    
            location / {
                    #       
                    error_log logs/rewrite.log notice; 
                    #       ‘’      ,  {}
                    rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
                    #                “last”  ,     set      
                    set $image_file $3;
                    set $image_type $4;
            }
    
            location /data {
                    #            ,          
                    access_log logs/images.log mian;
                    root /data/images;
                    #          。         ,          ,             url 
                    try_files /$arg_file /image404.html;
            }
            location = /image404.html {
                    #             
                    return 404 "image not found
    "; } }

    예 를 들 어 \ 에 대한 요청 은 다시 쓰기 /images/ef/uh7b3/test.png 에 일치 합 니 다. /data?file=test.png 파일 저장 이 존재 하지 않 습 니 다. 존재 하면 정상적으로 응답 합 니 다. 존재 하지 않 으 면 try files 를 새로운 image 404 location 에 다시 쓰 고 404 상태 코드 를 되 돌려 줍 니 다.
    예 2:
    rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
    
    

    예 를 들 어 location /data 파일 요청 을 /data/images/test.png 주소 로 다시 쓰 고 location 과 일치 하 는 것 을 계속 시도 합 니 다.
    전재 하 다https://segmentfault.com/a/1190000002797606

    좋은 웹페이지 즐겨찾기