nginx--rewrite地址重写规则

Rewrite正则相关指令详解:

nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令 格式如下: rewrite regex replacement flag rewrite 正则表达式 替换目标 flag标记

正则表达式匹配,有以下几种特殊写法:

~ 为区分大小写匹配

~* 为不区分大小写匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配判断有以下几种写法:
-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

-x和!-x用来判断文件是否可执行

flag标记可以用以下几种格式:
last - 基本上都用这个Flag。

break - 中止Rewirte,不在继续匹配

redirect - 返回临时重定向的HTTP状态302

permanent - 返回永久重定向的HTTP状态301

使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。

1、
目的:
当用户访问[http://192.168.100.10/abc/a/1.html](http://192.168.100.10/abc/a/1.html) 地址时,
通过redirect 重定向至[http://192.168.100.10/ccc/bbb/2.html](http://192.168.100.10/ccc/bbb/2.html)
实验:重定向得网站得位置在当前网站目录位置下得 /ccc/bbb/2.html
server {
location /abc {
rewrite .* /ccc/bbb/2.html permanent;
只要匹配到abc 就会重写 重写后寻找得地址是/ccc/bbb/2.html
permanent: 写得话 就会变成新得重定向地址 不写得话还是输入得地址但是内容是重定向后得内容
}
2、
目的:
利用正则中的”()和\1 “,
替换url中一部分的内容。
将http://192.168.100.10/2016/a/b/c/1.html](http://192.168.100.10/2016/a/b/c/1.html)
换http://192.168.100.10/2017/a/b/c/1.html](http://192.168.100.10/2017/a/b/c/1.html)
实验:
server {
location /2016 {
rewrite ^/2016/(.*)$ /2017/$1 permanent;
只要匹配到以2016开头不管什么结尾得就会重写,重写成2017 $1就是调用括号里得变量
permanent: 写得话 就会变成新得重定向地址 不写得话还是输入得地址但是内容是重定向后得容
}
}
3、
目的:
location { rewrite } 只能替换url中的目录路径,
使用if (){rewrite}可以替换协议主机目录。
将[http://www.taobao.com]
换[http://jd.com](http://jd.com)
实验:
server{
if ( $host ~* taobo.com) {
rewrite .* [http://jd.com](http://jd.com) permanent;
如果$host也就是域名匹配taobao.com
就重写 成京东得网站
}
}
 4、
目的: 上一个试验中,不论输入的url中页面内容是什么:
http://qianfeng.com/1.html
其结果。全部都重定向至
http://cloud.com/1.html主页。
示例:
将[http://taobao.com/ccc/bbb/2.html](http://taobao.com/ccc/bbb/2.html)
换成
[http://cloud.com/ccc/bbb/2.html](http://cloud.com/ccc/bbb/2.html) 实验:
server {
if ( $host ~* taobao.com ) {
rewrite .* [http://cloud.com$request_uri](http://cloud.com$request_uri) permanent;
如果$host也就是域名匹配taobao.com
就重写 到cloud.com
$request_uri : 就是在taobao.com后面得路径 ,使用变量直接写到重写后得网站中
}
}
注意:
http://taobao.com/ccc/bbb/2.html没有ccc/bbb/2.html这个文件这是没有的
5、
目的: 在访问的url是目录时,在URL自动添加一个“/” (如果不是目录,则不加/)
(但是先做个判断,是目录才需要加,不是目录就不加。)当用户访问网站时,输入的URL不完整。
1.输入的URL是目录时,自动添加“/”
http://www.baidu.com/abc
2.输入的URL是文件时,不添加“/”
http://www.baidu.com/abc/index.html
3.输入的URL是目录,但已经添加"/"时,不添加“/”
http://www.baidu.com/abc/ 实验: server {
if ( -d $requset_filename ) {
rewrite ^(.*) ([^/])$ [http://$host$1$2/](http://$host$1$2/) permanent;
判断是不是目录是目录得话就重写
如果是目录得话就重写 什么开头都可以 不是以 / 结尾 都换成加 / 得
}
}
6、
目的: http://www.tianyun.com/login/tianyun.html
转为
http://www.tianyun.com/reg/login.php?user=tianyun 实验:  location /login {
rewrite ^/login/(.*)\.html$ /reg/login.php?user=$1;
以/login开头中间都可以 以.html结尾 重写
}
7、 目的: 目录的表达方式发生变化。
原先的“-”分割,变成了“/"目录层次。
将
http://www.tianyun.com/qf/11-22-33/1.html
转换为
http://www.tianyun.com/qf/11/22/33/1.html 实验: location /qf {
rewrite ^/qf/([0-9]+) - ([0-9]+) - ([0-9]+) (.*) $ /qf/$1/$2/$3$4 permanent;
root /usr/share/nginx/html;
域名或者IP后面匹配到qf 就重写 匹配以/qf开头的 以什么结尾就可以 重写成qf/11/22/33/1.index
获取网站内容
}  
8、
目的:
引用原URL当中的信息,重定向至目标的URL
http://alice.taobao.com ==> http://www.taobao.com/alice
http://jack.taobao.com ==> http://www.taobao.com/jack
实验:
if ( $host ~* “www.taobao.com$” ) {
break;
}
防止死循环只要匹配到 [www.taobao.com](http://www.taobao.com) 就跳出
if ( $host ~* “^(.*)\.taobao\com$” ) {
set $user $1;
rewrite .* [http://www.taobao.com/$user](http://www.taobao.com/$user) permanent;
域名前匹配所有 .taobao.com
set=设置变量
重写所有 到http://www.taobao.com 后把if判断的第一个变量设置成user写到后面
}
9、
目的: 如果访问的.sh结尾的文件则返回403操作拒绝错误 实验:
location .*\.sh$ {
return 403; 匹配到.sh 就返回403
也可以写成:
rewrite .* [http://www.taobao.com](http://www.taobao.com) [](http://www.taobao.com;) permanent;
}
Nginx Rewrite如何301跳转 如:将54php.cn 跳转到 www.54php.cn
server {
    listen       80;
    server_name   www.54php.cn  54php.cn;
    if ($host != 'www.54php.cn' ) { 
        rewrite ^/(.*)$ http://www.54php.cn/$1 permanent; 
    } 
}
根据文件类型设置过期时间:
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
       expires    1h;
       break;
    }
}

你可能感兴趣的:(nginx--rewrite地址重写规则)