Nginx Rewrite 규칙 관련 지침
Nginx Rewrite 규칙 관련 지침에는 if, rewrite, set, return, break 등이 포함되며, 그중 rewrite가 가장 중요한 지침입니다. 간단한 Nginx 재작성 규칙 구문은 다음과 같습니다:
rewrite ^/b/(.*).html /play.php?video=$1 break;
if 문 예는 다음과 같습니다:
if (!-f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
Nginx와 Apache의 재작성 규칙 예시 비교
간단한 Nginx와 Apache 재작성 규칙은 큰 차이가 없으며 기본적으로 완벽하게 호환됩니다. 예:
Apache 재작성 규칙:
RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
RewriteRule ^ / ceshi/$ /zl/ceshi.php [L]
RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [ L]
RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]
Nginx 다시 쓰기 규칙:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
rewrite ^/ceshi/$ /zl/ceshi.php last;
^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 마지막으로 다시 쓰기;
^/pingce([0-9]* 다시 쓰기 ) /$ /zl/pingce.php?id=$1 last;
위의 예에서 볼 수 있듯이 Apache의 Rewrite 규칙은 Nginx의 Rewrite 규칙으로 변경됩니다. 실제로는 매우 간단합니다. Apache의 RewriteRule 지시어는 다음과 같습니다. 재작성 명령에서는 Apache의 [L] 태그가 Nginx의 마지막 태그로 대체되고 중간 내용은 변경되지 않습니다.
Apache의 Rewrite 규칙을 Nginx의 Rewrite 규칙으로 변경한 후 nginx -t 명령을 사용하여 nginx.conf 구성 파일에 구문 오류가 있는지 확인하는 경우 조건에 따옴표를 추가해 볼 수 있습니다. 예를 들어, 다음 Nginx Rewrite 규칙은 구문 오류를 보고합니다.
rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;
추가 따옴표가 정확합니다.
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;
Rewrite 규칙 Apache와 Nginx는 URL 점프 시 미묘한 차이가 있습니다:
Apache 재작성 규칙:
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301 ,L]
Nginx 재작성 규칙:
^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ 재작성 영구;
위의 예에서는 Nginx에서 요구되는 Nginx Rewrite 규칙의 대체 문자열에 "http://$host"가 추가된 것을 확인했습니다.
또한 Apache와 Nginx의 재작성 규칙은 변수 이름도 다릅니다. 예:
Apache 재작성 규칙:
RewriteRule ^/user/login/$ /user/ login.php ?login=1&forward=http://%{HTTP_HOST} [L]
Nginx 재작성 규칙:
^/user/login/$ /user/login.php?login=1&forward 재작성 =http: //$host last;
Apache와 Nginx 재작성 규칙 사이에서 동일하거나 유사한 기능을 가진 일부 명령어와 태그 간의 대응:
Apache의 RewriteCond 명령어는 Nginx의 if 명령어에 해당합니다.
Apache RewriteRule 지시어는 Nginx의 rewrite 지시어에 해당합니다.
Apache의 [R] 표시는 Nginx의 리디렉션 표시에 해당합니다.
Apache의 [P] 표시는 Nginx의 [R,L] 표시에 해당합니다. mark Nginx의 리디렉션 태그에 해당합니다.
Apache의 [P, L] 태그는 Nginx의 마지막 태그에 해당합니다.
Apache의 [PT, L] 태그는 Nginx의 마지막 태그에 해당합니다.
이 사이트를 방문하면 다른 모든 도메인 이름은 http://www.aaa.com
Apache 재작성 규칙:
RewriteCond %{HTTP_HOST} ^(.*?).domain.com$RewriteCond %{HTTP_HOST} !^qita.domain.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index .htm [L]
Nginx의 if 명령은 중첩을 지원하지 않으며 AND 및 OR과 같은 다중 조건 일치도 지원하지 않습니다. Apache의 RewriteCond와 비교하면 다음을 사용할 수 있습니다. 이 예제를 구현하기 위한 페이지 Nginx 구성 작성 방법:
Nginx 다시 쓰기 규칙:
if ($host ~* ^(.*?).domain.com$) set $var_wupin_city $1;
set $var_wupin '1′;
if ($host ~* ^qita.domain.com$)
set $var_wupin '0′;
if (!-f $document_root /market/$var_wupin_city/index.htm)
set $var_wupin '0′;
if ($var_wupin ~ '1′)
다시 쓰기 ^/wu /$ /market/$var_wupin_city/index.htm last;
}
구문 다시 작성
구문:
정규식 대체 플래그 다시 작성
기본값:
없음
범위:
서버, 위치, if
이 지시어는 다음에 따라 URI를 변경합니다. 정규식 및 대체 문자열 지시문은 구성 파일에 나타나는 순서대로 수행됩니다.
이 지시문은 표현식을 기반으로 URI를 변경하거나 문자열을 수정합니다. 명령은 구성 파일의 순서에 따라 실행됩니다.
재작성 정규식은 절대 URL이 아닌 상대 경로에만 일치한다는 점에 유의하세요. 호스트 이름을 일치시키려면 다음과 같이 if 조건을 사용해야 합니다.
재작성 시 참고 사항 표현식은 상대 경로에만 유효합니다. 호스트 이름을 쌍으로 연결하려면 if 문을 사용해야 합니다.
rewrite는 경로 부분만 다시 작성하고 사용자의 입력 매개변수를 변경하지 않습니다. 따라서 여기의 if 규칙에서는 사용자가 브라우저에 입력한 매개변수에 대해 신경 쓸 필요가 없습니다. 다시 작성합니다. 따라서 방금 하나 추가했습니다. 아니요. 그리고 나중에 원하는 작은 매개변수인 ***https=1입니다.
nginx 재작성 규칙 참조:
- ~ 대소문자 구분 일치
- ~* 대소문자 구분 일치
- !~ 및 !~*는 각각 대소문자를 구분하는 불일치이고 대소문자를 구분하지 않는 불일치입니다.
- -f 및 !-f는 파일이 존재하는지 확인하는 데 사용됩니다.
- -d 및 !-d는 디렉토리가 존재하는지 확인하는 데 사용됩니다.
- -e 및 !-e는 파일 또는 디렉토리가 존재하는지 확인하는 데 사용됩니다.
- -x 및 !- x 파일이 실행 가능한지 확인하는 데 사용됩니다
- 마지막은 Apache의 [L] 표시와 동일하며 다시 쓰기가 완료되었음을 나타냅니다. 가장 일반적으로 사용되는
- break는 일치를 종료하고 더 이상 후속 규칙과 일치하지 않습니다.
- redirect는 302 임시 리디렉션을 반환하고 점프 후 주소 표시줄이 표시됩니다.
- permanent return 301 영구 리디렉션되고 주소 표시줄이 표시됩니다. 점프 후 주소
- $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
QeePHP 결합 예시
- if (!-d $request_filename) {
- ^/([a-z-A-Z ]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&c 마지막;
- 다시 쓰기 ^/([a-z-A-Z]+) /?$ /index.php?namespace=user&c last;
- break;
여러 디렉토리를 매개변수로 변환
abc.domian.com/sort /2 => abc .domian.com/index.php?act=sort&name=abc&id=2
- if ($host ~* (.*).domain.com) {
- set $sub_name $1;
- 다시 쓰기 ^/sort/(d+)/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
- }
디렉터리 교환
/123456/xxxx -> /xxxx?id=123456
- 다시 쓰기 ^/(d+)/( .+)/ / $2?id=$1 last;
예를 들어, 다음 설정 nginx는 ie를 사용할 때 사용자를 /nginx-ie 디렉토리로 리디렉션합니다:
- if ($http_user_agent ~ MSIE) {
- 다시 쓰기 ^(.*)$ /nginx-ie/$1 break;
- }
디렉토리는 "/"로 자동 추가됩니다.
- if (-d $request_filename){
- rewrite ^/(.*)([^ /])$ http:// $host/$1$2/ 영구;
- }
htaccess 금지
- 위치 ~/.ht {
- 모두 거부;
- }
다중 디렉토리 허용
- 위치 ~ ^/(cron|templates) / {
- deny all;
- break;
- }
/로 시작하는 파일 비활성화 data
비활성화 가능 /data/;
- 위치 아래의 다중 레벨 디렉토리에 있는 .log.txt와 같은 요청 ~ ^/data {
- 모두 거부 ;
- }
단일 디렉터리 차단
.log.txt 요청을 금지할 수 없음
- 위치 /searchword/ cron/ {
- 모두 거부;
- }
개별 파일 허용 안 함
- 위치 ~ /data /sql/data.sql {
- 모두 거부;
- }
favicon.ico 및 robots.txt의 만료 시간 설정;
favicon.ico의 경우 99일, robots.txt는 7일이며 404 오류 로그를 기록하지 않습니다
- 위치 ~(favicon.ico) {
- log_not_found off;
- 99일 만료;
- break;
- }
- 위치 ~(robots.txt) {
- log_not_found off;
- expires 7d;
- break;
- }
파일; 여기서는 600초이며 기록되지 않습니다. 액세스 로그
- 위치 ^~ /html/scripts/loadhead_1.js {
- access_log off;
- root /opt/lampp/htdocs/web ;
- 600 만료;
- break;
- }
파일 안티 -핫링크 및 만료 시간 설정
여기서 412를 반환하면 사용자 정의 http 상태 코드이고 기본값은 403이며 이는 올바른 핫링크 요청을 찾는 데 편리합니다.
"rewrite ^/ http://leech.divmy.com/ leech.gif;" 안티 핫링크 이미지 표시
"access_log off;" 액세스 로그를 기록하지 않음, 스트레스 감소
"3d 만료" 3일 동안 모든 파일의 브라우저 캐시
- 위치 ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
- valid_referers 차단되지 않음 *.c1gstudio. com *.c1gstudio.net localhost 208.97.167.194;
- if ($invalid_referer) {
- 다시 쓰기 ^/ http://leech.divmy.com/leech.gif;
- return 412;
- break;
- }
- access_log off;
- root /opt/lampp/htdocs/web;
- 3d 만료;
- break;
- }
고정 IP로만 웹사이트 접속을 허용하고 비밀번호를 추가하세요
- root /opt/htdocs/www;
- 208.97.167.194 허용;
- 222.33.1.2 허용;
- 231.152.49.4 허용;
- deny all;
- auth_basic “C1G_ADMIN”;
- auth_basic_user_file htpasswd;
다단계 디렉토리의 파일을 하나의 파일로 변환, SEO 효과 향상
/job-123-456-789.html은 /job/123/456/789.html을 가리킵니다
- 다시 쓰기 ^/job-([0-9]+ ) -([0-9]+)-([0-9]+).html$ /job/$1/$2/jobshow_$3.html last;
루트 디렉터리 변경 다음 폴더는 두 번째 수준 디렉터리
를 가리킵니다. 예를 들어 /shanghaijob/은 /area/shanghai/
를 가리킵니다. 마지막을 영구 폴더로 변경하면 브라우저 주소 표시줄에 /location/shanghai/
가 표시됩니다. 🎜 >
다시 쓰기 ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;-
위 내용 예는 첫 번째 문제는 /shanghai에 액세스할 때
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;와 일치하지 않는다는 것입니다. - rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
-
이런 식으로, /shanghai에도 접근할 수 있지만, 페이지 내 상대 링크는 사용할 수 없습니다.
예를 들어 ./list_1.html의 실제 주소가 /area/shanghia/list_1.html이면 /list_1.html이 됩니다. , 액세스할 수 없게 됩니다.
그러면 자동 점프를 추가하면 작동하지 않습니다
(-d $request_filename) 실제 디렉토리여야 한다는 조건이 있는데 재작성이 아니기 때문에 효과가 없습니다
if (-d $request_filename){- 다시 쓰기 ^/(.*)([^/])$ http://$host/$1$2/ 영구 ;
-
}-
이유를 알고 나면 더 쉬울 것입니다. 수동으로 점프하겠습니다
다시 작성합니다 ^/( [0-9a -z]+)job$ /$1job/ 영구;- 다시 쓰기 ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 마지막 ;
-
파일이나 디렉터리가 존재하지 않는 경우 리디렉션:
if (!-e $request_filename) {- Proxy_pass http:/ /127.0.0.1;
- }
-
도메인 이름 점프
서버- {
-
listen 80;- server_name jump.88dgw.com;
- index index.html index.htm index.php;
- root /opt/ lampp/htdocs/ www;
- 다시 작성 ^/ http://www.88dgw.com/;
- access_log off;
- }
-
다중 도메인 이름 리디렉션
server_name www.7oom.com/ www.divmy.com/;- index index.html index.htm index. php;
- root /opt/lampp/htdocs;
- if ($host ~ “c1gstudio.net”) {
- 다시 쓰기 ^(.*) http:// www.7oom.com$1 / 영구;
- }
-
3단계 도메인 이름 점프
if($http_host ~* “^(.* ).i.c1gstudio.com$”) {- 다시 작성 ^(.*) http://top.88dgw.com$1/;
- break;
- }
-
도메인 이름 미러
서버- {
- 듣기 80 ;
- server_name mirror.c1gstudio.com;
- index index.html index.htm index.php;
- root /opt/lampp/htdocs/www;
-
다시 쓰기 ^/( .*) http://www.divmy.com/$1 last;- access_log off;
- }
-
특정 하위 디렉터리로 미러링
위치 ^~ /zhaopinhui {- 다시 쓰기 ^.+ http://zph.divmy.com/ last;
- break;
- }
-
discuz ucenter home(uchome) rewrite
rewrite ^/(space|network) -(.+).html$ /$1.php?rewrite=$2 마지막;- 다시 쓰기 ^/(space|network).html$ /$1.php 마지막;
- 다시 쓰기 ^/ ([0-9] +)$ /space.php?uid=$1 last;
-
discuz 7 rewrite
- ^(.*)/archiver/((fid|tid)-[w-]+.html)$ $1/archiver/index.php?$2 마지막으로 다시 작성;
- ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3 마지막으로 다시 작성;
- ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/viewthread.php?tid=$2&extra=page 다시 작성 =$4&page=$3 last;
- 다시 쓰기 ^(.*)/profile-(username|uid)-(.+).html$ $1/viewpro.php?$2=$3 last;
- ^(.*)/space-(username|uid)-(.+).html$ $1/space.php?$2=$3 마지막으로 다시 쓰기;
- ^(.*)/tag- 다시 쓰기 (.+).html$ $1/tag.php?name=$2 last;
给discuz某版块单独配置域name
- server_name bbs.c1gstudio.com news.c1gstudio.com;
- location = / {
- if ($http_host ~ news.divmy.com$) {
- rewrite ^.+ http://news.divmy.com/forum-831-1.html last;
- break;
- }
- }
discuz ucenter 头image rewrite 优化
- location ^~ /ucenter {
- location ~ .*.php?$
- {
- #fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fcgi.conf;
- }
- location /ucenter/data/avatar {
- log_not_found off;
- access_log off;
- 위치 ~ /(.*)_big.jpg$ {
- error_page 404 /ucenter/images/noavatar_big.gif;
- }
- 위치 ~ /(.*)_middle.jpg$ {
- error_page 404 /ucenter/images/noavatar_middle.gif;
- }
- 위치 ~ /(.*)_small.jpg$ {
- error_page 404 /ucenter/images/noavatar_small.gif;
- }
- expires 300;
- break ;
- }
- }
jspace rewrite
- 위치 ~ .*.php?$
- {
- #fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fcgi.conf;
- }
- 위치 ~* ^/index.php/
- {
- ^/index.php/(.*) /index.php?$1 break;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
다시 작성 - fcgi.conf 포함;
- }
另외부这里还有一个工具可以直接把apache规则转化为nginx规则
http: //www.anilcetin.com/convert-apache-htaccess-to-nginx/
参考:
http://wiki.nginx.org/NginxChsHttpRewriteModule
http ://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspx
http://www.divmy.com/
以上就介绍了关于Nginx配置文件及ReWriteUrl那点事~,包括了方面的内容,希望对PHP教程有兴趣朋友有所帮助的.