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

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