nginx Rewrite 相关功能

一、Nginx Rewrite 概述

  1. 定义
    • Nginx 的 Rewrite 模块允许对请求的 URI 进行重写操作。它可以基于一定的规则修改请求的 URL 路径,然后将请求定向到新的 URL 地址,这在很多场景下都非常有用,比如实现 URL 美化、网站重构后的 URL 跳转等。
  2. 主要指令
    • rewrite
      • 语法:rewrite regex replacement [flag];
      • 功能:按照正则表达式regex匹配请求的 URI,如果匹配成功,则将 URI 替换为replacement所指定的内容flag是可选的标志,用于控制重写操作的行为。
    • if
      • 语法:if (condition) {...}
      • 功能:用于条件判断,根据condition(可以是变量、正则表达式匹配等)来决定是否执行大括号内的指令

二、Rewrite 规则中的标志(flag)

  1. last
    • 含义:停止处理当前的rewrite指令集,并重新开始在当前配置的server块内寻找新的location来处理请求
    • 示例:rewrite ^/old-path/(.+)$ /new - path/$1 last;
    • 应用场景:当需要将请求重定向到同一server内的其他location时使用
  2. break
    • 含义:停止处理当前的rewrite指令集,不再重新寻找location,直接使用当前重写后的 URI 进行请求处理。
    • 示例:rewrite ^/restricted/(.+)$ /private/$1 break;
    • 应用场景:在不希望重新进行location匹配的情况下,直接使用重写后的 URI 处理请求,比如访问受限制资源时。
  3. redirect
    • 含义:返回 302 临时重定向响应,告诉客户端请求的资源已临时移动到新的 URL
    • 示例:rewrite ^/temp - move/(.*)$ http://example.com/new - temp - loc/$1 redirect;
    • 应用场景:当资源临时移动到其他位置,希望客户端下次请求时能自动访问新位置时使用。
  4. permanent
    • 含义:返回 301 永久重定向响应,告诉客户端请求的资源已永久移动到新的 URL。
    • 示例:rewrite ^/old - product/(.*)$ http://example.com/new - product - line/$1 permanent;
    • 应用场景:当资源永久移动到其他位置,希望搜索引擎等客户端更新其索引时使用。

三、实验示例一

一、实验环境搭建

  1. 安装 Nginx
    • 在 Linux 系统(如 Ubuntu)上执行以下命令安装 Nginx:
      • sudo apt update
      • sudo apt install nginx -y
      • 启动 Nginx 服务:sudo service nginx start
      • 检查 Nginx 状态:sudo service nginx status
  2. 配置文件位置
    • Nginx 的主配置文件通常位于/etc/nginx/nginx.conf,但为了更好的组织配置,我们可以在/etc/nginx/conf.d/目录下创建自定义的配置文件,例如test.conf

二、实验配置

  1. /etc/nginx/conf.d/目录下创建并编辑test.conf文件:
    • sudo vi /etc/nginx/conf.d/test.conf
    • 内容如下:
      • server {
            listen       80;
            server_name  localhost;
        
            location / {
                root   /var/www/html;
                index  index.html index.htm;
            }
        
            # 重写规则:将以 /old/ 开头的URL重写为 /new/index.html
            location /old/ {
                rewrite ^/old/(.*)$ /new/index.html permanent;
            }
        
            # 条件重写规则:如果请求的文件不存在,将 /search/ 开头的请求重定向到 /404.html
            location /search/ {
                try_files $uri $uri/ /404.html;
                if ($uri ~* ^/search/(.*)$) {
                    rewrite ^ /404.html break;
                }
            }
        }
        
  2. 创建测试文件:
    • /var/www/html目录下创建以下文件:
      • sudo mkdir -p /var/www/html/old
      • sudo mkdir -p /var/www/html/new
      • sudo touch /var/www/html/old/test.txt
      • sudo touch /var/www/html/new/test.html
      • sudo touch /var/www/html/404.html

三、实验测试

  1. 测试重写规则
    • 在浏览器中访问http://localhost/old/test.txt,由于重写规则,应该会被 301 永久重定向到http://localhost/new/index.html
  2. 测试条件重写规则
    • 在浏览器中访问http://localhost/search/nonexistent,由于try_files指令找不到请求的文件,并且满足if条件,会直接使用/404.html进行响应,而不会进行进一步的搜索或重定向循环。 

四、 实验结果图

通过这个实验,你可以更深入地理解 Nginx 的 Rewrite 功能以及如何结合try_filesif等指令来实现复杂的 URL 处理逻辑,同时通过具体的文件访问测试来验证配置的正确性。

四、实验示例二 

一、实验环境搭建

  1. 安装 Nginx

    • 登录到 CentOS 系统,打开终端,执行以下命令来更新系统软件包,确保系统处于最新状态:
      • yum update -y
    • 接着安装 Nginx:
      • yum install nginx -y
    • 启动 Nginx 服务:
      • systemctl start nginx
    • 检查 Nginx 服务是否成功启动:
      • systemctl status nginx
      • 如果看到类似 “active (running)” 的状态信息,说明 Nginx 已成功启动。
  2. 配置文件位置及准备

    • Nginx 的主配置文件通常位于/etc/nginx/nginx.conf,为了便于管理本次实验相关配置,我们在/etc/nginx/conf.d/目录下创建一个自定义配置文件,命名为rewrite_test.conf。可以使用以下命令创建并编辑该文件:
      • vi /etc/nginx/conf.d/rewrite_test.conf

二、实验配置

  1. vi编辑器中,输入以下内容来配置rewrite_test.conf文件(按i键进入插入模式进行编辑,编辑完成后按Esc键,再输入:wq保存并退出):
server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;

    # 使用last标志的重写规则
    location /page1/ {
        rewrite ^/page1/(.*)$ /newpage1/$1 last;
    }

    # 使用break标志的重写规则
    location /page2/ {
        rewrite ^/page2/(.*)$ /newpage2/$1 break;
    }

    # 使用redirect标志的重写规则
    location /page3/ {
        rewrite ^/page3/(.*)$ /newpage3/$1 redirect;
    }

    # 使用permanent标志的重写规则
    location /page4/ {
        rewrite ^/page4/(.*)$ /newpage4/$1 permanent;
    }
}
  1. 创建测试文件及目录:
    • /usr/share/nginx/html目录下创建以下目录和文件,使用以下命令:
      • 创建目录:
        • mkdir -p /usr/share/nginx/html/page1
        • mkdir -p /usr/share/nginx/html/newpage1
        • mkdir -p /usr/share/nginx/html/page2
        • mkdir -p /usr/share/nginx/html/newpage2
        • mkdir -p /usr/share/nginx/html/page3
        • mkdir -p /usr/share/nginx/html/newpage3
        • mkdir -p /usr/share/nginx/html/page4
        • mkdir -p /usr/share/nginx/html/newpage4
  1. 创建测试文件及目录:
    • /usr/share/nginx/html目录下创建以下目录和文件,使用以下命令:
      • 创建目录:
        • mkdir -p /usr/share/nginx/html/page1
        • mkdir -p /usr/share/nginx/html/newpage1
        • mkdir -p /usr/share/nginx/html/page2
        • mkdir -p /usr/share/nginx/html/newpage2
        • mkdir -p /usr/share/nginx/html/page3
        • mkdir -p /usr/share/nginx/html/newpage3
        • mkdir -p /usr/share/nginx/html/page4
        • mkdir -p /usr/share/nginx/html/newpage4
      • 创建index.html文件并编辑内容(以page1相关为例,其他同理):
        • /usr/share/nginx/html/page1目录下创建index.html文件:
          • vi /usr/share/nginx/html/page1/index.html
          • 输入以下内容(可自行调整内容用于区分不同页面):
            • <html><body><h1>Page 1</h1></body></html>
              
        • 按照同样的方式,在/usr/share/nginx/html/newpage1目录下创建index.html文件,内容可设为:
          • <html><body><h1>New Page 1</h1></body></html>
            
        • 依次为page2newpage2page3newpage3page4newpage4等目录下创建相应的index.html文件,并设置不同的简单内容用于区分,比如在page2对应的index.html中写<html><body><h1>Page 2</h1></body></html>,在newpage2对应的index.html中写<html><body><h1>New Page 2</h1></body></html>,以此类推。

三、实验测试

  1. 测试 last 标志
    • 打开浏览器,在地址栏输入http://localhost/page1/,按下回车键。由于last标志的作用,Nginx 会停止处理当前的rewrite指令集,并重新开始在当前配置的server块内寻找新的location来处理请求。此时,请求会被重定向到/newpage1/,然后 Nginx 会在/usr/share/nginx/html/newpage1目录下查找index.html文件,并将该文件内容返回给浏览器,你可以看到浏览器页面中显示的标题为 “New Page 1”。
  2. 测试 break 标志
    • 在浏览器地址栏输入http://localhost/page2/,回车后,因为break标志,Nginx 会停止处理当前的rewrite指令集,不再重新寻找location,直接使用当前重写后的 URI(/newpage2/)进行请求处理,接着在/usr/share/nginx/html/newpage2目录下查找index.html文件,并将其内容返回给浏览器,页面中会显示 “New Page 2” 字样。
  3. 测试 redirect 标志
    • 访问http://localhost/page3/redirect标志会使 Nginx 返回 302 临时重定向响应,告诉客户端请求的资源已临时移动到/newpage3/。浏览器收到这个临时重定向响应后,会自动向/newpage3/发起新的请求,然后 Nginx 在/usr/share/nginx/html/newpage3目录下查找index.html文件,并将其内容返回给浏览器,此时页面显示 “New Page 3”。你还可以通过浏览器的开发者工具(一般按F12键调出),查看网络请求的详细信息,确认返回的状态码是 302。
  4. 测试 permanent 标志
    • 输入http://localhost/page4/进行访问,permanent标志会让 Nginx 返回 301 永久重定向响应,告知客户端请求的资源已永久移动到/newpage4/。浏览器会更新书签以及搜索引擎索引等相关信息,下次再访问/page4/时,就会直接请求/newpage4/。同样,Nginx 会在/usr/share/nginx/html/newpage4目录下查找index.html文件并返回其内容,使浏览器页面显示 “New Page 4”。通过浏览器开发者工具查看网络请求,能确认返回的状态码为 301,并且后续再次访问http://localhost/page4/时,浏览器会直接跳转到/newpage4/,不再需要从/page4/进行重定向了。

四、实验分析

  1. last 标志的行为
    • last标志使得 Nginx 在执行完当前重写规则后,重新进行location匹配流程。这在实际应用中非常实用,例如当网站的页面结构调整后,某个旧路径下的页面需要重定向到新路径,且新路径对应的处理逻辑在其他location块中有更复杂的配置时,last标志就能确保请求按照新路径对应的location规则进行后续处理,有助于实现灵活的页面跳转和资源分配逻辑,方便对不同路径的请求进行分类管理以及定制化响应。
  2. break 标志的行为
    • break标志的特点是直接使用重写后的 URI 进行后续请求处理,不再进行额外的location匹配操作。在一些特定场景下,比如当对某些特定路径的请求进行内部重写,并且重写后的资源处理逻辑已经明确固定时,使用break标志可以避免不必要的location查找过程,快速将请求引导到正确的资源位置,从而提高服务器的处理效率,减少资源消耗,同时也能避免因复杂的location匹配可能导致的一些潜在冲突或错误。
  3. redirect 和 permanent 标志的区别
    • redirect(302 临时重定向)和permanent(301 永久重定向)这两个标志主要在对客户端和搜索引擎的影响方面存在差异。302临时重定向意味着资源只是暂时被移动到了新的位置,客户端下次访问时可能仍然会尝试访问原来的 URL;而301永久重定向则明确告知客户端和搜索引擎相关资源已经永久性地迁移到了新的 URL。搜索引擎收到 301 响应后,会更新其索引信息,以后搜索相关内容时就会直接指向新的 URL。在实际的网站运营中,根据页面或资源移动的性质来合理选择使用这两个标志十分重要,例如网站进行大规模重构,部分页面 URL 发生永久性变更时,使用permanent标志有助于搜索引擎及时更新索引,提升网站在搜索结果中的排名以及用户访问的准确性;而如果只是临时进行页面维护、测试或者短期内调整页面位置等情况,则可以采用redirect标志,避免对搜索引擎索引造成不必要的频繁变动和可能出现的混乱情况。

通过这个实验,能够清晰地观察和理解 Nginx Rewrite 规则中不同标志(flag)对处理请求的 URI 重写和重定向行为的影响,有助于在实际的 Web 服务器配置工作中,依据具体的业务需求准确选择合适的重写策略和标志,进而优化网站的 URL 结构、提升资源访问的效率以及改善用户体验和搜索引擎优化效果。同时,在实验过程中通过创建配套的测试文件和目录,并结合浏览器访问及查看开发者工具中的状态码等操作,可以更精准地验证不同标志的功能和作用,保证实验结果的可靠性和有效性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943220.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

适用于Synology NAS的在线办公套件:ONLYOFFICE安装指南

使用 Synology NAS 上的 ONLYOFFICE 文档&#xff0c;您能在私有云中直接编辑文本文档、电子表格、演示文稿和 PDF&#xff0c;确保工作流程既安全又高效。本指南将分步介绍如何在 Synology 上安装 ONLYOFFICE 文档。 关于 Synology Synology NAS&#xff08;网络附加存储&…

[按键精灵IOS安卓版][脚本基础知识]按键post基本写法

这一期我们来讲按键post的写法&#xff0c;希望通过本期的学习&#xff0c;实现常见的post提交都能编写。 下面开始讲解&#xff1a; 一、使用的命令&#xff1a;url.httppost 选用这个命令的理由是它的参数比较全。 二、post请求都有哪些参数&#xff08;可能用到&#xf…

如何检查交叉编译器gcc工具链里是否有某个库(以zlib库和libpng库为例)

freetype 依赖于 libpng&#xff0c;libpng 又依赖于 zlib&#xff0c;所以我们应该&#xff1a;先编译 安装 zlib&#xff0c;再编译安装 libpng&#xff0c;最后编译安装 freetype。 但是&#xff0c;有些交叉编译器工具链里已经有 zlib库和freetype&#xff0c;所以我们需要…

3D几何建模引擎Parasolid功能解析

一、什么是Parasolid&#xff1f; Parasolid是由Siemens PLM Software开发的高精度精密几何建模引擎。它全面评估CAD&#xff08;计算机辅助设计&#xff09;、CAM&#xff08;计算机辅助制造&#xff09;、CAE&#xff08;计算机辅助工程&#xff09;、PLM&#xff08;产品生…

基于STM32单片机矿井矿工作业安全监测设计

基于STM32单片机矿井矿工作业安全监测设计 目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块技术详情介绍总结 1. 项目开发背景 随着矿井矿工作业环境的复杂性和危险性逐渐增加&#xff0c;矿井作业安全问题引起了社会各界的广泛关注。传统的…

linux-22 目录管理(二)rmdir命令,删除目录

那接下来我们来看看我们如何去删除目录&#xff1f;那接下来我们来看看我们如何去删除目录&#xff1f;叫remove&#xff0c;remove表示移除的意思&#xff0c;remove directory叫移除目录。所以简写为rmdir&#xff0c;但需要注意&#xff0c;它只能删除空目录&#xff0c;只能…

计算机考研选西电还是成电?

谢邀~先来个总结&#xff1a;电子科技大学计算机综合实力优于西安电子科技大学&#xff0c;但是&#xff0c;二者计算机学硕考研难度没有太大差距&#xff0c;而且考试难度也同属于一个水平&#xff0c;成电性价比更高一些&#xff01;推荐同学优先报考作为985的电子科技大学&a…

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中&#xff0c;安全始终是首要考虑的因素之一。特别是在施工现场&#xff0c;工人佩戴安全帽是确保人身安全的基本要求。然而&#xff0c;人工监督难免会有疏漏&#xff0c;尤其是在大型工地或复杂环境中&#xff0c;确保每个人都佩戴安全帽变得非…

oscp学习之路,Kioptix Level2靶场通关教程

oscp学习之路&#xff0c;Kioptix Level2靶场通关教程 靶场下载&#xff1a;Kioptrix Level 2.zip 链接: https://pan.baidu.com/s/1gxVRhrzLW1oI_MhcfWPn0w?pwd1111 提取码: 1111 搭建好靶场之后输入ip a看一下攻击机的IP。 确定好本机IP后&#xff0c;使用nmap扫描网段&…

yii2 手动添加 phpoffice\phpexcel

1.下载地址&#xff1a;https://github.com/PHPOffice/PHPExcel 2.解压并修改文件名为phpexcel 在yii项目的vendor目录下创建一个文件夹命名为phpoffice 把phpexcel目录放到phpoffic文件夹下 查看vendor\phpoffice\phpexcel目录下会看到这些文件 3.到vendor\composer目录下…

弹性盒子(display: flex)布局超全讲解|Flex 布局教程

文章目录 弹性盒子flex什么是弹性布局&#xff1f;弹性布局的特点&#xff1f;justify-contentalign-itemflex-direction (主轴的方向&#xff1a;水平或者垂直)flex-wrapflex-flowalign-contentflex-grow 属性flex-shrink 属性flex-basis 属性flex 属性align-self 属性 弹性盒…

基于c语言的union、字符串、格式化输入输出

结构体之共用体union 共用体也叫联合体&#xff0c;其关键词为union 与结构体不同的是&#xff0c;共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间&#xff0c;由于同一内存单元在同一时间内只能存放其中一种的数据类型&#xff0c;因此在每…

【全栈开发】----用pymysql库连接MySQL,批量存入

本文基于前面的MySQL基础语句使用&#xff0c;还不会的宝子可以先回去看看&#xff1a; 全栈开发----Mysql基本配置与使用-CSDN博客 仅仅用控制台命令对数据库进行操作&#xff0c;虽然大部分操作都很简单&#xff0c;但对于大量数据的存入&#xff0c;存储数据将会变得很繁琐&…

PyQt实战——使用python提取JSON数据(十)

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…

51单片机学习笔记——找不到REG52.H头文件,点亮一个LED

创建工程 将STC型号导入keil并使用 STC可以从官网下载&#xff0c;也可我这的网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bO85DPN3IFaXGhiKSwyOrA?pwd7f4h 提取码&#xff1a;7f4h 打开STC&#xff0c;选择“keil仿真设置”&#xff0c;选择“添加型号和头…

windows和mac共享文件夹访问教程

mac共享文件夹&#xff0c;windows访问&#xff1a; mac上开启文件夹共享&#xff0c;并添加文件夹和用户&#xff0c;然后windows 上 在windows上快捷键 win r 打开运行&#xff0c;按如下格式输入mac设备的IP地址&#xff1a; 就可以访问了&#xff1a; windows共享文件夹…

webauthn介绍及应用

1、webauthn介绍 官网&#xff1a;https://webauthn.io/ 1.1、什么是webauthn&#xff1f; webauthn即Web Authentication&#xff0c;是一个符合W3C标准的Web认证规范。它通过公私钥加密技术&#xff0c;实现无密码认证&#xff0c;用户仅需通过pin码、指纹、面部识别、usb …

iOS AccentColor 和 Color Set

AccentColor 和 Color Set 都是 Xcode 中用于颜色管理的功能&#xff0c;它们适用于不同的开发场景和需求。以下是它们的区别和应用场景分析&#xff1a; 1. AccentColor&#xff08;强调色&#xff09; 1.1 概念&#xff1a; • AccentColor 是在 Xcode 12 中引入的&#xf…

TiDB 的MPP架构概述

MPP架构介绍&#xff1a; 如图&#xff0c;TiDB Server 作为协调者&#xff0c;首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换&#xff0c;让表连接在一个TiFlash上。另外 TiFlash会作为计算节点&#xff0c;每个TiFlash都负责数据交换&#xff0c;表连接…

git回退指定版本/复制提交id

1.使用“git reset --hard 目标版本号”命令将版本回退2.使用“git push -f”提交更改 因为我们回退后的本地库HEAD指向的版本比远程库的要旧&#xff0c;此时如果用“git push”会报错。 改为使用 git push -f 即可完成回退后的提交。