Nginx Rewrite && 正则表达式

本文深入探讨Nginx的Rewrite功能和正则表达式,包括跳转场景、实现方法、实际应用,以及location解析。讲解了rewriterule的语法、flag标记、location的优先级规则,并通过多个实际案例解析了不同场景下的URL重定向策略。
摘要由CSDN通过智能技术生成

目录

前言

一、Nginx Rewrite概述

1. Rewrite 跳转场景

2. Rewrite 跳转实现

3. Rewrite 实际场景

3.1 Nginx 跳转需求的实现方式

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

3.3 对域名或参数字符串

二、Nginx 正则表达式

1. 常见的正则表达式元字符

2. nginx 与 apache 区别

三、Rewrite 命令详解

1. 语法格式

2. flag 标记

四、location 解析

1. location 分类

2. 正则匹配的常用表达式

3. location 优先级

4. 优先级示例

5. rewrite 和 location 比较

6. location 优先级规则

6.1 location 优先级到底是怎么排列的?

6.2 文件和目录为什么只会在区不区分大小写上会有变动?

五、案例解析

1. 基于域名的跳转

2、基于客户端 IP 访问跳转

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

4、基于参数匹配的跳转

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

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

 六、总结


前言

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

一、Nginx Rewrite概述

1. Rewrite 跳转场景

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

2. 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 的重写以及重定向。

3. Rewrite 实际场景

3.1 Nginx 跳转需求的实现方式

使用 rewrite 进行匹配跳转

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

使用 location 匹配再跳转

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

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

3.3 对域名或参数字符串

使用 if 全局变量匹配

使用 proxy_pass 反向代理

二、Nginx 正则表达式

1. 常见的正则表达式元字符

字符 说明
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
匹配前面的字符零次或一次
. 匹配除”\n”之外的任何单个字符
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d 匹配纯数字
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
[a-zA-Z] 匹配a-z小写字母或A-Z大写字母的任意一个

2. nginx 与 apache 区别

正则表达式是二者的区别之一
正则表达式:可以更加精确的匹配需求的字符串/参数/位置等

三、Rewrite 命令详解

1. 语法格式

rewrite <regex> <replacement> [flag];

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

2. flag 标记

标记 说明
last 相当于Apache的[L]标记,表示完成rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url

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 不会终止重写后的 url 匹配,break 会终止重写后的 url 匹配。

四、location 解析

1. location 分类

location = patt {}  [精准匹配]                #精确匹配字符串
location patt {}    [一般匹配]                 #只要包含patt的字符串即可
location ~ patt {}  [正则匹配]                 #按照正则表达式的方式匹配

2. 正则匹配的常用表达式

标记 说明
~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值