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

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 结构、提升资源访问的效率以及改善用户体验和搜索引擎优化效果。同时,在实验过程中通过创建配套的测试文件和目录,并结合浏览器访问及查看开发者工具中的状态码等操作,可以更精准地验证不同标志的功能和作用,保证实验结果的可靠性和有效性。


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

相关文章:

  • 【竞技宝】LOL:IG新赛季分组被质疑
  • 活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识
  • ABB RobotStudio学习记录(二)SmartGripper模拟
  • DAY178内网渗透之内网对抗:横向移动篇入口差异切换上线IPC管道ATSC任务Impacket套件UI插件
  • BUUCTF Pwn ciscn_2019_es_2 WP
  • AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode和 桔子数据 的 价格对比
  • fopen的概念和使用方法
  • 正则表达式 - 使用总结
  • 多个微服务 Mybatis 过程中出现了Invalid bound statement (not found)的特殊问题
  • 系统分析师案例分析100问
  • 【Leetcode 热题 100】78. 子集
  • 提升生产力工具
  • ShaderJoy ——一种可交互的翻页效果【GLSL】
  • OpenCV-Python实战(11)——边缘检测
  • Kafka的acks机制和ISR列表
  • [Win32/WTL]_[初级]_[如何销毁自定义控件]
  • Axure RP 8安装(内带安装包)
  • python 打印圣诞树
  • AI笔记-查漏补缺
  • 3.4欧拉角插补
  • Datawhale-AI冬令营二期
  • leetcode hot 100 单词搜索
  • 【Axure高保真原型】输入框控制标签
  • 探索Spring Cloud Config:构建高可用的配置中心
  • 5.npm包
  • 如何配置线程池参数,才能创建性能最好、最稳定的Spring异步线程池?