当前位置: 首页 > article >正文

麒麟操作系统服务架构保姆级教程(十)rewrite跳转

  如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情

        我们访问一个网页的时候会遇到一些奇形怪状的url地址,想优化一下,看着顺眼一点,或者打开一个短视频软件想摸鱼刷一会视频,在打开界面的时候无意间按到了某个位置,欻就跳转到了某东,看着小小说,无意间点到了广告一下就跳过去了,那这个是怎么实现的呢,就用到了今天介绍的——rewrite。

目录

一、rewrite的概念及作用

二、rewrite跳转标记

1、last和break

​编辑

​编辑

2、临时跳转和永久跳转

三、rewrite跳转案例

1、资源跳转

2、后向引用

3、redirect跳转

四、返回错误页面

💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!

👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!

🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对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开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~~ 


http://www.kler.cn/a/505354.html

相关文章:

  • 微服务之松耦合
  • linux环境使用docker部署多个war项目
  • 为深度学习创建PyTorch张量 - 最佳选项
  • c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!
  • Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
  • [Linux]Docker快速上手操作教程
  • linux环境使用docker部署多个war项目
  • rtthread学习笔记系列--24 waitqueue
  • 在 Docker 中安装并运行三个 MySQL 数据库
  • 快速上手 HarmonyOS 应用开发
  • np.gradient() 获取单个,一维,二维坐标点的梯度值
  • Oracle分析工具-Logminer手动指定归档文件
  • Tabby - 开源的自托管 AI 编码助手
  • 计算机网络速成
  • centos 7 CA认证中心
  • ChatGLM:从GLM-130B到GLM-4全系列大语言模型
  • ARM与x86:架构对比及其应用
  • AWS云计算概览(自用留存)
  • 适配器模式案例
  • 【2024年华为OD机试】 (B卷,100分)- 太阳能板最大面积(Java JS PythonC/C++)
  • Docker实战案例:构建并部署一个Node.js Web应用
  • Python数据处理(一)- Pandas 安装与数据结构介绍
  • 【时时三省】(C语言基础)经典笔试题3
  • 1Spark 基础
  • 信息系统安全设计方案,软件系统安全设计总体解决方案(Word原件)
  • docker-compose和docker-harbor