目录
Rewrite简介
1.0 Rewrite实际场景
1.1 Rewrite跳转场景
1.2 Rewrite跳转实现
1.3 Nginx正则表达式
1.4 Rewrite命令&&语法格式
1.5 flag标记说明
2 Location分类
2.1 Location优先级
3 Rewrite&&Location比较
4 场景跳转实验
4.1 基于域名的跳转
Rewrite简介
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用
例:https://mp.csdn.net/mp_block/creation/editor?spm=1000.2415.9901.5352
只能对除了域名和参数之外的字符/mp_block/creation/editor进行匹配
1.0 Rewrite实际场景
- Nginx跳转需求的实现方式
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配再跳转
- rewrite放在 server{},if{},location{} 段中
- location只对域名后边的除去传递参数外的字符串起作用
- 对域名或参数字符串
- 使用if全局变量匹配
- 使用proxy_pass反向代理
1.1 Rewrite跳转场景
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配再跳转
1.2 Rewrite跳转实现
- Nginx:通过ngx_http_rewrite_module 模块支持URL重写、只支持if条件判断,但不支持else
- 跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
- PCRE支持:perl兼容正则表达式的语法规则匹配
- 重写模块 set 指令:创建新的变量并设其值
1.3 Nginx正则表达式
符号 | 作用 |
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,既不匹配全是大写,也不匹配全是小写 |
!~* | 不匹配大小写不区分 |
^~ | 前缀匹配,普通字符匹配,只匹配第一个成功的结果 |
= | 精确匹配 |
@ | 定义一个命名的Location,使用在内部定向的时候 |
{n} | n代表匹配次数 |
{n,} | 匹配n次或更多次 |
{n,m} | 重复 n 到 m 次 |
[ ] | 定义匹配的字符范围 |
[c] | 匹配单个字符 c |
[a-z] | 匹配 a-z 小写字母的任意一个 |
[a-zA-Z0-9] | 匹配所有大小写字母或数字 |
() | 表达式的开始和结束位置 |
| | 或运算符 |
1.4 Rewrite命令&&语法格式
rewrite <regex> <replacement> [flag]
正则表达式 跳转后的内容 rewrite支持的flag标记
1.5 flag标记说明
last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
set:当前规则匹配成功后设置一个变量,并把变量传入下一条规则
2 Location分类
- location 大致可以分为五类:
- 精准匹配 location = / {...}
- 前缀匹配 location ^~ {...}
- 一般匹配 location / {...}
- 正则匹配 location ~ / {...}
- 在nginx.conf的配置文件中location默认使用的是通用匹配 "location /{.....}
2.1 Location优先级
3 Rewrite&&Location比较
rewrite :对访问的域名或者域名内的URL路径地址进行本地页面跳转
location:对访问的路径做访问控制或者跨服进行URL跳转
从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。
4 场景跳转实验
4.1 基于域名的跳转
现在公司旧域名www.lbj.com有业务需求变更,需要使用新域名www.jokic.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lbj.com;
charset utf-8;
access_log /var/log/nginx/www.lbj.com-access.log;
location / {
#添加域名重定向
if ($host = 'www.lbj.com'){
rewrite ^/(.*)$ http://www.jokic.com/$1 permanent;
}
root html;
index index.html index.htm;
}
}
echo "192.168.181.101 www.lbj.com www.jokic.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.lbj.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.jokic.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。