nginx rewrite 參數和例子

推薦參考地址:
MailinglistARChives官方討論區
http://marc.info/?l=nginx

Nginx常見應用技術指南[NginxTips]
http://bbs.linuxtone.org/thread-1685-1-1.html

本日誌內容來自互聯網和平日使用經驗,整理一下方便日後參考。

正則表達式匹配,其中:

  1. *~爲區分大小寫匹配

  2. *~*爲不區分大小寫匹配

  3. *!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配

文件及目錄匹配,其中:

  1. *-f和!-f用來判斷是否存在文件

  2. *-d和!-d用來判斷是否存在目錄

  3. *-e和!-e用來判斷是否存在文件或目錄

  4. *-x和!-x用來判斷文件是否可執行

flag標記有:

  1. *last相當於Apache裏的[L]標記,表示完成rewrite

  2. *break終止匹配,不再匹配後面的規則

  3. *redirect返回302臨時重定向地址欄會顯示跳轉後的地址

  4. *permanent返回301永久重定向地址欄會顯示跳轉後的地址

一些可用的全局變量有,可以用做條件判斷(待補全)

  1. $args

  2. $content_length

  3. $content_type

  4. $document_root

  5. $document_uri

  6. $host

  7. $http_user_agent

  8. $http_cookie

  9. $limit_rate

  10. $request_body_file

  11. $request_method

  12. $remote_addr

  13. $remote_port

  14. $remote_user

  15. $request_filename

  16. $request_uri

  17. $query_string

  18. $scheme

  19. $server_protocol

  20. $server_addr

  21. $server_name

  22. $server_port

  23. $uri

結合QeePHP的例子

  1. if(!-d$request_filename){

  2. rewrite^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$/index.php?namespace=user&controller=$1&action=$2&$3last;

  3. rewrite^/([a-z-A-Z]+)/?$/index.php?namespace=user&controller=$1last;

  4. break;

多目錄轉成參數
abc.domian.com/sort/2=>abc.domian.com/index.php?act=sort&name=abc&id=2

  1. if($host~*(.*)\.domain\.com){

  2. set$sub_name$1;

  3. rewrite^/sort\/(\d+)\/?$/index.php?act=sort&cid=$sub_name&id=$1last;

  4. }

目錄對換
/123456/xxxx->/xxxx?id=123456

  1. rewrite^/(\d+)/(.+)//$2?id=$1last;

例如下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:

  1. if($http_user_agent~MSIE){

  2. rewrite^(.*)$/nginx-ie/$1break;

  3. }

目錄自動加“/”

  1. if(-d$request_filename){

  2. rewrite^/(.*)([^/])$http://$host/$1$2/permanent;

  3. }

禁止htaccess

  1. location~/\.ht{

  2. denyall;

  3. }

禁止多個目錄

  1. location~^/(cron|templates)/{

  2. denyall;

  3. break;

  4. }

禁止以/data開頭的文件
可以禁止/data/下多級目錄下.log.txt等請求;

  1. location~^/data{

  2. denyall;

  3. }

禁止單個目錄
不能禁止.log.txt能請求

  1. location/searchword/cron/{

  2. denyall;

  3. }

禁止單個文件

  1. location~/data/sql/data.sql{

  2. denyall;

  3. }

給favicon.ico和robots.txt設置過期時間;
這裏爲favicon.ico爲99天,robots.txt爲7天並不記錄404錯誤日誌

  1. location~(favicon.ico){

  2. log_not_foundoff;

  3. expires99d;

  4. break;

  5. }

  6. location~(robots.txt){

  7. log_not_foundoff;

  8. expires7d;

  9. break;

  10. }

設定某個文件的過期時間;這裏爲600秒,並不記錄訪問日誌

  1. location^~/html/scripts/loadhead_1.js{

  2. access_logoff;

  3. root/opt/lampp/htdocs/web;

  4. expires600;

  5. break;

  6. }

文件反盜鏈並設置過期時間
這裏的return412爲自定義的http狀態碼,默認爲403,方便找出正確的盜鏈的請求
“rewrite^/http://leech.c1gstudio.com/leech.gif;”顯示一張防盜鏈圖片
“access_logoff;”不記錄訪問日誌,減輕壓力
“expires3d”所有文件3天的瀏覽器緩存

  1. location~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)${

  2. valid_referersnoneblocked*.c1gstudio.com*.c1gstudio.netlocalhost208.97.167.194;

  3. if($invalid_referer){

  4. rewrite^/http://leech.c1gstudio.com/leech.gif;

  5. return412;

  6. break;

  7. }

  8. access_logoff;

  9. root/opt/lampp/htdocs/web;

  10. expires3d;

  11. break;

  12. }

只充許固定ip訪問網站,並加上密碼

  1. root/opt/htdocs/www;

  2. allow208.97.167.194;

  3. allow222.33.1.2;

  4. allow231.152.49.4;

  5. denyall;

  6. auth_basic"C1G_ADMIN";

  7. auth_basic_user_filehtpasswd;

將多級目錄下的文件轉成一個文件,增強seo效果
/job-123-456-789.html指向/job/123/456/789.html

  1. rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$/job/$1/$2/jobshow_$3.htmllast;

將根目錄下某個文件夾指向2級目錄
如/shanghaijob/指向/area/shanghai/
如果你將last改成permanent,那麼瀏覽器地址欄顯是/location/shanghai/

  1. rewrite^/([0-9a-z]+)job/(.*)$/area/$1/$2last;

上面例子有個問題是訪問/shanghai時將不會匹配

  1. rewrite^/([0-9a-z]+)job$/area/$1/last;

  2. rewrite^/([0-9a-z]+)job/(.*)$/area/$1/$2last;

這樣/shanghai也可以訪問了,但頁面中的相對鏈接無法使用,
如./list_1.html真實地址是/area/shanghia/list_1.html會變成/list_1.html,導至無法訪問。

那我加上自動跳轉也是不行咯
(-d$request_filename)它有個條件是必需爲真實目錄,而我的rewrite不是的,所以沒有效果

  1. if(-d$request_filename){

  2. rewrite^/(.*)([^/])$http://$host/$1$2/permanent;

  3. }

知道原因後就好辦了,讓我手動跳轉吧

  1. rewrite^/([0-9a-z]+)job$/$1job/permanent;

  2. rewrite^/([0-9a-z]+)job/(.*)$/area/$1/$2last;

文件和目錄不存在的時候重定向:

  1. if(!-e$request_filename){

  2. proxy_passhttp://127.0.0.1;

  3. }

域名跳轉

  1. server

  2. {

  3. listen80;

  4. server_namejump.c1gstudio.com;

  5. indexindex.htmlindex.htmindex.php;

  6. root/opt/lampp/htdocs/www;

  7. rewrite^/http://www.c1gstudio.com/;

  8. access_logoff;

  9. }

多域名轉向

  1. server_namewww.c1gstudio.comwww.c1gstudio.net;

  2. indexindex.htmlindex.htmindex.php;

  3. root/opt/lampp/htdocs;

  4. if($host~"c1gstudio\.net"){

  5. rewrite^(.*)http://www.c1gstudio.com$1permanent;

  6. }

三級域名跳轉

  1. if($http_host~*"^(.*)\.i\.c1gstudio\.com$"){

  2. rewrite^(.*)http://top.c1gstudio.com$1;

  3. break;

  4. }

域名鏡向

  1. server

  2. {

  3. listen80;

  4. server_namemirror.c1gstudio.com;

  5. indexindex.htmlindex.htmindex.php;

  6. root/opt/lampp/htdocs/www;

  7. rewrite^/(.*)http://www.c1gstudio.com/$1last;

  8. access_logoff;

  9. }

某個子目錄作鏡向

  1. location^~/zhaopinhui{

  2. rewrite^.+http://zph.c1gstudio.com/last;

  3. break;

  4. }

discuzucenterhome(uchome)rewrite

  1. rewrite^/(space|network)-(.+)\.html$/$1.php?rewrite=$2last;

  2. rewrite^/(space|network)\.html$/$1.phplast;

  3. rewrite^/([0-9]+)$/space.php?uid=$1last;

discuz7rewrite

  1. rewrite^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$$1/archiver/index.php?$2last;

  2. rewrite^(.*)/forum-([0-9]+)-([0-9]+)\.html$$1/forumdisplay.php?fid=$2&page=$3last;

  3. rewrite^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$$1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3last;

  4. rewrite^(.*)/profile-(username|uid)-(.+)\.html$$1/viewpro.php?$2=$3last;

  5. rewrite^(.*)/space-(username|uid)-(.+)\.html$$1/space.php?$2=$3last;

  6. rewrite^(.*)/tag-(.+)\.html$$1/tag.php?name=$2last;

給discuz某版塊單獨配置域名

  1. server_namebbs.c1gstudio.comnews.c1gstudio.com;

  2. location=/{

  3. if($http_host~news\.c1gstudio.com$){

  4. rewrite^.+http://news.c1gstudio.com/forum-831-1.htmllast;

  5. break;

  6. }

  7. }

discuzucenter頭像rewrite優化

  1. location^~/ucenter{

  2. location~.*\.php?$

  3. {

  4. #fastcgi_passunix:/tmp/php-cgi.sock;

  5. fastcgi_pass127.0.0.1:9000;

  6. fastcgi_indexindex.php;

  7. includefcgi.conf;

  8. }

  9. location/ucenter/data/avatar{

  10. log_not_foundoff;

  11. access_logoff;

  12. location~/(.*)_big\.jpg${

  13. error_page404/ucenter/p_w_picpaths/noavatar_big.gif;

  14. }

  15. location~/(.*)_middle\.jpg${

  16. error_page404/ucenter/p_w_picpaths/noavatar_middle.gif;

  17. }

  18. location~/(.*)_small\.jpg${

  19. error_page404/ucenter/p_w_picpaths/noavatar_small.gif;

  20. }

  21. expires300;

  22. break;

  23. }

  24. }

jspacerewrite

  1. location~.*\.php?$

  2. {

  3. #fastcgi_passunix:/tmp/php-cgi.sock;

  4. fastcgi_pass127.0.0.1:9000;

  5. fastcgi_indexindex.php;

  6. includefcgi.conf;

  7. }

  8. location~*^/index.php/

  9. {

  10. rewrite^/index.php/(.*)/index.php?$1break;

  11. fastcgi_pass127.0.0.1:9000;

  12. fastcgi_indexindex.php;

  13. includefcgi.conf;

  14. }

wordpre***ewrite

  1. location/{

  2. indexindex.htmlindex.php;

  3. if(-f$request_filename/index.html){

  4. rewrite(.*)$1/index.htmlbreak;

  5. }

  6. if(-f$request_filename/index.php){

  7. rewrite(.*)$1/index.php;

  8. }

  9. if(!-e$request_filename)

  10. {

  11. rewrite(.*)/index.php;

  12. }

  13. }

2010-1-11更新

discuzx1.5rewrite

  1. rewrite^([^\.]*)/topic-(.+)\.html$$1/portal.php?mod=topic&topic=$2last;

  2. rewrite^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$$1/portal.php?mod=view&aid=$2&page=$3last;

  3. rewrite^([^\.]*)/forum-(\w+)-([0-9]+)\.html$$1/forum.php?mod=forumdisplay&fid=$2&page=$3last;

  4. rewrite^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$$1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3last;

  5. rewrite^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$$1/forum.php?mod=group&fid=$2&page=$3last;

  6. rewrite^([^\.]*)/space-(username|uid)-(.+)\.html$$1/home.php?mod=space&$2=$3last;

  7. rewrite^([^\.]*)/([a-z]+)-(.+)\.html$$1/$2.php?rewrite=$3last;

  8. if(!-e$request_filename){

  9. return404;

  10. }

動態參數rewrite
以discuz7.2到discuzx1.5爲例

  1. if($query_string~*tid=([0-9]+)){

  2. set$id$1;

  3. rewrite"^(.*)/viewthread.php$"$1/forum.php?mod=viewthread&tid=$id&extra=page%3D&page=1last;

  4. }

  5. if($query_string~*gid=([0-9]+)){

  6. set$id$1;

  7. rewrite"^(.*)/index.php$"$1/forum.php?gid=$idlast;

  8. }

  9. rewrite^([^\.]*)/archiver/$$1/forum.php?archiver=1last;

2011-4-21更新

nginx嵌套if
nginx不支持ifand和多層嵌套if,讓我頭痛很久,需要通過其它方法實現.
下面是把訪問鏡像網站cnc.c1gstudio.com的爬蟲轉到www站.

  1. set$needrewrite'';

  2. if($http_user_agent~*(baiduspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)){

  3. set$needrewrite'o';

  4. }

  5. if($host~cnc\.c1gstudio\.com){

  6. set$needrewrite"${needrewrite}k";

  7. }

  8. if($needrewrite=ok){

  9. #return403;

  10. rewrite^(.*)http://www.c1gstudio.com$1permanent;

  11. }

reloadnginx後可以用curl來做測試
curl-I-A“soso”cnc.c1gstudio.com

apache轉nginx規則工具
http://www.ubuntuset.com/apache2nginx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章