如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情
我们访问一个网页的时候会遇到一些奇形怪状的url地址,想优化一下,看着顺眼一点,或者打开一个短视频软件想摸鱼刷一会视频,在打开界面的时候无意间按到了某个位置,欻就跳转到了某东,看着小小说,无意间点到了广告一下就跳过去了,那这个是怎么实现的呢,就用到了今天介绍的——rewrite。
目录
💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!
👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!
🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对Linux感兴趣的朋友,让我们一起进步,共同提升!
一、rewrite的概念及作用
1. 基本概念
rewrite 功能允许根据特定的规则对客户端请求的 URL 进行修改,然后按照新的 URL 来处理请求。这在很多场景下都有重要作用,比如实现 URL 美化、网站页面迁移后进行旧链接重定向、根据不同条件将请求导向不同的后端服务等。
2. 配置语法
rewrite 指令的基本语法格式如下:
rewrite <regex> <replacement> [flag];
<regex>(正则表达式):用于匹配客户端请求的 URL。例如,^/oldpage/(.*)$ 可以匹配以 /oldpage/ 开头的 URL,其中 (.*) 用于捕获后续的字符内容,以便后续在替换字符串中使用。
<replacement>:是匹配成功后要替换成的新 URL 内容。比如,如果想把匹配到的 /oldpage/ 相关 URL 重定向到新页面 /newpage/,可以写成 /newpage/$1,这里的 $1 就是引用前面正则表达式中捕获到的内容。
[flag](标志位):是可选参数,常用的标志位有以下几种:
last:停止当前这一轮的 Nginx 配置中的后续指令处理,重新发起一个对新 URL 的请求查找匹配的 location 等配置块进行处理。
break:停止当前这一轮的 Nginx 配置中的后续指令处理,直接使用当前的重写后的 URL 进行后续请求处理,不再重新发起查找等操作。
redirect:返回一个临时的 302 重定向给客户端,让客户端去请求新的 URL。
permanent:返回一个永久的 301 重定向给客户端,告知客户端资源已永久性迁移到新的 URL 地址,搜索引擎等会根据此更新索引。
3. 应用场景
URL 美化:例如,将原本带有参数的动态 URL(如 example.com/article.php?id=123)重写成更简洁美观的静态形式(如 example.com/articles/123.html),提升用户体验以及利于搜索引擎优化(SEO)。
网站迁移重定向:当网站的页面结构发生变化,旧的页面链接需要指向新的对应页面时,通过 rewrite 可以方便地将旧链接重定向到新的正确链接,避免出现 404 页面,保证用户访问的连贯性和搜索引擎排名不受太大影响。比如原网站的产品页面从 /product?id=1 迁移到了 /products/1,就可以用 rewrite 规则进行重定向。
后端服务代理区分:根据请求 URL 的不同特征,利用 rewrite 可以将请求转发到不同的后端服务器群组或者应用服务上。比如,将以 /api/v1 开头的请求转发到一个版本的 API 服务器,而 /api/v2 开头的请求转发到另一个版本的 API 服务器,通过 rewrite 匹配 URL 后修改转发的目标地址来实现。
4. 注意事项
正则表达式编写要准确,否则可能导致匹配不准确,无法正确重写 URL 或者出现意外的重写情况。
合理选择标志位,不同的标志位决定了后续 Nginx 处理请求的流程以及客户端收到的响应形式,使用不当可能会造成循环重定向等问题。
测试 rewrite 规则时,要全面检查各种可能的请求情况,确保重写后的 URL 能够被正确处理,不会影响网站的正常运行和用户访问体验。
Nginx 的 rewrite 功能为网站的 URL 管理、请求转发等方面提供了灵活且高效的解决方案,合理运用它能提升网站的性能、用户体验以及维护的便利性。
二、rewrite跳转标记
1、last和break
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
root /code/test/;
location / {
rewrite /1.html /2.html break; #break 或者last
rewrite /2.html /3.html;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html {
rewrite /3.html /b.html;
}
}
#文件内容:1.html:空
2.html:2.html……
3.html:3.html……
a.html:aaaaaaa……
b.html:bbbbbbb……
#文件寻找顺序:访问test.yunzhongzi.com/1.html 跳转到2.html,2跳转3.html,3.html跳转b.html
last 含义: 停止向后匹配,重新对2.html发起请求#三个locartion之间互不影响,在第一个location上写last就是1.html指向2.html指向a.html
break含义: 停止向后匹配,获取2.html中的内容返回给用户,不会重新发起请求。#写入break,1.html跳转2.html,不在向下跳转2.html的内容
2、临时跳转和永久跳转
302 临时跳转: 每次都要请求源站,然后源站返回新的站点给用户,如果源站挂了,无法访问!
使用return 302 http://www.baidu.com 和 rewrite最后的标记 redirect 是一样的功能,都是临时跳转。
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
root /code;
location /test {
rewrite ^(.*)$ http://www.baidu.com redirect;
#rewrite ^(.*)$ http://www.yunzhongzi.com permanent;
#return 301 http://www.yunzhongzi.com;
#return 302 http://www.baidu.com;
}
}
301永久跳转: 只第一次访问源站,第一次往后,直接访问新的站点。
使用return 301 http://www.baidu.com; 和在rewirte后面写premanent相同的含义。
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
root /code;
location /test {
#rewrite ^(.*)$ http://www.baidu.com redirect;
rewrite ^(.*)$ http://www.baidu.com permanent;
#return 301 http://www.yunzhongzi.com;
#return 302 http://www.baidu.com;
}
}
三、rewrite跳转案例
1、资源跳转
用户访问test.yunzhongzi.com/abc ----->/code/ccc/bbb/2.html
[root@web01 conf.d]#vim rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
location / {
root /code;
index index.html;
}
location /abc {
rewrite ^(.*)$ /ccc/bbb/2.html redirect;
#return 302 /ccc/bbb/2.html;
}
}
[root@web01 conf.d]#mkdir /code/ccc/bbb/ -p
[root@web01 conf.d]#echo /code/ccc/bbb/2.html.... > /code/ccc/bbb/2.html
2、后向引用
通过后项引用,调用用户输入的路径
用户访问的test.yunzhongzi.com/2018/aaa/index.html ----->/code/2014/aaa/index.html
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
location / {
root /code;
index index.html;
}
location /2018 {
rewrite ^/2018/(.*)$ /2014/$1 redirect;
}
}
[root@web01 conf.d]#mkdir /code/2014
[root@web01 conf.d]#mkdir /code/2014/aaa
[root@web01 conf.d]#echo aaaaaaaaa > /code/2014/aaa/index.html
[root@web01 conf.d]#systemctl restart nginx
3、redirect跳转
案例3. 用户访问test.yunzhongzi.com/course-11-22-33.html ------>/code/course/11/22/33/course_33.html
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
root /code;
index index.html;
location / {
#灵活配法
rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定配法
#rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
}
[root@web01 conf.d]#systemctl restart nginx
[root@web01 test]#mkdir -p /code/course/11/22/33/
[root@web01 test]#echo "<h1>/code/course/11/22/33/course_33.html</h1>" > /code/course/11/22/33/course_33.html
四、返回错误页面
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
root /code;
index index.html;
location / {
#灵活配法
#rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定配法
rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
error_page 403 404 500 501 502 @error_test;
location @error_test {
rewrite ^(.*)$ /404.html break;
}
}
#案例2.客户端IP地址为10.0.0.1访问test.yunzhongzi.com时,自动在请求行后面加上参数&showoffline=1
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
# $args为Nginx内置变量请求行的参数
set $args "&showoffline=1";
location / {
root /code;
index index.html;
}
if ($remote_addr = 10.0.0.1 ){
rewrite (.*) http://test.yunzhongzi.com$1;
}
}
案例3.通过变量指定返回给用户的页面
[root@web01 conf.d]#cat rewrite.conf
server {
listen 80;
server_name test.yunzhongzi.com;
root /code/test;
charset utf-8,gbk;
location / {
index index.html;
set $ip 0;
#设置变量为0
if ($remote_addr = "10.0.0.2"){
set $ip 1; #如果来源IP为0.1则设置为1
}
if ($ip = 0){
# 判断如果变量为0 则跳转维护页面
rewrite ^(.*)$ /wh.html break;
}
}
}
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]#echo 游戏页面维护中... > /code/test/wh.html
今天的rewrite就介绍到这里,明天介绍https加密访问~~~
想成为大佬,就要从小白开始,从0开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~~