-
nginx的rewrite
-
反向代理
-
nginx作为反向代理服务器的首选,会遇到各种各样的跳转任务,并且nginx的跳转效率会更高。
-
跳转功能的实现通过ngx_http_rewrite_module来实现,支持if条件判断,但不支持else,需要pcre支持,跳转次数最多不超过10次。超过返回500状态码,支持set自定义变量
-
实现方式
-
直接写rewrite匹配进行跳转
-
通过if语句进行判断后在进行rewrite
-
通过location匹配后在跳转,这种方式rewrite只能放在server中,或者location中
-
location按照优先级从上到下分类
-
location = 匹配条件 {重写规则}
-
精准匹配
-
-
location ~ 匹配条件 {重写规则}
-
正则匹配
-
~
-
区分大小写
-
-
~*
-
不区分大小写
-
-
!~
-
区分大小写但不匹配
-
-
!~*
-
不区分大小写并且不匹配
-
-
^~
-
表示普通字符匹配
-
使用前缀进行匹配,匹配成功即停止
-
-
-
=
-
字符精准匹配(完全匹配)
-
-
-
-
location 匹配条件
-
一般匹配
-
-
优先级
-
-
-
-
-
语法
-
rewrite<regex><replacement>[flag];
-
-
案例实现
-
以下所有案例基本都要求在站点内实现,所以书写内容应该在站点内容之内,也就是location站点{ }内。
-
常见正则表达式元字符
-
-
-
公司网站更换域名,要求旧网站不能废除,也就是做站点迁移。
-
从一个域名跳转到另一个域名,也就是基于域名的跳转,
-
基于域名
-
if ($host = 'www.benet.com') { rewrite ^/(.*)$ http://www.accp.com/$1 permanent; }
-
解释:如果匹配到的url是www.benet.com那么通过地址重写的方式重定向到www.accp.com。
-
$host:日志记录中的访问者填写的url部分
-
-
用IP访问
-
-
-
用域名访问
-
-
-
重写规则:rewrite 重写前的内容 重写后的内容 flag标记
-
常用的flag标记(相当于apache中[条件标识])
-
last:标识完成rewrite
-
break:本条规则匹配完成即终止,不在匹配后面的任何规则
-
redirect:302临时重定向,爬虫不会更新url
-
permanent:301永久重定向,爬虫更新url
-
-
-
^/(.*)$
-
^:表示以什么开头
-
/:表示请求url后紧跟的那个/,例www.xingchen.com/中的“/”
-
():表示定位边界
-
.*:表示/后不管跟任何字符都能匹配
-
$:以什么结尾
-
-
需要注意因为表示的是判断,因此if()中的=号两边要有空格。
-
-
-
-
-
公司要更新维护网站,要求内部管理员主机能够访问该网站,其他任何人访问都要跳转到维护网站上。
-
无法针对域名做区分,可以区分的是IP,做到仅允许特定IP可以访问就可以。
-
基于IP地址
-
set $rewrite true; if ($remote_addr = "192.168.10.51") { set $rewrite false; } if ($rewrite = true) { rewrite (.+) /weihu.html; }
-
首先定义了一个变量值为true 再做判断,如果是我允许的IP地址来访为,将值设置为false。不做处理 如果是其他的做出判断成功,那么要进行重写,
-
(.+)表示匹配整个url,匹配成功后就在后面加上/weihu.html。
-
-
-
-
-
如果将子目录写在前面例:bbs.benet.com/post,其正确写法应该是www.benet.com/bbs/post
-
不正规的写法,或者不用更改添加出新的域名,需要有这种需求
-
location /post { rewrite (.+) http://www.benet.com/bbs$1 permanent; }
-
通过location定义来匹配/后为post的url。达成匹配条件后要进行地址重写。
-
$1:表示/后用户输入的字符串,用(.+)进行标识。可以这么说$1所代表的内容就是(.+)的内容,$1是默认带/的,这点要尤其注意。
-
-
需要在DNS中或者hosts解析目录中添加该方式所对应的解析条目。
-
-
-
基于uri进行跳转
-
访问端由明确的uri参数,需要将这种参数进行重写
-
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) { rewrite (.*) http://www.benet.com permanent; }
-
$request_uri:表示提取整个uri部分
-
^/100-(100|200)-(\d+).html$) :表示不管/前缀是什么,/后的后缀名的匹配条件。
-
可以将每一个-左右的数字都写成通配表达。
-
-
\d:表示匹配任意数字
-
-
-
-
伪动态的域名跳转,也就是将后缀为.php的url请求重写成静态的url
-
location ~* /aaa/(.*)\.php$ { rewrite (.*) http://www.benet.com permanent; }
-
-
精准请求的url进行跳转
-
location ~* ^/1/test.html { rewrite (.+) http://www.benet.com permanent; }
-
url不限制,但是对后缀进行了精准的匹配
-
-
-
-
总结
-
地址重写的思路
-
用各种正则表达式或者判断语句,将想要进行地址重写的url匹配到,这是难点,也是重点。 重写规则好写。
-
-
if与set要灵活使用
-
当你需要进行两种条件的匹配那么建议用if语句先判断。后进行重写。
-
如果匹配条件只有一个那么可以使用location进行匹配。
-
-
-
【无标题】
最新推荐文章于 2024-07-25 15:08:11 发布