设为首页 收藏本站
查看: 917|回复: 0

[经验分享] Nginx Rewrite

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-9-25 09:12:48 | 显示全部楼层 |阅读模式
Nginx RewriteRewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。
URL(统一资源定义符):
         如:http://www.sina.com/images/hipg
         其中:“http://”:主机协议头
               “www.sina.com”:host
               “……/images/hipg”:文档
Nginx的URL重写是用的比较多的模块之一。常用的URL重写模块有if、rewrite、set、break等。
1:if命令if命令用于判断一个条件,如果条件成立,则执行后面大括号内的语句,相关配置从上级继承。if命令的使用方法如下:

if 语句
应用环境:server,location

语法:
if (condition) { … }

if 可以支持如下条件判断匹配符号
~                                  匹配 (区分大小写)
~*                               匹配  (不区分大小写)
!~              不匹配 (区分大小写)
!~*                    不匹配  (不区分大小写)
-f 和!-f                      用来判断是否存在文件
-d 和!-d               用来判断是否存在目录
-e 和!-e               用来判断是否存在文件或目录
-x 和!-x               用来判断文件是否可执行

在匹配过程中可以引用一些Nginx的全局变量:
$args                                             请求中的参数;
$document_root                        针对当前请求的根路径设置值;
$host                                             请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate                                   对连接速率的限制;
$request_method                      请求的方法,比如"GET"、"POST"等;
$remote_addr                             客户端地址;
$remote_port                             客户端端口号;
$remote_user                             客户端用户名,认证用;
$request_filename                    当前请求的文件路径名(带root指定的路径,即网站的主目录)
$request_uri                                当前请求的文件路径名(不带root指定的路径)
$query_string                              与$args相同;
$scheme                                       所用的协议,比如http或者是https
$server_protocol                        请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr                             服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name                             请求到达的服务器名;
$document_uri                          与$uri一样,URI地址;
$server_port                              请求到达的服务器端口号;

实例:
11     server{
12         listen       192.168.100.110:80;
13         server_name www.aaron.com aaron.com;
14         location / {
15             root   /nginx_root/aaron;
16             index  index.html index.htm;
17         }
18         location /nginx_status {
19             stub_status on;
20             access_log  logs/nginxstatus.log;
21             auth_basic  "nginx_status";
22             auth_basic_user_file    ../passwd;
23         }
24         location~*\.(gif|jpg|jpeg|png|bmp|swf|htm|css|js)$ {
25             root    /nginx_root/html;
26             if (!-f $request_filename)
27             {
28                 root    /nginx_root/baidu;
29             }
30             if (!-f $request_filename)
31             {
32                 root    /nginx_root/126;
33             }
34         }
35         location ~*\.(jsp)$ {
36             root    /nginx_root/aaron;
37             if (!-f $request_filename)
38             {
39                 root    /nginx_testdir/www;
40             }
41             proxy_pass http://192.168.100.110:8888;
42         }
43     }
44
45     server {
46         listen       192.168.100.110:80;
47         server_name  www.126.com 126.com;
48         location / {
49             root   /nginx_root/126;
50             index  index.html index.htm;
51             allow 192.168.100.0/24;
52             deny all;
53         }
54     }
55
56     server {
57         listen       192.168.100.110:80;
58         server_name  www.baidu.com baidu.com;
59         location / {
60             root   /nginx_root/baidu;
61             index  index.html index.htm;
62         }
63     }
64
65 }
2:rewrite指令rewrite  指令根据表达式来重定向URI,或者修改字符串。可以应用于server,location, if环境下每行rewrite指令最后应该跟一个flag标记,支持的flag标记有:
last                                      相当于Apache里的[L]标记,表示完成rewrite
break                         本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect                     返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent               返回301永久重定向,浏览器地址会显示跳转后URL地址
last和break标记的区别在于,last标记在本条rewrite规则执行完后,会对其所在的server{ … }
标签重新发起请求,而break标记则在本条规则匹配完成后,停止匹配,不再做后续的匹配。
另有些时候必须使用last,比如在使用alias指令时,而使用proxy_pass指令时则必须使用break。
redirect 和 permanent区别则是返回的不同方式的重定向,对于客户端来说一般状态下是没有区别的。而对于搜索引擎,相对来说301的重定向更加友好,如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的相关信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。使用302重定向时,搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观,然后决定显示哪个,如果它觉的跳转前的URL更好的话,也许地址栏不会更改,那么很有可能出现URL劫持的现像。我们在做URI重写时,有时会发现URI中含有相关参数,如果需要将这些参数保存下来,并且在重写过程中重新引用,我们可以用到 () 和 $N 的方式来解决。
实例1:
11     server{
12         listen       192.168.100.110:80;
13         server_name  www.aaron.com aaron.com;
14         location / {
15             root   /nginx_root/aaron;
16             index  index.html index.htm;
17         }
18         location /abc {
19             rewrite .* /aaron/index.htmlbreak;
20         }
21     }

实例2:
11     server{
12         listen       192.168.100.110:80;
13         server_name  www.aaron.com aaron.com;
14         location / {
15             root   /nginx_root/aaron;
16             index  index.html index.htm;
17             if ($host ~* 360buy.com) {
18                 rewrite .* http://www.jd.compermanent;
19             }
20         }
21     }
22 }

实例3:
11     server{
12         listen       192.168.100.110:80;
13         server_name  www.aaron.com aaron.com;
14         location / {
15             root   /nginx_root/aaron;
16             index  index.html index.htm;
17             if ($host ~* 360buy.com) {
18                 rewrite .* http://www.jd.compermanent;
19             }
20         }
21         location ~ /test123 {
22             rewrite ^/test123/(.*)$ /test1/$1permanent;
23         }
24     }
25 }



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-25346-1-1.html 上篇帖子: nginx启动gzip压缩js文件 下篇帖子: nginx限速
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表