Nginx Rewrite规则认识

Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。
++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++
if        指令
规则语法:
[plain]  view plain copy
  1. if ($http_user_agent ~MSIE){  
  2. rewrite ^(.*)$/msie/$1 break;  
  3.  }  
  4.   
  5. if (!-f$request_filename){  
  6.   rewrite ^/img/(.*)$/site/$host/images/$1 last;  
  7.   }  


rewrite 语法规则:
变量名:
    变量名可以使用"="或"!="运算符
     ~  符号表示区分大小写字母匹配
     ~* 符号表示不区分大小写字母匹配
     !~ 和 !~ 与~  !~ 相反
     -f 和 !-f   用来判断文件是否存在
     -d 和 !-d   用来判断目录是否存在
     -e 和 !-e   用来判断文件或目录是否存在
     -x 和 !-x   用来判断文件是否可以执行
      也支持$1到$9位置参数

return指令
示例:,如果访问的URL以.sh .bash 结尾,返回状态码403
[plain]  view plain copy
  1. location ~ .*\.(sh|bash)?$  
  2.  {  
  3.   return 403;  
  4.        }       

     
rewrite指令
[plain]  view plain copy
  1. rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种:  
  2. last :相当于Apache里德(L)标记,表示完成rewrite;  
  3. break;本条规则匹配完成后,终止匹配,不再匹配后面的规则  
  4. redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址  
  5. permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址  
  6. last和break用来实现URL重写,浏览器地址栏URL地址不变  

实例:将访问/b跳转到/bbs目录上去:
[plain]  view plain copy
  1. location /b   {  
  2.     autoindex  on;  
  3.    alias /usr/local/nginx/html/redhat;         
  4.    rewrite ^/b/?$ /bbs permanent;  
  5.   
  6.    }  
  7.   location /bbs {  
  8.      autoindex on;  
  9.   alias /usr/local/nginx/html/bbs;  
  10.   }  

rewrite规则编写实例
1,将原来要访问/b的目录重写为/bbs
     核心语句:
[plain]  view plain copy
  1. rewrite ^/b/?$ /bbs permannet;  


2,根据不同的浏览器将得到不同的结果。
[plain]  view plain copy
  1. if ($http_user_agent ~ Firefox) {  
  2.   rewrite ^(.*)$ /firefox/$1 break;  
  3.   }  
  4.   
  5.   if ($http_user_agent ~ MSIE) {  
  6.     rewrite ^(.*)$ /msie/$1 break;  
  7.    }  
  8.   
  9.  if ($http_user_agent ~ Chrome) {  
  10.       rewrite ^(.*)$ /chrome/$1 break;  
  11.  }   

3.防止盗链:
根据Referer信息防止盗链,代码如下:
[plain]  view plain copy
  1. location ~*\.(gif|jpg|png|swf|flv)${  
  2. valid_referers none blocked www.cheng.com*.test.com;  
  3. if ($invalid_referer)  
  4.  rewrite ^/(.*) http://www.cheng.com/error.html           
  5.   }  

4.实现域名跳转:
[plain]  view plain copy
  1. server {  
  2.          listen       80;  
  3.          server_name  cheng.example.com;  
  4.          write ^(.*)$  http://zhang.example.com/$1 permanent;  
  5.          location / {  
  6.              root   html;  
  7.              index  index.html index.htm;  
  8.          }  

++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++
文件和目录不存在的时候重定向:
if (!-e $request_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 http://www.c1gstudio.com/ http://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 ($http_host ~* "^(.*)\.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; 
}
+++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++

1.先说常用的,从域名跳转到二级目录

  
  
  1. server {  
  2.       server_name bbs.palmdy.com;  
  3.       rewrite ^/(.*) http://www.palmdy.com/bbs/$1 permanent;  

这其实就是301跳转在Nginx中的应用,这里只是加了个二级目录/bbs。

2.从二级目录跳到特定域名:

  
  
  1. rewrite "^.+cto/?(.*)$" http://cto.palmdy.com/$1 permanent;   
  2. break; 

说明下,这里,比如我的网站域名是www.luxiaok.com,如果访问http://www.palmdy.com/cto,那就跳转到http://cto.palmdy.com,当然也可以是其他域名。break可以视情况而加!


++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++

目录对换
/123456/xxxx -> /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
例如下面设定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级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是 /location/shanghai/
rewrite ^/([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)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果
if (-d $request_filename){ 
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
}
知道原因后就好办了,让我手动跳转吧
rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; 
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
文件和目录不存在的时候重定向:
if (!-e $request_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 http://www.c1gstudio.com/ http://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 ($http_host ~* "^(.*)\.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=$2 last; 
rewrite ^/(space|network)\.html$ /$1.php last; 
rewrite ^/([0-9]+)$ /space.php?uid=$1 last;
discuz 7 rewrite
rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last; 
rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last; 
rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\=$4&page=$3 last; 
rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last; 
rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last; 
rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;
给discuz某版块单独配置域名
server_name bbs.c1gstudio.com news.c1gstudio.com; 


location = / { 
if ($http_host ~ 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\.jpg$ { 
error_page 404 /ucenter/images/noavatar_big.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; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值