nginx rewrite指令的深入理解

目录

  • 1. 指令格式
  • 2. rewrite指令
  • 3. break指令
  • 4. return指令

   nginx提供了强大的url rewrite功能。在nginx http模块的11个处理阶段中,有NGX_HTTP_SERVER_REWRITE_PHASE和NGX_HTTP_REWRITE_PHASE两个阶段来进行url rewrite的处理。而last、break、redirect、permenent几个关键字可以影响rewrite的行为,特别是last和break在概念上区别不是那么清晰,本来自己也对这个概念比较模糊,因此通过对nginx官方文档的理解,来学习和加深了解。

1. 指令格式

  首先来看一下rewrite指令的格式:

语法:	rewrite regex replacement [flag];
上下文:	server, location, if

  其中flag参数可以设置成以上四个关键字之一。

  另外nginx又单独提供了break和return两个指令,而不需要写在rewrite指令中,只不过这写指令都是有ngx_http_rewrite_module模块来定义的。

语法:	break;
上下文:	server, location, if
语法:	return code [text];return code URL;return URL;
上下文:	server, location, if

2. rewrite指令

  当一个请求的uri匹配到了配置的某个rewrite指令的正则表达式以后,uri将被修改为replacement替换规则定义的新的uri。rewrite指令的匹配顺序是按照在配置文件中定义的先后顺序的执行的。而且根据rewrite指令设置的flag标记可以停止后续的进一步的处理工作。如果replacement字符串是http://或者https://或者$scheme开头的,那么nginx将发送http redirect响应给客户端并且停止后续的处理。

  • last标记:
      停止当前这组url rewrite指令,并让nginx按照当前rewrite后的uri开始查找新的location。

  • break标记:
      停止当前这组url rewrite指令,如果当前的rewrite指令是在location块里面,那么和last不同,接下去的处理将局限在当前的location之内。

  • redirect标记:
      给客户端响应一个302重定向,重定向地址为当前url rewrite后的uri地址,这个标记是在replacement字符串不是以http://或者https://或者$scheme://开头的情况的时候进行设置的。

  • permenent标记:
      给客户端响应一个301重定向,重定向地址为当前url rewrite后的uri地址,这个标记是在replacement字符串不是以http://或者https://或者$scheme://开头的情况的时候进行设置的。

  • 没有设置标记:
      nginx将在本组rewrite指令中(包括break和last指令)按顺序从头执行一遍,如果rewrite匹配了,那么当前重写的uri将作为新的uri输入到后续的rewrite中进行匹配。

  用nginx官方文档中的例子:

server {...rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;return  403;...
}

  以上rewrite指令是放在server块中的,而不是location块,那么会将类似 /download/abc/media/test.xx的uri改写成 /download/mp3/test.mp3,然后会执行location查找匹配定位由哪个location来处理客户端的请求,因为这里last标记的定义就是这样子的。
  那么如果把以上rewrite指令放到location里面,还是用last标记,那么会产生nginx超过10次rewrite循环,从而响应500的错误。在location块中,应该改成break标记,一旦匹配完成url rewrite后,就限制在当前location中处理客户端的请求,而不再重新查找location了。

location /download/ {rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;return  403;
}

  因为nginx的NGX_HTTP_SERVER_REWRITE_PHASE阶段是在location查找之前发生的,那么在server块中的last和break标记是没有什么差异的,最终还是会进入location查找。last和break的差异主要是体现在location块中的rewrite指令。

3. break指令

  break指令的含义和rewrite指令中的break标记的含义是相同的,它将停止当前这组ngx_http_rewrite_module指令的执行。如果break是在location块里面的,那么nginx将限制请求的处理仍然限制在当前的location中执行。

4. return指令

  执行到这个指令的时候,nginx直接返回一个http状态码和状态信息,或者如果是301/302/307/308状态码,则可以指定一个重定向的url。

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

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

相关文章

政安晨:【完全零基础】认知人工智能(四)【超级简单】的【机器学习神经网络】—— 权重矩阵

预备 如果小伙伴们第一次看到这篇文章,同时也对这类知识还是稍感陌生的话,可以先看看我这个系列的前三篇文章: 政安晨:【完全零基础】认知人工智能(一)【超级简单】的【机器学习神经网络】 —— 预测机ht…

【vue】组件通信方式介绍

当深入分析Vue 2的组件通信方式时,我们可以进一步详细地了解以下几种方法,并探讨它们的优缺点以及适用场景: Props & Events(父子组件通信): Props: 父组件通过props属性向子组件传递数据。子组件可以通过props选项…

【ARMv8M Cortex-M33 系列 8 -- RT-Thread 移植 posix pthread】

文章目录 RT-Thread POSIX PthreadRT-Thread Pthread 相关宏定义RT-Thread libc 初始化RT-Thread Pthread 测试 RT-Thread POSIX Pthread pthread是POSIX(Portable Operating System Interface)标准定义的一套线程相关的API,全称为POSIX Thr…

【Spring连载】使用Spring Data访问 MongoDB(一)----快速指南

【Spring连载】使用Spring Data访问 MongoDB(一)----快速指南 一、版本要求 一、版本要求 Spring Data MongoDB 4.x二进制文件需要JDK级别17及以上版本和Spring Framework 6.1.4及以上版本。 在数据库和驱动程序方面,你需要至少4.x版本的Mon…

jenkins离线安装一波

内网安装jenkins对于没有外网的看过来 插件下载神器-jenkins-plugin-manager 首先下载jenkins,官网地址我就不贴了下载完正常运行,开始界面不要选择任何插件安装,选择无去下载一个插件下载工具https://github.com/jenkinsci/plugin-installa…

《Solidity 简易速速上手小册》第1章:Solidity 和智能合约简介(2024 最新版)

文章目录 1.1 Solidity 的起源和重要性1.1.1 基础知识解析1.1.2 重点案例:去中心化金融 (DeFi) 平台案例 Demo:简易借贷平台 1.1.3 拓展案例 1:NFT 市场案例 Demo:简易 NFT 市场 1.1.4 拓展案例 2:智能合约管理的投票系…

C++ 区间合并 算法(详解) + 例题

1、定义 把所有,有交集的区间合并 图解: 2、实现 步骤如下: 1、首先按照每个区间左端点排序 2、扫描 所有区间,进行区间合并 上述第二条,可以理解为:拿出一个区间去跟它后面的所有的区间去进行合并&…

electron Tab加载动画开启和关闭

记个开发中的bug,以此为鉴。眼懒得时候手勤快点儿,不要想当然!!! 没有转载的价值,请勿转载搬运呦。 WebContents API: Event: did-finish-load​ 导航完成时触发,即选项卡的旋转…

conda 进入python环境里pip install安装不到该环境或不生效

参考:https://blog.csdn.net/weixin_47834823/article/details/128951963 https://blog.51cto.com/u_15060549/4662570?loginfrom_csdn 1、直接进入python Scripts目录下安装 cmd打开运行窗口,cd切换路径至指定虚拟环境下的Scripts路径后再pip安装 擦…

Asp.Net web 文件服務快速搭建

簡述 內容具體分為兩種分為上傳和下載部分,服務搭載仍然選擇IIS,內容還是相對簡單,只是內部使用,沒有使用太多的優化的技巧,net環境為4.7 上傳服務 上傳需要注意的是,HttpPostedFileBase 不支持大文件傳輸&#xff0…

文件上传漏洞--Upload-labs--Pass10--双写绕过

一、什么是双写绕过 顾名思义,双写绕过就是双写文件后缀名来进行绕过,如:test.php 双写后为 test.pphphp。通常情况下双写绕过用于绕过源代码中的 str_ireplace()函数。 二、双写绕过原理 1、首先进行代码审计,源代码中有黑名单…

ADO.NET大数据查询内存分页处理

ADO.NET大数据查询内存分页处理 在ADO.NET中处理大数据查询时,如果直接在客户端应用程序中进行内存分页,可能会导致内存使用量激增,特别是在处理数十万甚至数百万条记录时。为了避免这种情况,应该优先使用数据库层面的分页&#x…

Java 的 8 种异步实现方式

异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实…

NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue

项目是fork的Naccl大佬NBlog项目,页面做的相当漂亮,所以选择了这个。可以参考2.3的效果图 惭愧,工作两年了也没个自己的博客系统,趁着过年时间,开始搭建一下. NBlog原项目的github链接:Naccl/NBlog: &#…

数据库||数据库的完整性

1.实验题目:数据库的完整性 2.实验目的和要求: 掌握数据库的实体完整性约束定义,完整性检查及违约处理方式。 掌握数据库的参照完整性约束定义,完整性检查及违约处理方式。 掌握数据库的用户定义完整性约束定义,完…

如何构建企业专属GPT

大语言模型(LLM)具有令人印象深刻的自然语言理解和生成能力, 2022年11月底OpenAI发布了ChatGPT,一跃成为人工智能AI领域的现象级应用。但由于LLM的训练数据集主要来源于互联网数据,企业私域信息并未被LLM所训练&#x…

LeetCode 3028.边界上的蚂蚁

边界上有一只蚂蚁&#xff0c;它有时向 左 走&#xff0c;有时向 右 走。 给你一个 非零 整数数组 nums 。蚂蚁会按顺序读取 nums 中的元素&#xff0c;从第一个元素开始直到结束。每一步&#xff0c;蚂蚁会根据当前元素的值移动&#xff1a; 如果 nums[i] < 0 &#xff0…

如何从 git 分支中合并特定文件,而不是整个分支的内容

问题 在git 中&#xff0c;我们可以使用 git merge 命令&#xff0c;合并整个分支&#xff0c;覆盖当前分支的内容&#xff0c;但是有时候我们并不想这么做&#xff0c;而是想 merge 某个文件。那么下面提供两种办法。 方法一 使用 git checkout&#xff0c;从别的分支&…

MySQL进阶 - 备份与恢复

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…