Nginx Rewrite 地址重写
Rewrite规则可以实现对url的重写,以及重定向
应用场景
- 地址跳转和协议跳转
- 伪静态,利于搜索引擎爬虫和SEO
- 调整用户浏览的URL,看起来规范,利于SEO
- 网站更换新域名
- 根据特殊的变量、目录、客户端信息进行跳转
规则优先级
- 先执行server块的rewrite指令
- 其次执行location匹配规则
- 最后执行location中的rewrite
全局变量
在rewrite
过程中,会用到一些全局变量:
配置语法
- Syntax# rewrite regex replacement [flag];
- Default:——
- Context:server、location、if
regex:
Location优先级:
ocation 匹配方式有以下几种
location = /path/a/exact.png {}
: 精确匹配
location ^~ /path/a/ {}
: 优先前缀匹配(符合最长匹配原则)
location ~ /Path?/ {}
: 区分大小写正则匹配(首次匹配原则)
location ~* /path?/ {}
: 不区分大小写正则匹配(首次匹配原则)
location /path/a/test.png {}
: 前缀匹配(符合最长匹配原则)
location 优先级匹配与配置的先后顺序无关,优先级排列顺序如下
精确匹配 > 优先前缀匹配 > 区分大小写正则匹配=不区分大小写正则匹配 > 前缀匹配
文件及目录匹配:
-
-f
和!-f
用来判断是否存在文件
-
-d
和!-d
用来判断是否存在目录
-
-e
和!-e
用来判断是否存在文件或目录
-
-x
和!-x
用来判断文件是否可执行
Flag参数:
标记符号 | 说明 |
---|
last | 终止在本location块中处理接收到的URI,并将此处重写的URI作为新的URI使用其他location进行处理。(只是终止当前location的处理)【如果没有匹配到,会继续向下匹配】 |
break | 将此处重写的URI作为一个新的URI在当前location中继续执行,并不会将新的URI转向其他location。【如果没有匹配到,则不再向下匹配,直接返回结果404】 |
redirect | 将重写后的URI返回个客户端,状态码是302,表明临时重定向,主要用在replacement字符串不以“http://”,“ https://”或“ $scheme” 开头;【地址栏会显示跳转后的地址】 |
permanent | 将重写的URI返回客户端,状态码为301,指明是永久重定向;【地址栏会显示跳转后的地址】 |
break
与last
区别举例:
break 只要匹配到规则,则会去本地配置路径的目录中寻找请求的文件;
而last只要匹配到规则,会对其所在的server(…)标签重新发起请求。
break请求:
1、首先:会去查找本地的/code/test/index.html;
2、如果找到了,则返回/code/test/index.html的内容;
3、如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403
last请求:
1、首先:会去查找本地的/code/test/index.html;
2、如果找到了,则返回/code/test/index.html的内容;
3、如果没找到,会对当前server重新的发起一次请求。example.com/test/
4、如果有location匹配上,则直接返回该location的内容。
5、如果也没有location匹配,再返回404;
示例集合
在调试环境下,开启rewrite日志对规则的匹配以便观察:
示例一(常用301、302跳转):
示例二(域名新旧跳转):
示例三(跳转站外网页):
示例四(自动将http跳转到https):
示例五(判断资源是否存在):
示例六(根据用户浏览器跳转指定目录):
示例七(资源防盗链):
示例八(多目录转成参数):
示例九(目录对换):
示例十(设置某个子目录跳转页面):
示例十一(域名镜像):
示例十二(三级域名跳转):
示例十三(维护站点):
参考链接