nginx重写规则 
 nginx rewrite 正则表达式匹配 
 大小写匹配 
 ~ 为区分大小写匹配 
 ~* 为不区分大小写匹配 
 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 
 文件及目录匹配 
 -f和!-f用来判断是否存在文件 
 -d和!-d用来判断是否存在目录 
 -e和!-e用来判断是否存在文件或目录 
 -x和!-x用来判断文件是否可执行 
 flag标记 
 last 相当于Apache里的[L]标记,表示完成rewrite 
 break 终止匹配, 不再匹配后面的规则。 
 redirect 返回302临时重定向 地址栏会显示跳转后的地址。 
 permanent 返回301永久重定向 地址栏会显示跳转后的地址。 
 logcation的几个使用实例: 
 1)location / { }:匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。 
 2)location =/ {}:仅仅匹配/ 
 3)location ~* .(gif|jpg|jpeg){rewrite.(gif|jpg) /logo.png; 
 }:location不区分大小写,匹配任何以gif,jpg,jpeg结尾的文件。 
 几个实例: 
 多目录转成参数 
 要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2 
 规则配置: 
 if (host ~* (.*).domain.com) {  
set $sub_name $1;  
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;  
}  
目录对换  
要求:/123456/xxxx -> /xxxx?id=123456  
规则配置:  
rewrite ^/(\d+)/(.+)/ /2?id=1last;再来一个针对浏览器优化的自动rewrite,这里rewrite后的目录可以是存在的;例如设定nginx在用户使用ie的使用重定向到/nginx−ie目录规则如下:if(http_user_agent ~ MSIE) { 
 rewrite ^(.*)/nginx−ie/1 break; 
 } 
 目录自动加“/” ,这个功能一般浏览器自动完成 
 if (-d requestfilename)rewrite/(.∗)([/])$http://$host/$1$2/permanent;以下这些可能就跟广义的rewrite重写无关了禁止htaccesslocation /.htdenyall;禁止多个目录location /(cron|templates)/denyall;break;禁止以/data开头的文件,可以禁止/data/下多级目录下.log.txt等请求location /datadenyall;禁止单个文件location /data/sql/data.sqldenyall;给favicon.ico和robots.txt设置过期时间;这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志location (favicon.ico)lognotfoundoff;expires99d;break;location (robots.txt)lognotfoundoff;expires7d;break;设定某个文件的浏览器缓存过期时间;这里为600秒,并不记录访问日志location /html/scripts/loadhead1.jsaccesslogoff;expires600;break;Nginx还可以自定义某一类型的文件的保质期时间,具体写法看下文的代码:location ∗.(js|css|jpg|jpeg|gif|png|swf) { 
 if (-f request_filename) {  
expires 1h;  
break;  
}  
}  
//上段代码就将js|css|jpg|jpeg|gif|png|swf这类文件的保质期设置为一小时。  
防盗链的设置:  
防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式,具体代码如下:  
location ~* .(gif|jpg|swf) { 
 valid_referers none blocked start.igrow.cn sta.igrow.cn; 
 if ($invalid_referer) { 
 rewrite ^/ http://$host/logo.png; 
 } 
 } 
 文件反盗链并设置过期时间–<盗链多次请求也会打开你的站点的图片啊,所以设置下缓存时间,不会每次盗链都请求并下载这张图片> 
 location ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 
 valid_referers none blocked .jjonline.cn .jjonline.com.cn .lanwei.org .jjonline.org localhost 42.121.107.189; 
 if ($invalid_referer) { 
 rewrite ^/ http://img.jjonline.cn/forbid.gif; 
 return 417; 
 break; 
 } 
 access_log off; 
 break; 
 } 
 说明: 
 这里的return 417 为自定义的http状态码,默认为403,方便通过nginx的log文件找出正确的盗链的请求地址 
 “rewrite ^/ http://img.jjonline.cn/forbid.gif;”显示一张防盗链图片 
 “access_log off;”不记录访问日志,减轻压力 
 “expires 3d”所有文件3天的浏览器缓存 
 只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行 
 location \ { 
 allow 22.27.164.25; #允许的ipd 
 deny all; 
 auth_basic “KEY”; #认证的一些设置 
 auth_basic_user_file htpasswd; 
 } 
 说明:location的应用也有各种变化,这里的写法就针对了根目录了。 
 文件和目录不存在的时重定向 
 if (!-e $request_filename) {proxy_pass http://127.0.0.1; #这里是跳转到代理ip,这个代理ip上有一个监听的web服务器
rewrite ^/ http://www.jjonline.cn/none.html; #跳转到这个网页去
return 404; #直接返回404码,然后会寻找root指定的404.html文件
} 
 域名跳转 
 server { 
 listen 80; 
 server_name jump.jjonline.cn ;#需要跳转的多级域名 
 index index.html index.htm index.php; #入口索引文件的名字 
 root /var/www/public_html/; #这个站点的根目录 
 rewrite ^/ http://www.jjonline.cn/;rewrite到这个地址,功能表现:在浏览器上输入jump.jjonline.cn并回车,不会有任何提示直接变成www.jjonline.cn
access_log off; 
 } 
 多域名转向 
 server { 
 listen 80; 
 server_name www.jjonline.cn www.jjonline.org; 
 index index.html index.htm index.php; 
 root /var/www/public_html/; 
 if ($host ~ “jjonline.org”) { 
 rewrite ^(.*) http://www.jjonline.cn$1 permanent; 
 } 
 } 
 三级域名跳转 
 if (httphost ∗“(.∗)\.i\.jjonline\.cn”) { 
 rewrite ^(.*) http://demo.jjonline.cn$1; 
 break; 
 } 
 域名镜向 
 server { 
 listen 80; 
 server_name mirror.jjonline.cn; 
 index index.html index.htm index.php; 
 root /var/www/public_html; 
 rewrite ^/(.*) http://www.jjonline.cn/$1 last; 
 access_log off; 
 } 
 某个子目录作镜向,这里的示例是demo子目录 
 location ^~ /demo { 
 rewrite ^.+ http://demo.jjonline.cn/ last; 
 break; 
 } 
 以下在附带本博客的rewrite写法,emlog系统的rewrite 
 location ~ { 
 if (!-e request_filename) {  
rewrite ^/(.+)$ /index.php last;  
}  
}  
今天搞https接入的时候,nginx这边进行https的认证加解密功能,所以后端的nginx和apache都是不需要进行什么变化的,业务 也是如此,但是有一个业务稍微有点不同,其需要根据http接入和https接入的不同来做吐出不同的东东,由于nginx这一层接入来做的ssl相关的 东东,到了后端的apache这里已经是http的了(这样做的目的是为了省事和性能考虑)。这是cgi并不知道转发过来的是http的请求还是 https的请求。  
于是就需要在前端接入nginx这里做一些调整,使得到后端的时候能够判断是否是https的。  
想到的一个简单的方法就是通过rewrite规则,将请求的参数后面增加一个特殊的参数用于表示这是https的请求。  
于是配置转发的规则,在location里面配置了怎么也不行,于是只能在server里面通过if判断来进行配置了。  
if (request_uri ~* ^\/*\/ ) { 
 rewrite ^(.+)1?***https=1 last; 

} 

问题得到了解决,到后端apache的请求都会带上一个特殊的***https的请求参数啦,从而方便了后端的程序来进行判断。 

呵呵,当然也可以通过配置其它的虚拟主机的方式来实现,不过这样的话,就要拷贝一份程序的代码,为https写一份差不多相同的代码,实在麻烦。 

在使用nginx的rewrite的时候,开始加上了querystring发现到了后端的参数是double了的,查阅了一下发现:rewrite语法:rewriteregexreplacementflag默认:none作用域:server,location,ifThisdirectivechangesURIinaccordancewiththeregularexpressionandthereplacementstring.Directivesarecarriedoutinorderofappearanceintheconfigurationfile.这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。BeawarethattherewriteregexonlymatchestherelativepathinsteadoftheabsoluteURL.Ifyouwanttomatchthehostname,youshoulduseanifcondition,likeso:注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。呵呵,rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的,因此,我们只是加上了一个?号和后面我们想要的一个小小的参数∗∗∗https=1就可以了。nginx的rewrite规则参考: 为区分大小写匹配 ∗为不区分大小写匹配! 和! ∗分别为区分大小写不匹配及不区分大小写不匹−f和!−f用来判断是否存在文件−d和!−d用来判断是否存在目录−e和!−e用来判断是否存在文件或目录−x和!−x用来判断文件是否可执行last相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的break终止匹配,不再匹配后面的规则redirect返回302临时重定向地址栏会显示跳转后的地址permanent返回301永久重定向地址栏会显示跳转后的地址args 
contentlengthcontent_type 
documentrootdocument_uri 
hosthttp_user_agent 
httpcookielimit_rate 
requestbodyfilerequest_method 
remoteaddrremote_port 
remoteuserrequest_filename 
requesturiquery_string 
schemeserver_protocol 
serveraddrserver_name 
serverporturi 
 结合QeePHP的例子 
 if (!-d request_filename) {  
rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*) /index.php?namespace=user&controller=1&action=2&3last;rewrite/([a−z−A−Z]+)/? /index.php?namespace=user&controller=1 last;  
break;  
多目录转成参数  
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2  
if (host ~* (.*).domain.com) { 
 set subname1; 
 rewrite ^/sort\/(\d+)\/?/index.php?act=sort&cid=sub_name&id=1 last;  
}  
目录对换  
/123456/xxxx -> /xxxx?id=123456  
rewrite ^/(\d+)/(.+)/ /2?id=1last;例如下面设定nginx在用户使用ie的使用重定向到/nginx−ie目录下:if(http_user_agent ~ MSIE) { 
 rewrite ^(.*)/nginx−ie/1 break; 
 } 
 目录自动加“/” 
 if (-d request_filename){  
rewrite ^/(.*)([^/]) http://host/1$2/ permanent; 
 } 
 禁止htaccess 
 location ~/.ht { 
 deny all; 
 } 
 禁止多个目录 
 location ~ ^/(cron|templates)/ { 
 deny all; 
 break; 
 } 
 禁止以/data开头的文件 
 可以禁止/data/下多级目录下.log.txt等请求; 
 location ~ ^/data { 
 deny all; 
 } 
 禁止单个目录 
 不能禁止.log.txt能请求 
 location /searchword/cron/ { 
 deny all; 
 } 
 禁止单个文件 
 location ~ /data/sql/data.sql { 
 deny all; 
 } 
 给favicon.ico和robots.txt设置过期时间; 
 这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志 
 location ~(favicon.ico) { 
 log_not_found off; 
 expires 99d; 
 break; 
 } 
 location ~(robots.txt) { 
 log_not_found off; 
 expires 7d; 
 break; 
 } 
 设定某个文件的过期时间;这里为600秒,并不记录访问日志 
 location ^~ /html/scripts/loadhead_1.js { 
 access_log off; 
 root /opt/lampp/htdocs/web; 
 expires 600; 
 break; 
 } 
 文件反盗链并设置过期时间 
 这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求 
 “rewrite ^/ http://leech.c1gstudio.com/leech.gif;”显示一张防盗链图片 
 “access_log off;”不记录访问日志,减轻压力 
 “expires 3d”所有文件3天的浏览器缓存 
 location ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 
 valid_referers none blocked .c1gstudio.com .c1gstudio.net localhost 208.97.167.194; 
 if ($invalid_referer) { 
 rewrite ^/ http://leech.c1gstudio.com/leech.gif; 
 return 412; 
 break; 
 } 
 access_log off; 
 root /opt/lampp/htdocs/web; 
 expires 3d; 
 break; 
 } 
 只充许固定ip访问网站,并加上密码 
 root /opt/htdocs/www; 
 allow 208.97.167.194; 
 allow 222.33.1.2; 
 allow 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 
 rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+).html/job/1/2/jobshow_3.html last; 
 将根目录下某个文件夹指向2级目录 
 如/shanghai job/ 指向 /area/shanghai / 
 如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/ 
 rewrite ^/([0-9a-z]+)job/(.*)/area/1/2last;上面例子有个问题是访问/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 requestfilename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果if(−drequest_filename){ 
 rewrite ^/(.*)([^/])http://host/12/ permanent; 

} 

知道原因后就好办了,让我手动跳转吧 

rewrite ^/([0-9a-z]+)job/1job/ permanent; 
 rewrite ^/([0-9a-z]+)job/(.*)/area/1/2last;文件和目录不存在的时候重定向:if(!−erequest_filename) { 
 proxy_pass http://127.0.0.1; 
 } 
 域名跳转 
 server 
 { 
 listen 80; 
 server_name jump.c1gstudio.com; 
 index index.html index.htm index.php; 
 root /opt/lampp/htdocs/www; 
 rewrite ^/ http://www.c1gstudio.com/; 
 access_log off; 
 } 
 多域名转向 
 server_name www.c1gstudio.com www.c1gstudio.net; 
 index index.html index.htm index.php; 
 root /opt/lampp/htdocs; 
 if ($host ~ “c1gstudio.net”) { 
 rewrite ^(.*) http://www.c1gstudio.com$1 permanent; 
 } 
 三级域名跳转 
 if (httphost ∗“(.∗)\.i\.c1gstudio\.com”) { 
 rewrite ^(.*) http://top.yingjiesheng.com$1; 
 break; 
 } 
 域名镜向 
 server 
 { 
 listen 80; 
 server_name mirror.c1gstudio.com; 
 index index.html index.htm index.php; 
 root /opt/lampp/htdocs/www; 
 rewrite ^/(.*) http://www.c1gstudio.com/$1 last; 
 access_log off; 
 } 
 某个子目录作镜向 
 location ^~ /zhaopinhui { 
 rewrite ^.+ http://zph.c1gstudio.com/ last; 
 break; 
 } 
 discuz ucenter home (uchome) rewrite 
 rewrite ^/(space|network)-(.+).html/1.php?rewrite=2last;rewrite/(space|network).html /1.phplast;rewrite/([0−9]+) /space.php?uid=1last;discuz7rewriterewrite(.∗)/archiver/((fid|tid)−[\w−]+.html)1/archiver/index.php?2 last; 
 rewrite ^(.*)/forum-([0-9]+)-([0-9]+).html1/forumdisplay.php?fid=2&page=3 last; 
 rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html1/viewthread.php?tid=2&extra=page\%3D4&page=3last;rewrite(.∗)/profile−(username|uid)−(.+).html1/viewpro.php?2=3last;rewrite(.∗)/space−(username|uid)−(.+).html1/space.php?2=3last;rewrite(.∗)/tag−(.+).html1/tag.php?name=2 last; 
 给discuz某版块单独配置域名 
 server_name bbs.c1gstudio.com news.c1gstudio.com; 
 location = / { 
 if (httphost news\.c1gstudio.com) { 
 rewrite ^.+ http://news.c1gstudio.com/forum-831-1.html last; 
 break; 
 } 
 } 
 discuz ucenter 头像 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; 
 location ~ /(.*)_big.jpgerrorpage404/ucenter/images/noavatarbig.gif;location /(.∗)middle.jpg { 
 error_page 404 /ucenter/images/noavatar_middle.gif; 
 } 
 location ~ /(.*)_small.jpg{  
error_page 404 /ucenter/images/noavatar_small.gif;  
}  
expires 300;  
break;  
}  
}  
jspace rewrite  
location ~ .*.php?
 {fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000; 
 fastcgi_index index.php; 
 include fcgi.conf; 
 } 
 location ~* ^/index.php/ 
 { 
 rewrite ^/index.php/(.*) /index.php?$1 break; 
 fastcgi_pass 127.0.0.1:9000; 
 fastcgi_index index.php; 
 include fcgi.conf; 
 }