Nginx Rewrite
Posted 还行少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx Rewrite相关的知识,希望对你有一定的参考价值。
一、Rewrite跳转
1.Rewrite跳转场景
- 调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,让旧访问跳转到新的域名上
- 服务端某些业务调整
2.Reweite实际场景
2.1 nginx跳转需求的实现方式
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配后再跳转
2.2 Rewrite执行顺序
- 执行server 模块里的rewrite 指令
- 执行选定的location 中的rewrite 指令
- 执行选定的location 中 if 中的rewrite 指令
3.Rewrite命令
3.1 Rewrite 命令语法
rewrite <regex> <replacement> [flag];
正则匹配规则 跳转后的内容 rewrite支持的flag标记
3.2 Nginx常用正则表达式元字符
字符 | 说明 |
---|---|
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除“\\n”之外的任何单个字符 |
\\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 |
\\d | 匹配纯数字 |
\\w | 匹配字母或数字或下划线或汉字 |
\\s | 匹配任意的空白符 |
\\b | 匹配单词的开始或结束 |
{n} | 重复n次 |
{n,} | 重复n次或多次 |
{n,m} | 重复n到m次 |
{,m} | 最多重复m次 |
[] | 定义匹配的字符范围,[a]:匹配单个字符a |
() | 表达式的开始和结束位置 |
| | 或表达式 |
3.3 flag标记说明
- last : 本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和 if 中
- break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中
- redirect :返回302临时重定向,浏览器地址栏会显示跳转后的URL
- permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL
last与break比较
last | berak | |
---|---|---|
使用场景 | 一般写在server和if中 | 一般使用在location中 |
URL匹配 | 不终止重写后的url匹配 | 终止重写后的url匹配 |
二、location
1.location分类
location = / {} | 精确匹配 / |
---|---|
location / {} | 一般匹配(因为所有的地址都以 / 开头,所以这条规则将匹配到所有的请求) |
location ~ / {} | 按照正则表达式的方式匹配 / |
2.location优先级
- 相同类型的表达式,字符串长度会优先匹配
- 按优先级排列
= 类型
^~ 类型表达式
正则表达式(~和~*)类型
常规字符串匹配类型,按前缀匹配
通用匹配( / ),如果没有其他匹配,任何请求都会匹配到
2.1 正则匹配的常用表达式
标记 | 说明 |
---|---|
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,区分大小写不匹配 |
!~* | 执行一个正则匹配,不区分大小写不匹配 |
^~ | 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location |
= | 普通字符精确匹配。也就是完全匹配 |
@ | 定义一个命名的location,使用在内部定向时 |
2.2 location优先级规则
2.2.1 匹配某个具体文件
- (location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径 ) > (location /)
2.2.2 用目录做匹配访问某个文件
- (location = 目录) > (location ^~ 目录) > (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)
3 与rewrite比较
3.1 相同点
- 都能实现跳转
3.2 不同点
- rewrite时在同一域名内更改获取资源的路径
- location时对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
3.3 rewrite会写在location里,执行顺序
- 执行server块里面的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
4.实际网站使用中,至少有三个匹配规则定义
- 直接匹配网站根 (加速访问网站首页)
- 处理静态文件请求(目录匹配或后缀匹配)
- 通用规则(用于转发动态请求到后端服务器)
Nginx跳转实验
1、基于域名的跳转
1.1 添加映射(也可搭建DNS服务器)
[root@localhost ~]# vim /etc/hosts
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.30.7 www.hello.com www.world.com
[root@localhost ~]#
1.2 创建日志目录
[root@localhost ~]# mkdir -p /var/log/nginx //开启日志功能,自定义一个日志存放路径
1.3 修改配置文件
1.4 重启服务,测试
2.基于客户端IP访问跳转
2.1 需求
除了192.168.30.7可以访问www.hello.com,其他访问都会跳转到www.world.com
2.2 创建维护页面
[root@localhost ~]# mkdir -p /var/www/html
[root@localhost ~]# echo "<h1>weihu ing</h1>" > /var/www/html/weihu.html
2.3 修改配置文件
2.4 重启服务测试
3.基于旧域名跳转到新域名后面加目录
3.1 创建指定目录
[root@localhost ~]# mkdir -p /usr/local/nginx/html/hello/yyds
[root@localhost ~]# echo "<h1> this is hello.html </h1>" > /usr/local/nginx/html/hello/yyds/1.html
3.2 修改配置文件
3.3 重启服务,测试
4.基于参数匹配的跳转
4.1 需求
访问www.hello.com/100-(100|200)-100.html会自动跳转到www.hello.com
4.2 修改配置文件
4.3 重启服务,测试
5.基于目录下所有php结尾的文件跳转
5.1 需求
访问www.hello.com/upload/123.php跳转到首页
5.2 修改配置文件
5.3 重启服务,测试
6.基于最普通一条URL请求的跳转
6.1 需求
访问 www.hello.com/asda/123.html 跳转到www.hello.com
6.2 修改配置文件
6.3 重启服务,测试
小结(Rewrite的作用)
- 调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求,网址换新域名后,让旧访问跳转到新的域名上
以上是关于Nginx Rewrite的主要内容,如果未能解决你的问题,请参考以下文章
apache与nginx在移动终端访问是的rewrite配置