Nginx Rewrite
摘要:nginx是重要的服务,在nginx中rewrite是很重要的一个功能,在企业中应用广泛。
目录
一、Rewirte 跳转场景
二、Rewrite 跳转实现
三、Rewrite 实现场景
四、Rewrite 正则表达式
五、Rewrite 语法格式
六、location 分类
七、location 优先级
八、Rewrite 和location
九、案例实验
十、总结
一、Rewirte 跳转场景
1.rewrite跳转场景
(1)URL看起来更规范,合理。
(2)企业会将动态URL地址伪装成静态地址提供服务。
(3)网址换新域名后,让旧的访问跳转到新的域名上。
(4)服务端某些业务调整。
2.rewrite概念
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
二、Rewrite 跳转实现
1.Rewrite 跳转实现
(1)nginx通过一个ngx_http_rewrite_module模块来支持URL的重写,支持if条件判断,但不支持else,类似于单分支语句.
(2)从一个location跳转到另一个location,循环最多可以执行10次,超过10次将返回500错误。
(3)pcre支持perl兼容正则表达式语法的规则匹配
(4)可以自己设置变量或者使用全局变量。
2.URL和URI
URL: 就是一个具体路径/位置
URI: 指的是一个拥有相同类型/特性的对象集合
URN:名称定位。
三、Rewrite 实现场景
1.Nginx跳转需求的实现方式
(1)使用rewrite进行匹配跳转
(2)使用if匹配全局变量后跳转
(3)使用location匹配再跳转
2.Nginx位置
rewrite放在 server,if,location 段中,location只对域名后边的除去传递参数外的字符串起作用
3.对域名或参数字符串
(1)使用if全局变量匹配
(2)使用proxy_pass反向代理
四、Rewrite 正则表达式
1.常用的正则表达式元字符
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置^ :匹配输入字符串的起始位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符
五、Rewrite 语法格式
1.Rewrite命令语法
rewrite <regex> <replacement> [flag];
set: 标记表示当前规则匹配成功设置一个变量 并把变量传入下一条规则
2.flag标记说明
(1) last:表示完成rewrite相当于Apache的[L]标记,表示完成rewrite。
(2)break:本条规则匹配完成即终止,不再匹配后面的任何规则。
(3)redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬中不会更新url
(4) permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址爬虫更新url。
3.last和 break 比较
(1)last一般写在server和if中,不终止重写后的url匹配。
(2)break一般使用在location中,终止重写后的ur匹配。
六、location 分类
1.location分类
一般location分为三大类
(1)精准匹配:location = pass {…} 精确匹配字符串
(2)正则匹配:location ~ pass {…} 按照正则表达式方式匹配
(3)一般匹配:location pass {…} 只要包含pass字符都行
2.location常用匹配规则
= :进行普通字符的精准匹配
^~:按正则表达式方式使用前缀匹配,匹配成功就不再匹配其他location
~:按正则表达式方式区分大小写的匹配
~*:按正则表达式方式不区分大小写的匹配
!~:按正则表达式方式区分大小写的匹配然后取反
!~*:按正则表达式方式不区分大小写的匹配然后取反
@:定义一个location,使用在内部定向时
七、location 优先级
1.location优先级路径
(1)匹配具体文件
(location = 路径) > (location ^~ 路径) >(location ~* 路径) >(location ~ 路径) >(location 路径) > (location /)
(2)匹配目录
(location = 路径) > (location ^~ 路径) >(location ~ 路径) >(location ~* 路径) >(location 路径) > (location /)
2.location优先级符号
(1)首先精确匹配 =
(2)其次前缀匹配 ^~
(3)其次是按文件中顺序的正则匹配 ~或~*
(4)然后匹配不带任何修饰的前缀匹配
(5)最后是交给 / 通用匹配
3.location 匹配
(1)首先看 优先级:精确>前缀>正则>一般>通用
(2)优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
(3)精确、前缀、正则、一般 都没有匹配到,最后再看通用匹配 一般匹配
4.企业location必选规则
(1)直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。例子:location = / {
(2)有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用,例子:location ^~ /static/ {或location ~* \.(
(3)通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器,例子:location / {
八、Rewrite 和location
1.区别
1.从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite
2.是在同一域名内更改获取资源的路轻,而 ocation 是对一类路径做控制访问或反向代理,还可以proxy pass 到其他机器
九、案例实验
1.基于域名的跳转
旧的域名要跳转到新的域名,访问旧的域名,可以分为新的域名。例如:新浪
变成
2.基于客户端 IP 访问跳转
网站维护,其他访问都显示维护页面,只有本机可以访问。
别的客户端访问
本机访问(192.168.140.222)
3.基于旧域名跳转到新域名后面加目录
无论访问的是什么,都转到指定网址。
访问www.zq.com/a/index.html变成访问www.hjp.com/hjp/a.html
4.基于参数匹配的跳转
无论访问什么url,都转换成指定网页。
使用浏览器访问 http://www.hjp.com/100-100-100.html 跳转到http://www.hjp.com页面。
5.基于目录下所有 php 结尾的文件跳转
浏览器访问 http://www.hjp.com/hjp/index.php 跳转到http://www.hjp.com页面。
6.基于最普通一条 url 请求的跳转
要求访问一个具体的页面如 http://www.hjp.com/hjp/a/index.html 跳转到首页
十、总结
nginx是重要的服务,在nginx中rewrite是很重要的一个功能,在企业中应用广泛。使用rewrite可以完成重定向的功能,在企业中使用广泛,可以完成新旧域名的更替,网址维护的页面拦截,这是企业非常重要的服务功能。