Nginx Rewrite概述分类和优先级

目录

一、Nginx Rewrite概述

1.1 什么是Nginx Rewrite

1.2 Rewrite跳转场景

 1.3  Rewrite 跳转实现

1.4  Rewrite 实际场景

1.4.1   Nginx 跳转需求的实现方式

1.4.2  rewrite 放在 server{},if{},location{} 段中

1.4.3  对域名或参数字符串

二、Nginx 正则表达式

2.1 常用的正则表达式元字符

2.2 Nginx 和Apache 的区别

三、Rewrite 命令详解

3.1  Rewrite 命令语法

3.2   flag 标记

3.3  last 和 break 比较

四、location 分类和优先级

4.1  location  分类

4.2 正则匹配的常用表达式

4.3  location  优先级

4.3.1  location优先级规则

4.3.2   优先级示例

4.3.3  可用作判断的全局变量

 4.4  rewrite 和 location 比较

4.5  实际网站使用中,至少有三个匹配规则定义

五、常用的Rewrite案例

5.1  基于域名的跳转

5.2  基于客户端IP访问跳转

5.3  基于旧域名跳转到新域名后面加目录

5.4  基于参数匹配的跳转 

5.5  基于目录下所有php结尾的文件跳转

5.6   基于最普通一条 url 请求的跳转

六、总结 


一、Nginx Rewrite概述

1.1 什么是Nginx Rewrite

现在Nginx已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会遇到很多跳转(重写URL)的需求。比如更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的Apache服务器,虽然也能做跳转,规则库也很强大,但是用Nginx跳转效率会更高。

1.2 Rewrite跳转场景

调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。
为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到 jd.com。
服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行 URL 调整等。

ps:URL:就是具体的路径、位置。

URL:指的是一个拥有相同类型,特性的对象集合

 1.3  Rewrite 跳转实现

1.Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支持 else 
2.该模块需要PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后 Nginx 将返回500错误。
3.同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他 location、记录做了什么等等。
4.rewrite 功能就是,使用 Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 URL 的重写以及重定向。

1.4  Rewrite 实际场景

1.4.1   Nginx 跳转需求的实现方式

使用 rewrite 进行匹配跳转

使用 if 匹配全局变量后跳转

使用 location 匹配再跳转

rewrite执行顺序

(1) 执行server块里面的rewrite指令
(2) 执行location匹配
(3) 执行选定的location中的rewrite指

1.4.2  rewrite 放在 server{},if{},location{} 段中

location 只对域名后边的除去传递参数外的字符串起作用——页面文件的路径

1.4.3  对域名或参数字符串

使用 if 全局变量匹配
使用 proxy_pass 反向代理

二、Nginx 正则表达式

2.1 常用的正则表达式元字符

字符

说明

^

匹配输入字符串的起始位置

$

匹配输入字符串的结束位置

*

匹配前面的字符零次或多次

+

匹配前面的字符一次或多次

?

匹配前面的字符零次或一次

.

匹配除”\n”之外的任何单个字符

\

将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用

\d

匹配纯数字

{n}

重复n次

{n,}

重复n次或更多次

[c]

匹配单个字符c

[a-z]

匹配a-z小写字母的任意一个

[a-zA-Z]

匹配a-z小写字母或A-Z大写字母的任意一个

 正则表达式:---》为了精确匹配,用户体验,筛选 正则匹配的意义所在

localtion 需要精确匹配到  index.html

注意:从功能上看rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名更改获取资源的路径,而location 是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器。

2.2 Nginx 和Apache 的区别

正则表达式是二者的区别之一

正则表达式:可以更加精确的匹配需求的字符串/参数/位置等

三、Rewrite 命令详解

3.1  Rewrite 命令语法

rewrite   <regex>    <replacement>     [flag];
 
#<regex>:正则表达式    
    
#<replacement>:跳转后的内容     
 
#[flag]rewrite支持的flag标记

 示例:rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。
下面是一个简单地URL rewrite跳转的例子:

在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则;

regex部分是^/(.*)是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.etiantian.org/$1;

这里的$1是取前面regex部分括号里的内容;

结尾的permanent是永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。
 

3.2   flag 标记

标记

说明

last

相当于Apache的[L]标记,表示完成rewrite

break

本条规则匹配完成即终止,不再匹配后面的任何规则

redirect

返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url

permanent

返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url

3.3  last 和 break 比较

last

break

使用场景

一般写在 server 和 if 中

一般使用在 location 中

URL匹配

不终止重写后的 urI 匹配

终止重写后的 url 匹配

 last:url 重写后,马上发起一个新请求,再次进入 server 块,重试 location 匹配,超过10次匹配不到报 500 错误,地址栏不变;

break:url重写后,直接使用当前资源,不再使用 location 余下的语句,完成本次请求,地址栏不变

总的来说:last 和 break 再重定向后,地址栏都不会发生变化,这是他们的相同点。不同点在于 last 会写在 server 和 if中,break 是写在location 中,last 不会终止重

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值