Nginx 설정 location 총화 및 rewrite 규칙 작성

11348 단어 linuxnginx
1. location 정규 표기 법
하나의 예시:
1
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 와 아래로 일치 합 니 다. 멈 추 면 / images / 로 시작 하 는 모든 것 이 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 까지 내 려 가지 않 습 니 다 실제 사용 제안
1
       ,               ,  :
#       ,              ,         ,     。
#                ,          
#        
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
2. 재 작성 규칙
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 내부 서버 오류 로 돌아 갑 니 다.
2.1 flag 표지 위치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 명령 을 계속 수행 할 수 있 습 니 다 2.2 if 명령 과 전역 변수
if 판단 명령 문법 if(condition){...} 으로 주어진 조건 condition 을 판단 합 니 다.만약 사실 이 라면, 대괄호 안에 있 는 rewrite 명령 이 실 행 될 것 입 니 다. if 조건 (conditon) 은 다음 과 같은 내용 일 수 있 습 니 다.
표현 식 이 하나의 변수 일 때 값 이 비어 있 거나 0 으로 시작 하 는 문자열 이 모두 false 로 간 주 됩 니 다.
변수 와 내용 을 직접 비교 할 때 사용 = 또는 != ~ 정규 표현 식 일치, ~* 대소 문자 의 일치, !~ 대소 문자 의 일치 하지 않 음 -f!-f 파일 존재 여 부 를 판단 하 는 데 사용 -d!-d 파일 존재 여 부 를 판단 하 는 데 사용 -e, !-e 파일 실행 여 부 를 판단 하 는 데 사용 -x예 를 들 면:
1
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
2.3 상용 정규http://localhost:88/test1/test2/test.php  : 줄 바 꿈 자 를 제외 한 임의의 문자 일치 .  : 0 회 또는 1 회 반복 ?  : 1 회 이상 반복 +  : 0 회 이상 반복 *  :일치 하 는 숫자 \d  : 일치 하 는 문자열 의 시작 ^  : 문자열 에 대한 소개 $  : n 회 반복 {n}  : n 회 이상 반복 {n,}  : 단일 문자 c 일치 [c]  : a - z 소문 자 와 일치 하 는 임의의 하나 소괄호 [a-z] 사이 에 일치 하 는 내용 은 뒤에서 () 를 통 해 인용 할 수 있 으 며, $1 는 앞의 두 번 째 $2 안의 내용 을 나타 낸다.정규 안에 곤 혹 스 러 운 것 은 () 전의 특수 문자 다.
2.4 인 스 턴 스 재 작성
예 1:
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:
1
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

예 를 들 어 location /data 파일 요청 을 /data/images/test.png 주소 로 다시 쓰 고 location 과 일치 하 는 것 을 계속 시도 합 니 다.
만나다 ssl 부분 페이지 암호 화 。
레 퍼 런 스
http://www.nginx.cn/216.html
http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/
노승 시리즈 nginx 의 rewrite 규칙 빠 른 시작 http://fantefei.blog.51cto.com/2229719/919431
다음으로 이동:http://seanlook.com/2015/05/17/nginx-location-rewrite/

좋은 웹페이지 즐겨찾기