目录
1.Nginx正则表达式
2.location概述
从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径;而location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器。
- rewrite对用户的URL访问路径进行重写,再重定向跳转访问重写后的路径
- location通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发
location大致可以分为三类:
- 精准匹配:location = / {…}
- 一般匹配:location / {…}
- 正则匹配:location ~ / {…}
2.1 location匹配规则
2.2 location优先级
- 首先精确匹配 =
- 其次前缀匹配 ^~
- 其次是按文件中顺序的正则匹配 ~或~*
- 然后匹配不带任何修饰符的一般前缀匹配
- 最后是交给 / 通用匹配
location示例说明:
(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求,比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但后面前缀路径会和最长字符串优先匹配(最长匹配)
(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它location,只有其它location后面的前缀路径没有匹配到时,才会采用这一条
(4)location /documents/abc {}
匹配任何以 /documents/abc开头的地址,匹配符合以后,还要继续往下搜索其它location,只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
(6)location ~* .(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求;然而,所有请求 /images/ 下的图片会被location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它location,会发现 ^~ 和 ~ 存在
(8)location ~ /images/abc {}
匹配以/images/abc开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高
优先级总结:
(location = 完整路径) > (location ^~ 最长路径) > (location , 正则顺序) > (location 部分前缀路径) >(location /)*
location匹配总结:
首先看优先级:精确= > 前缀^~ > 正则~,~* > 一般 前缀匹配> 通用/
在没有精准匹配的情况下,先看前缀匹配的长度,取最长匹配的location(如果最长的前缀匹配带有^~,则不再看其它正则匹配location;如果最长的前缀匹配是没有^~的,则会继续再看正则匹配)。
前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序 ,根据nginx配置文件的配置由上往下依次匹配 ,匹配到即停止。
3.rewrite概述
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用。
例如:http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。
rewrite跳转实现:
Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块set 指令:创建新的变量并设其值
rewrite执行顺序如下:
(1) 执行server块里面的rewrite指令。
(2) 执行location匹配。
(3) 执行选定的location中的rewrite 指令。
语法格式:rewrite <regex> <replacement> [flag];
regex:表示正则匹配规则,用来传递参数。
replacement:表示跳转后的内容。
flag:表示rewrite支持的flag标记。
flag标记说明
4.rewrite实例操作
4.1 基于域名的跳转
(1)访问http://www.xy101.com/scj.jpg跳转http://www.xy101.com/error.png
(2)现在公司旧域名www.xy101.com有业务需求变更,需要使用新域名www.xy102.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
4.2 基于客户端 IP 访问跳转
今天公司业务新版本上线,要求所有IP访问任何内容都显示一个固定维护页面,只有公司IP :192.168.80.10访问正常。
4.3 基于旧域名跳转到新域名后面加目录
现在访问的是http://nba.xy101.com/scj.html现在需要将这个域名下面的访问都跳转到http://www.xy101.com/nba/scj.html。
4.4 基于参数匹配的跳转
现在访问http://www.xy101.com/100-(100|200)-100.html,跳转到http://www.xy101.com页面。
4.5 基于目录下所有php结尾的文件跳转
要求访问 http://www.xy101.com/upload/123.php 跳转到首页。
4.6 基于最普通一条url请求的跳转
要求访问一个具体的页面如 http://www.xy101.com/abc/123.html 跳转到首页