Nginx URL Rewrite – URL 전송 규칙

6296 단어 nginx
Nginx (engine x) 는 Igor Sysoev 가 주도 적 으로 디자인 하고 실현 하 는 고성능 웹 서버 와 메 일 프 록 시 서버 로 현재 웹 서버 시장 에서 앞장 서 는 apache 서버 를 대체 하 는 최 우선 대체 품 이 되 었 다. 점점 더 많은 대형 사이트 의 가입 (큰 방 주: 국내 에는 시 나 닷 컴, 왕 이, 6 개의 방, 콩잎 등 이 있 고 외국 에는 wordpress 등 이 있다)Nginx 의 시장 점유 율 은 안정 적 이 고 빠 른 속도 로 향상 되 고 있다. 이 글 에서 우 리 는 주로 Nginx 의 설정 과 가상 디 렉 터 리 의 설정 에 관심 을 가 질 것 입 니 다.설명: 가상 디 렉 터 리 를 통 해 하나의 독립 IP 를 사용 하여 여러 개의 웹 사 이 트 를 만 들 수 있 습 니 다. 모든 웹 사이트 에는 독립 된. htaccess (Aapache 에 익숙 하 다 고 가정) 파일 과 독립 된 디 렉 터 리 등 이 있 습 니 다.예 를 들 어 워드 프레스 로 만 든 블 로그 사 이 트 를 가 질 수 있 고 MODx 시스템 이나 phpBB 도 가 질 수 있 습 니 다.Nginx 를 사용 하면 htaccess 파일 이 가 져 온 혜택 을 더 이상 누 릴 수 없습니다. htaccess 파일 에 있 는 모든 설정 은 Nginx 프로필 로 옮 겨 야 합 니 다.Nginx 는 URL 퍼 가기 에 제한 이 있 습 니 다. 예 를 들 어 apache 의 rewrite 규칙 을 사용 하 는 것 처럼 같은 URL 에 여러 조건 의 퍼 가기 규칙 을 적용 할 수 없습니다.그러나 Nginx 는 if 문 구 를 지원 합 니 다. 그러면 퍼 가기 규칙 을 if 문 에 쓸 수 있 습 니 다.마찬가지 로 Nginx 의 if 구문 자체 에 도 일정한 제한 이 있 습 니 다. 예 를 들 어 'and' 와 'or' 동작 을 지원 하지 않 고 if 구문 에 if 문 구 를 포함 할 수도 없고 else 문 구 를 포함 할 수도 없습니다.하지만 정규 표현 식 을 사용 할 수 있 습 니 다:
[php] if ($request method! ~ ^ (GET | HEAD) $) {\ # 요청 한 방법 이 GET 나 HEAD 가 아니라면 501 오류 return 501;} [/ php]
주의 하 세 요. if 구문 에서 두 개의 인자 (예 를 들 어 if ($request method! ~ ^ (GET) $| $request method! ~ ^ (HEAD) $) 를 동시에 판단 할 수 없습니다. 하지만 조금 만 생각해 보 세 요. 우 리 는 이러한 부족 함 을 보완 하여 특정한 수 요 를 만족 시 킬 수 있 는 더 좋 은 방법 이 있 습 니 다. 예 를 들 어 매우 흔히 볼 수 있 는 htaccess 정의 퍼 가기 규칙 은 다음 과 같 을 수 있 습 니 다.
[php] RewriteEngine On \ # 리 트 윗 기능 을 시작 합 니 다 RewriteBase / \ # 리 트 윗 의 기본 디 렉 터 리 RewriteCond% {REQUEST FILENAME}! -f \ # 전송 조건, 요청 한 파일 이 RewriteCond% {REQUEST FILENAME} 이 존재 하지 않 는 다 면! -d \ # 퍼 가기 조건, 요청 한 디 렉 터 리 에 RewriteRule 이 존재 하지 않 습 니 다. / index. php [L] \ # 퍼 가기 규칙, 파일 이나 디 렉 터 리 가 존재 하지 않 으 면 index. php 파일 로 퍼 가기 요청 합 니 다. 】 [/php]
위 에서 정의 한 퍼 가기 규칙 은 요청 한 파일 이 존재 하지 않 지만 존재 하 는 디 렉 터 리 가 아니라면 index. php 파일 로 퍼 가기 요청 을 한 다 는 것 입 니 다. 이상 의 퍼 가기 조건 은 대부분의 PHP 시스템 에 적 용 될 수 있 지만 퍼 가기 규칙 은 꼭 그렇지 않 습 니 다. 예 를 들 어 다음 퍼 가기 규칙 은 phpBB 시스템 에서 따 온 것 입 니 다.
[php] RewriteCond% {REQUEST FILENAME}! - f \ # 퍼 가기 조건, 요청 한 파일 에 RewriteCond% {REQUEST FILENAME} 이 존재 하지 않 는 다 면! - d \ # 퍼 가기 조건, 요청 한 디 렉 터 리 에 RewriteCond% {REQUEST FILENAME}! - l \ # 퍼 가기 규칙, 요청 한 파일 이 심 볼 릭 링크 RewriteRule ^ [a - z0 - 9 -] + /? (p ([0 - 9] +). html)? $/ viewforum. php? start = $2 [QSA, L, NC]\ # 퍼 가기 규칙, 정규 표현 식 을 만족 시 키 기 위 한 요청 을 viewforum 에 전달 합 니 다. [/ php]
세 번 째 퍼 가기 조건 을 잠시 무시 하고 심 볼 릭 링크 를 검 사 했 습 니 다. 퍼 가기 조건 은 앞의 예 와 같 지만 퍼 가기 규칙 은 일치 하지 않 습 니 다. 서버 (같은 IP) 에 wordpress 사이트 와 phpBB 사 이 트 를 동시에 만 들 겠 다 고 가정 하면 같은 퍼 가기 조건 을 공용 설정 으로 사용 할 것 입 니 다.
#                                   

[php] if (-e $request_filename) {     break; } [/php]
이 설정 은 이전 리 트 윗 조건 (RewriteCond) 과 같은 일 을 합 니 다. 이 설정 은 이 서버 에 있 는 모든 사이트 에 적 용 됩 니 다. (이 사이트 들 을 같은 서버 에 두 었 다 고 가정 합 니 다) 다음 에 서로 다른 사이트 에 다른 리 트 윗 을 설정 할 수 있 습 니 다. 예 를 들 어 wordpress 사이트:
[php] \ # blog. example. com 에 대한 퍼 가기 규칙 if ($host ~ * ^ blog. example. com $) {\ # host 에 blog. example. com 이 포함 되 어 있 으 면 if 블록 에 있 는 퍼 가기 규칙 rewrite 를 적용 합 니 다.  ^(.*)$  /index.php?q=$1  last; break; } [/php]
이 곳 의 last 는 현재 퍼 가기 규칙 을 적용 하여 후속 규칙 과 일치 하지 않 고 찾 을 수 있 도록 보장 합 니 다. 가상 디 렉 터 리 의 설정 을 설명 하 는 다른 몇 편의 글 도 발 표 했 습 니 다.
가상 디 렉 터 리 를 Ngnix 로 설정 하여 phpBB 를 실행 하 는 방법; Nginx: how to fix directory resolution issue as well as internal re-directs in virtual hosting
가상 디 렉 터 리 를 Ngnix 기반 으로 설정 하 는 방법 이 장 에 대한 소 개 를 끝내기 위해 좀 더 깊이 들 어가 보 겠 습 니 다. '점' 으로 시작 하 는 파일 (예 를 들 어 htaccess) 이 다른 사용자 에 게 접근 하 는 것 을 피 하 는 방법 은 무엇 입 니까? Nginx 설정 파일 에 다음 설정 을 추가 합 니 다.
location ~ /. {
    deny  all;
}

이 세 줄 의 설정 은 서버 의 '점' 으로 시작 하 는 모든 외부 요청 을 거부 합 니 다. WWW 로 시작 하 는 URL 을 WWW 가 포함 되 지 않 은 URL 로 어떻게 전달 합 니까? 예 를 들 어 아래 설정 은 요청 할 수 있 습 니 다.http://www.example.com/yourpage 전달 하 다http://example.com/yourpage:
[php] if ($host ~ * ^ www. (. *)) {\ # 요청 한 host 에 ww (대소 문자 구분 없 음) 가 포함 되 어 있 으 면 확장 번호 에 일치 하 는 항목 을 $1 로 참조 합 니 다.    set $host_without_www $1;     rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains ‘/yourpage’, not ‘www.example.net/yourpage’ } [/php]
설명: 이 예 는 Nginx 공식 사이트 의 문서 에서 나 온 것 입 니 다. Apache HTTPD 퍼 가기 규칙 을 Nginx 로 어떻게 옮 깁 니까? 저쪽 글 에서 몇 가지 관건 적 인 점 을 말 했 습 니 다. 그 중에서 가장 중요 한 것 은 HTTPD 의 퍼 가기 규칙 에서 '/' 로 시작 할 필요 가 없 지만 Nginx 는 '/' 로 시작 해 야 한 다 는 것 입 니 다. ,예 를 들 어 아파 치 의 퍼 가기 규칙 은 다음 과 같 을 수 있다.
[php] RewriteRule ^[a-z0-9_-]*-f([0-9]+)/?(p([0-9]+).html)?$ /viewforum.php?f=$1&start=$3 [QSA,L,NC] [/php]
같은 퍼 가기 규칙 은 Nginx 에서 이렇게 되 었 습 니 다.
[php] rewrite ^/[a-z0-9_-]*-f([0-9]+)/?(p([0-9]+).html)?$ /viewforum.php?f=$1&start=$3 last; [/php]
쉽 죠?
메모: 아파 치 의 전송 조건 은 Nginx 의 if 문 구 를 사용 해 야 합 니 다.
또 다른 문 제 는 어떻게 Nginx 로 하여 금 사용자 가 그림 이나 정적 자원 에 대한 요 구 를 기록 하지 못 하 게 합 니까? 그림 과 같은 정적 파일 의 클 라 이언 트 캐 시 만 료 시간 을 어떻게 확인 합 니까?
[php] # serve static files directly location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html)$ {     access_log        off;     expires           30d; } [/php]
이상 은 간단 한 소개 일 뿐 입 니 다. 여러분 이 우리 의 포럼 에 문 제 를 제기 하 시 는 것 을 환영 합 니 다.
큰 방 주: 이상 의 내용 은 제 가 번역 한 영어 Nginx URL 로 리 트 윗 한 글 입 니 다. 현재 Nginx 의 사용 범위 가 점점 넓 어 지고 점점 더 많은 사이트 시스템 이 Ngnix 의 품 에 안 기기 시 작 했 지만 Nginx 의 중국어 자료 (심지어 영어 자료 가 부족 합 니 다)비교적 적 습 니 다. 어제 Ngnix 의 URL 리 트 윗 을 설정 하 는 김 에 저녁 에 이 글 을 번역 해 왔 습 니 다. 영어 문 서 를 즐겨 읽 으 시 면 영어 원문 을 보 실 수 있 습 니 다.
큰 방 은 nginx rewrite 의 일부 인 자 를 보충 합 니 다.:
1. 정규 표현 식 일치, 그 중: ~  대소 문 자 를 구분 하기 위해 일치 합 니 다 ~ * 대소 문 자 를 구분 하지 않 기 위해 일치 합 니 다! ~ 와! ~ * 대소 문 자 를 구분 하지 않 고 일치 하지 않 습 니 다. 대소 문 자 를 구분 하지 않 습 니 다. 일치 하지 않 습 니 다.
메모: Nginx 에 {m, n} 과 같은 정규 규칙 이 설정 되 어 있 을 때 조건 에 따옴표 2 를 붙 여야 합 니 다. 파일 과 디 렉 터 리 가 일치 합 니 다. 그 중에서: f 와! - f 는 파일 이 존재 하 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다. - d 는 디 렉 터 리 - e 와! - e 는 파일 이 존재 하 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다.태그, rewrite 가 완료 되 었 음 을 표시 합 니 다. 뒤의 규칙 break 와 last 유사 redirect 가 302 임시 리 셋 permanent 로 301 영구 리 셋 4. 사용 가능 한 전역 변 수 는 조건 으로 판단 할 수 있 습 니 다 (부분). $args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie $limit_rate $request_body_file $request_method $remote_addr $remote_port $remote_user $request_filename $request_uri $query_string $scheme $server_protocol $server_addr $server_name $server_port $uri

좋은 웹페이지 즐겨찾기