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.htmllocation /old/ {rewrite ^/old/(.*)$ /new/index.html permanent;}# 条件重写规则:如果请求的文件不存在,将 /search/ 开头的请求重定向到 /404.htmllocation /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.mzph.cn/news/890788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GA-Kmeans-Transformer时序聚类+状态识别组合模型

创新研究亮点&#xff01;GA-Kmeans-Transformer时序聚类状态识别组合模型 目录 创新研究亮点&#xff01;GA-Kmeans-Transformer时序聚类状态识别组合模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.创新研究亮点&#xff01;GA-Kmeans-Transformer时序聚类状态识…

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…

阻塞队列BlockingQueue实战及其原理分析

1. 阻塞队列介绍 1.1 队列 是限定在一端进行插入&#xff0c;另一端进行删除的特殊线性表。先进先出(FIFO)线性表。允许出队的一端称为队头&#xff0c;允许入队的一端称为队尾。 数据结构演示网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.ht…

hadoop搭建

前言 一般企业中不会使用master slave01 slave02来命名 vmware创建虚拟机 打开vmware软件&#xff0c;新建虚拟机 典型 稍后安装系统 选择centos7 虚拟机名称和安放位置自行选择&#xff08;最小化安装消耗空间较少&#xff09; 默认磁盘大小即可 自定义硬件 选择centos7的i…

测试 - 1 ( 9000 字详解 )

一&#xff1a; 测试入门 测试是指运用特定的方法、手段或工具&#xff0c;对某一对象进行验证、检查或评估&#xff0c;判断其是否符合预期标准或目标。例如&#xff0c;修理好一盏灯后通过按开关测试其是否正常工作&#xff1b;通过一次数学测验评估学生对代数知识的掌握程度…

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法(无目标函数)含特征变量置信区间分析

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法&#xff08;无目标函数&#xff09;含特征变量置信区间分析 一、介绍 PAWN&#xff08;Probabilistic Analysis With Numerical Uncertainties&#xff09;是一种基于密度的全局敏感性分析&#xff08;Gl…

DX12 快速教程(2) —— 渲染天蓝色窗口

快速导航 新建项目 "002-DrawSkyblueWindow"DirectX 12 入门1. COM 技术&#xff1a;DirectX 的中流砥柱什么是 COM 技术COM 智能指针 2.创建 D3D12 调试层设备&#xff1a;CreateDebugDevice什么是调试层如何创建并使用调试层 3.创建 D3D12 设备&#xff1a;CreateD…

【合作原创】使用Termux搭建可以使用的生产力环境(八)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;七&#xff09;-CSDN博客中我们讲到了安装百度网盘、VS Code还有java&#xff0c;这篇我打算讲一下最后的编程&#xff0c;还有输入法相关问题解决。众所周知我的本职工作是Java程序猿&#xff0c;因…

VLMs之Gemma 2:PaliGemma 2的简介、安装和使用方法、案例应用之详细攻略

VLMs之Gemma 2&#xff1a;PaliGemma 2的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年12月4日&#xff0c;PaliGemma 2是一个基于Gemma 2系列语言模型的开源视觉语言模型 (VLM) 家族。PaliGemma 2 通过提供一个规模化、多功能且开源的VLM家族&#xff0c;…

24.12.26 SpringMVCDay01

SpringMVC 也被称为SpringWeb Spring提供的Web框架,是在Servlet基础上,构建的框架 SpringMVC看成是一个特殊的Servlet,由Spring来编写的Servlet 搭建 引入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc<…

国产 HighGo 数据库企业版安装与配置指南

国产 HighGo 数据库企业版安装与配置指南 1. 下载安装包 访问 HighGo 官方网站&#xff08;https://www.highgo.com/&#xff09;&#xff0c;选择并下载企业版安装包。 2. 上传安装包到服务器 将下载的安装包上传至服务器&#xff0c;并执行以下命令&#xff1a; [rootmas…

Java程序设计,使用属性的选项库,轻松实现商品检索的复杂查询(上)

一、背景 本文我们以某商城的商品检索为例,说一说如何使用属性及选项,实现复杂的逻辑表达式的查询。 先贴图,总结出业务需求。 可以通过一系列属性及选项的组合,过滤出用户想要的商品列表。 1、属性 上文中的品牌、分类、屏幕尺寸、CPU型号、运行内存、机身内存、屏幕材…

机器学习(二)-简单线性回归

文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …

WHAT KAN I SAY?Kolmogorov-Arnold Network (KAN)网络结构介绍及实战(文末送书)

一、KAN网络介绍 1.1 Kolmogorov-Arnold Network (KAN)网络结构的提出 2024年4月&#xff0c;来自MIT、加州理工学院、东北大学等团队的研究&#xff0c;引爆了一整个科技圈&#xff1a;Yes We KAN&#xff01; 这种创新方法挑战了多层感知器(Multilayer Perceptron&#xff…

YOLO11改进-模块-引入星型运算Star Blocks

当前网络设计中&#xff0c;“星型运算”&#xff08;逐元素乘法&#xff09;的应用原理未被充分探究&#xff0c;潜力有待挖掘。为解决此问题&#xff0c;我们引入 Star Blocks&#xff0c;其内部由 DW - Conv、BN、ReLU 等模块经星型运算连接&#xff0c;各模块有特定参数。同…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖&#xff0c;前往 官网下载 pcre2依赖下载&#xff0c;前往Git下载 zlib依赖下载&#xff0c;前往Git下载 下载完成后完整的包如下&#xff1a; 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

【理解机器学习中的过拟合与欠拟合】

在机器学习中&#xff0c;模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示&#xff0c;详细解析过拟合与欠拟合现象&#xff0c;并提出应对策略。主要内容如下&#xff1a; 什么是过拟合和欠拟合&#xff1f; 如何防止过拟合和欠拟…

【婚庆摄影小程序设计与实现】

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

12.26 学习卷积神经网路(CNN)

完全是基于下面这个博客来进行学习的&#xff0c;感谢&#xff01; ​​【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别_pytorch cnn-CSDN博客 基于深度神经网络DNN实现的手写数字识别&#xff0c;将灰度图像转换后的二维数组展平到一维&#xff0c;…

Unity URP多光源支持,多光源阴影投射,多光源阴影接收(优化版)

目录 前言&#xff1a; 一、属性 二、SubShader 三、ForwardLitPass 定义Tags 声明变体 声明变量 定义结构体 顶点Shader 片元Shader 四、全代码 四、添加官方的LitShader代码 五、全代码 六、效果图 七、结语 前言&#xff1a; 哈喽啊&#xff0c;我又来啦。这…