1、Rewrite基本概述
(1) 什么是rewrite
Rewrite
主要实现url地址重写,以及重定向,就是把传入Web请求重定向到其他URL的过程
(2) Rewrite使用场景
1、地址转换:用户访问www.zxc.com这个URL时,将其定向至一个新的域名www.baidu.com
2、协议跳转:用户通过http协议请求网站时,将其重新跳转至https协议方式
3、搜索引擎:SEO优化依赖于URL路径,好记的URL便于支持搜索引擎录入
4、伪静态:将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
(3) Rewrite配置示例
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break;
2、Rewrite标记Flag
rewrite指令根据表达式来重定向
URL
,或者修改字符串。可以应用于server, location, if
环境下,每行rewrite指令
最后跟一个flag标记
。标记有如下所示:
(1) Flag种类
Flag种类 规则
last 本条规则匹配完成后,停止匹配,不再匹配后面的规则
break 本条规则匹配完成后,停止匹配,不再匹配后面的规则
redirect 返回302临时重定向,地址栏会显示跳转后的地址
permanent 返回301永久重定向,地址栏会显示跳转后的地址
(2) last和break的测试
[root@Nginx-6 conf.d]# cat rewrite.zxc.com.conf
server {
listen 80;
server_name rewrite.zxc.com;
root /code;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type application/json;
return 200 "ok";
}
}
#访问rewrite.zxc.com/break和rewrite.zxc.com/last结果进行对比
(3) last和break的区别
last和break都是一个作用,都是表示停止rewrite规则,区别在于:
break只要匹配到规则,则会去本地路径的目录中寻找文件。
last只要匹配到规则,则会对其所在的server{…..}标签重新发起请求。
所以,在访问/break和last请求时,虽然对应的请求目录/test都不存在了,理论上都应该返回404,但是实际请求/last的时候,是会有后面location所匹配到的结果返回的。原因正在于此。详细访问过程
break:
1.请求rewrite.zxc.com/break
首先:会去查找本地的/code/test/index.html;如果找到了,则返回/code/test/index.html的内容;如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403。last:
1.请求rewrite.zxc.com/last
首先:会对当前server重新的发起一次请求,rewrite.zxc.com/test/,如果有location匹配上,则直接返回该location的内容。如果没有location匹配,/code/test/index.html;如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403。
(4) redirect和permanent区别
redirect和permanent都是一个跳转,那redirect和permanent区别在哪呢 (实现https)
redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
permanent: 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。
(5) redirect和permanent区别对比示例
[root@Nginx-6 conf.d]# cat rewrite.zxc.com.conf
server {
listen 80;
server_name rewrite.zxc.com;
root /code;
location ~^/zxc {
rewrite ^(.*)$ http://www.baidu.com redirect;
rewrite ^(.*)$ http://www.baidu.com permanent;
#return 301 http://www.baidu.com;
#return 302 http://www.baidu.com;
}
}
#访问rewrite.zxc.com/zxc,先注释其中一条进行对比
#通过浏览器访问,redirect会进行302跳转
#通过浏览器访问,permanent会进行301跳转
3、Rewrite规则实现
(1) 用户访问/abc/1.html
实际上真是访问是/ccc/bbb/2.html
#http://www.zxc.com/abc/1.htnml ==> http://www.zxc.com/ccc/bbb/2.htnml
#1.准备好真实的访问路径
[root@Nginx-6 ~]# mkdir /code/ccc/bbb -p
[root@Nginx-6 ~]# echo "ccc_bbb_2" /code/ccc/bbb/2.html
#2.Nginx跳转配置
[root@Nginx-6 conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /abc {
rewrite (.*) /ccc/bbb/2.html redirect;
#return 302 /ccc/bbb/2.html;
}
}
#3. 重启Nginx服务
[root@Nginx-6 conf.d]# systemctl restart nginx
(2) 用户访问/2108/ccc/bbb/2.html
实际上真实访问是/2014/ccc/bbb/2.html
##http://www.zxc.com/2018/ccc/bbb/2.htnml ==> http://www.zxc.com/2014/ccc/bbb/2.htnml
#1.准备真实的访问路径
[root@Nginx-6 conf.d]# mkdir /code/2014/ccc/bbb -p
[root@Nginx-6 conf.d]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html
#2. Nginx跳转设置
[root@Nginx-6 conf.d]# cat 2014.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /2018 {
rewrite ^/2018/(.*)$ /2014/$1 redirect;
}
}
#3. 重启Nginx服务
[root@Nginx-6 conf.d]# systemctl restart nginx
(3) 用户访问/test
实际上真实访问是http://www.baidu.com
location /test {
rewrite (.*) http://www.baidu.com redirect;
}
(4) 用户访问course-11-22-33.html
实际上真实访问是/course/11/22/33/course_33.html
#http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html
#http://www.bgx.com/course-44-55-66.html ==> http://www.bgx.com/course/44/55/66/course_66.html
#1.准备真实的访问路径
[root@Nginx-6 conf.d]# mkdir /code/course/11/22/33 -p
[root@Nginx-6 conf.d]# echo "11-22-33" > /code/course/11/22/33/course_33.html
#2. Nginx跳转设置
[root@Nginx-6 conf.d]# cat course33.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location ~ ^/course {
rewrite (.*)-(.*)-(.*)-(.*).(.*) /$1/$2/$3/$4/$1_$4.$5 break;
}
}
#3. 重启Nginx服务
[root@Nginx-6 conf.d]# systemctl restart nginx
(5) 将http请求,跳转至https
server {
listen 80;
server_name www.zxc.com;
rewite ^(.*) https:// $server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443;
server_name www.zxc.com;
ssl on;
}
4、Rewrite 规则补充
rewrite匹配优先级
1.先执行server块的rewrite指令
2.其次执行location匹配规则
3.最后执行location中的rewrite
原文始发于微信公众号(运维库):11-Nginx_Rewrite重写
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/64286.html