Nginx(五) break,if,return,rewrite和set指令的执行顺序深究
本篇文章主要对break,if,return,rewrite和set这5个指令的执行顺序进行深究,如需了解这5个指令的功能和配置,请参考另一篇文章 Nginx(三) 配置文件详解
由于文章篇幅较长,所以我就先把结论贴出来,再看测试结果。
1.server层执行完break指令后,该层级所有跟ngx_http_rewrite_module模块相关的指令都不再被执行,但不影响location层ngx_http_rewrite_module模块相关的指令执行;
2.location层执行完break指令后,会直接终止整个请求处理过程(后续其它指令也不再被执行),且请求不会被重定向,nginx根据最终请求路径(此时不再匹配location)将请求结果返回给客户端;
3.无论在哪个层级执行完return指令后,请求处理过程都会立刻终止并将指定的code、重定向URL、响应正文文本返回给客户端。
4.server层ngx_http_rewrite_module模块相关的指令是按照配置顺序依次执行;
说完结论后,我们再将原文3.3章节的所有知识结合起来一起做个测试。
基本配置如下
http {log_subrequest on; # 开启将子请求日志记录到access.log中log_format format2 escape=json '{''"SN":"$sn",' #自定义变量sn '"http_host":"$http_host",''"remote_addr":"$remote_addr",''"time_iso8601":"$time_iso8601",''"request":"$request",''"http_referer":"$http_referer",''"request_time":"$request_time",''"request_length":"$request_length",''"status":"$status",''"bytes_sent":"$bytes_sent",'#'"body_bytes_sent":"$body_bytes_sent",''"user_agent":"$http_user_agent",''}';access_log logs/access.log format2;absolute_redirect on;server_name_in_redirect off;port_in_redirect on;root pages; # 根目录设置为psges,该目录下只有index.html、test.html、one.html、two.html、three.htmlserver {listen 8688;server_name www.read*******.cn;root pages;# 下面配置本次测试的指令······}
}
测试1:
server {···break;rewrite /t1 /test.html;set $sn 1; # 该变量最终值将记录到access.log中。if ($sn = 1) {set $sn 2;break;set $sn 3;}return 500;location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 404 |
| error.log日志输出 | *878 open() "/usr/local/nginx/pages/t1" failed (2: No such file or directory) |
| access.log日志输出 | {"SN":"" |
| 最终请求地址 | host:8688/t1 |
| 结论 | 1.在请求重写指令未执行前就执行了break,导致server层级下所有跟ngx_http_rewrite_module模块相关的指令都不再执行,所以请求并未重写,请求路径不变。if、set、return指令都未执行。 2.location中未匹配到/t1,且pages文件夹下没有t1文件,所以返回404。 |
测试2:
server {···rewrite /t1 /test.html;set $sn 1; # 该变量最终值将记录到access.log中。if ($sn = 1) {set $sn 2;break;set $sn 3;}return 500;location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 200 |
| error.log日志输出 | 无 |
| access.log日志输出 | {"SN":"2" |
| 最终请求地址 | host:8688/test.html |
| 结论 | 请求被重写,执行完break后,"set $sn 3"和"return"指令未执行。 server层,ngx_http_rewrite_module 模块相关指令按照配置顺序依次执行。 server层执行break后,该层级所有跟ngx_http_rewrite_module模块相关的指令都不再执行。 |
测试3:
server {···rewrite /t1 /test.html;return 500;set $sn 1; # 该变量最终值将记录到access.log中。location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 500 |
| error.log日志输出 | 无 |
| access.log日志输出 | {"SN":"" |
| 最终请求地址 | |
| 结论 | server层执行完return后,请求处理过程会立刻终止,并将指定code返回给客户端。 |
测试4:
server {···rewrite /t1 /t2;rewrite /t2 /t3;set $sn 1; # 该变量最终值将记录到access.log中。if ($sn = 1) {set $sn 2;break;set $sn 3;}location /t2 {rewrite /t2 /test.html;}location /t3 {rewrite /t3 /t4;if ($sn = 2) {set $sn 31;rewrite /t4 /t5;break;set $sn 32;rewrite /t5 /t6;}set $sn 33;rewrite /t5 /p1;rewrite /t6 /p2;}location /t5 {set $sn 51;rewrite /t5 /p3;}location /t6 {set $sn 61;rewrite /t6 /p4;}location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 404 |
| error.log日志输出 | *890 open() "/usr/local/nginx/pages/t5" failed (2: No such file or directory) |
| access.log日志输出 | {"SN":"31" |
| 最终请求地址 | host:8688/t5 |
| 结论 | 1.server或location层ngx_http_rewrite_module模块相关的指令正常情况下按照配置顺序依次执行; 2.server层执行break后,该层级所有跟ngx_http_rewrite_module模块相关的指令都不再执行,但不影响location层ngx_http_rewrite_module模块相关指令的执行。 3.location层执行完break指令后,会直接终止整个请求处理过程(后续其它指令也不再被执行),且请求不会被重定向,nginx根据最终请求路径(此时不再匹配location)将请求结果返回给客户端。 |
测试5:
server {···rewrite /t1 /t2;rewrite /t2 /t3;set $sn 1; # 该变量最终值将记录到access.log中。if ($sn = 1) {set $sn 2;break;set $sn 3;}location /t2 {rewrite /t2 /test.html;}location /t3 {rewrite /t3 /t4;return 502;if ($sn = 2) {set $sn 31;rewrite /t4 /t5;break;set $sn 32;rewrite /t5 /t6;}set $sn 33;rewrite /t5 /p1;rewrite /t6 /p2;}location /t5 {set $sn 51;rewrite /t5 /p3;}location /t6 {set $sn 61;rewrite /t6 /p4;}location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 502 |
| error.log日志输出 | 无 |
| access.log日志输出 | {"SN":"2" |
| 最终请求地址 | |
| 结论 | location层执行完return后,请求处理过程会立刻终止,并将指定code返回给客户端。 |
测试6:
server {···rewrite /t1 /t2;rewrite /t2 /t3;set $sn 1; # 该变量最终值将记录到access.log中。if ($sn = 1) {set $sn 2;break;set $sn 3;}location /t2 {rewrite /t2 /test.html;}location /t3 {if ($sn = 2) {rewrite /t3 /p1;rewrite /p1 /t4;}if ($sn = 3) {return 500;}}location /t5 {rewrite /t5 /t6;}location /t4 {rewrite /t4 /t5;}location /t6 {set $sn 61;rewrite /t6 /p2;}location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 404 |
| error.log日志输出 | *897 open() "/usr/local/nginx/pages/p2" failed (2: No such file or directory) |
| access.log日志输出 | {"SN":"61" |
| 最终请求地址 | host:8688/p2 |
| 结论 | 1.server指令按序执行完毕后,根据URI匹配location,如果匹配到就进入对应location再按序执行该模块下的指令。执行完毕后,如果URI被重写就继续匹配location,直到找到最终请求路径。循环匹配location这个过程的循环次数不得超过10次。 |
测试7:
server {···rewrite /t1 /t2;rewrite /t2 /t3;set $sn 1; # 该变量最终值将记录到access.log中。if ($sn = 1) {set $sn 2;break;set $sn 3;}location /t2 {rewrite /t2 /test.html;}location /t3 {rewrite /t3 /t4;return 502;if ($sn = 2) {set $sn 31;rewrite /t4 /t5 last;break;set $sn 32;rewrite /t5 /t6;}set $sn 33;rewrite /t5 /p1;rewrite /t6 /p2;}location /t5 {set $sn 51;rewrite /t5 /p3;}location /t6 {set $sn 61;rewrite /t6 /p4;}location / {index index.html index.htm;}
}
| 请求地址 | host:8688/t1 |
| 请求结果 | 404 |
| error.log日志输出 | *897 open() "/usr/local/nginx/pages/p3" failed (2: No such file or directory) |
| access.log日志输出 | {"SN":"51" |
| 最终请求地址 | host:8688/p3 |
| 结论 |
| 请求地址 | host:8688/t1 |
| 请求结果 | |
| error.log日志输出 | |
| access.log日志输出 | {"SN":"" |
| 最终请求地址 | |
| 结论 |
相关文章:
Nginx(五) break,if,return,rewrite和set指令的执行顺序深究
本篇文章主要对break,if,return,rewrite和set这5个指令的执行顺序进行深究,如需了解这5个指令的功能和配置,请参考另一篇文章 Nginx(三) 配置文件详解 由于文章篇幅较长,所以我就先把结论贴出来,…...
八大学习方法(金字塔模型、费曼学习法、布鲁姆学习模型)
在微博上看到博主发的,觉得总结很好,在此摘录:...
K8S的基础知识
K8S的意义与入门 专有名词 容器:包含了运行一个应用程序所需要的所有东西,包括:代码、运行时、各种依赖和配置。pod:K8s调度的最小单元,包含一个或多个容器。一个容器组中的容器具有紧密耦合性,共享资源,存储空间和IP。即同一个容器组中的容器可以通过localhost:xxx访问…...
java:基于jjwt写一个jwt工具类
背景 在Java中,使用JWT(JSON Web Tokens)相关的包通常包括以下内容: jjwt:JJWT是一个非常流行的Java JWT库,它提供了简单易用的API来创建和验证JWT。jose4j:JOSE4J是一个用于处理JSON Web签名…...
AK F.*ing leetcode 流浪计划之半平面求交
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:半平面求交 背景知识 学习资料 视频讲解 https://www.bilibili.com/video/BV1jL411C7Ct/?spm_id_from333.1007.top_right_bar_window_history…...
docker搭建zokeeper集群、kafka集群
三台机器,ip分别为ip1,ip2,ip3 一、安装docker集群 1、三台机器分别拉取镜像 docker pull wurstmeister/zookeeper 2、三台机器分别运行容器 (1)第一台 docker run -d --restartalways --log-driver json-file --log-opt max-size100m --lo…...
【java学习—十四】反射机制调用指定方法、指定属性(5)
文章目录 1. 调用指定方法2. 调用指定属性 1. 调用指定方法 通过反射,调用类中的方法,通过 Method 类完成。步骤: ①通过 Class 类的 getMethod(String name,Class...parameterTypes) 方法取得一个 Method 对象,并设置此…...
PC端微信@所有人逻辑漏洞
(一)过程 这个漏洞是PC端微信,可以越权让非管理员艾特所有人,具体步骤如下 第一步:找一个自己的群(要有艾特所有人的权限)“123”是我随便输入的内容,可以更改,然后按c…...
如何在Windows 10中进行屏幕截图
本文介绍如何在Windows 10中捕获屏幕截图,包括使用键盘组合、使用Snipping Tool、Snipp&Sketch Tool或Windows游戏栏。 使用打印屏幕在Windows 10中捕获屏幕截图 在Windows 10中捕获屏幕截图的最简单方法是按下键盘上的PrtScWindows键盘组合。你将看到屏幕短暂…...
【nlp】2.4 GRU模型
GRU模型 1 GRU介绍2 GRU的内部结构图2.1 GRU结构分析2.2 Bi-GRU介绍2.3 使用Pytorch构建GRU模型2.4 GRU优缺点3 RNN及其变体1 GRU介绍 GRU(Gated Recurrent Unit)也称门控循环单元结构, 它也是传统RNN的变体, 同LSTM一样能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆…...
国科云:浅谈DNS缓存投毒常见类型和防御策略
为了提升解析效率减轻各级服务器的解析压力,DNS系统中引入了缓存机制,但这同样也带来了较大的安全隐患,为攻击者利用DNS缓存进行投毒攻击创造了条件,对DNS系统的安全造成了巨大破坏。本文国科云将分析缓存投毒的两种主要类型&…...
Linux命令(120)之tcpdump
linux命令之tcpdump 1.tcpdump介绍 linux命令tcpdump是用来将网络中传送的数据包完全截获下来以进行相关分析,常用的分析工具是wireshark 2.tcpdump用法 tcpdump [参数] tcpdump参数 参数说明-i指定端口-n指定协议-t在输出的每一行不打印时间戳-s抓取数据包时&a…...
2311rust对接C
原文 为了与其他语言通信,Rust提供了(FFI)外部函数接口.FFI是Rust和C间的函数调用,与C函数调用有相同性能的零成本抽象. FFI绑定还可利用(如所有权和借用)语言功能来提供强制指针和其他资源协议的安全接口. Rust与C对话 从Rust调用C代码的简单示例开始.如下为C代码: int do…...
MYSQL字符串函数详解和实战(字符串函数大全,内含示例)
MySQL提供了许多字符串函数,用于处理和操作字符串数据。以下是一些常用的MYSQL字符串函数。 建议收藏以备后续用到查阅参考。 目录 一、CONCAT 拼接字符串 二、CONCAT_WS 拼接字符串 三、SUBSTR 取子字符串 四、SUBSTRING 取子字符串 五、SUBSTRING_INDEX 取子…...
从C语言到C++_40(多线程相关)C++线程接口+线程安全问题加锁(shared_ptr+STL+单例)
目录 1. C多线程 1.1 thread库 1.2 mutex库 1.3 RAII锁 1.4 atomicCAS 1.5 condition_variable 1.6 分别打印奇数和偶数 2. shared_ptr线程安全 2.1 库里面的shared_ptr使用 2.2 shared_ptr加锁代码 3. 单例模式线程安全 3.1 懒汉模式线程安全问题 3.2 懒汉模式最…...
Angular 指令介绍及使用(三)
Angular 指令概述 在 Angular 中,指令是一种机制,用于扩展和修改组件的行为和外观。指令可以由开发者自定义,也可以是 Angular 框架自带的一些内置指令。通过使用指令,我们可以在 HTML 模板中通过属性或元素名来操作组件。 Angu…...
小学生加减乘除闯关运算练习流量主微信小程序开发
小学生加减乘除闯关运算练习流量主微信小程序开发 经过本次更新,我们增加了新的功能和特性,以提升用户体验和运算练习的趣味性: 能量石与激励视频:用户可以通过观看激励视频来获取能量石,这些能量石可以用于解锁收费…...
普通测径仪升级的智能测径仪 增添11大实用功能!
普通测径仪能对各种钢材进行非接触式的外径及椭圆度在线检测,测量数据准确且无损,可测、监测、超差提示、系统分析等。在此基础上,为测径仪进行了进一步升级制成智能测径仪,为其增添更多智能化模块,让其使用更加方便。…...
vue做的一个一点就转的转盘(音乐磁盘),点击停止时会在几秒内缓慢停止,再次点击按钮可以再次旋转,
先看效果: 代码:主要部分我会红线画出来 css:部分: 源码: vue部分: <template><div class"song-lyric"><div><div class"type"><div class"right">&l…...
Spring6(一):入门案例
文章目录 1. 概述1.1 Spring简介1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成 2 入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.2.2 创建java类2.2.3 创建配置文件2.2.4 创建测试类测试 2.3 程序分析2.4 启用Log4j2日志框架2.4.1 引入Log4j2依赖2.4.2 加…...
颠覆式数据处理解决方案:CyberChef实现复杂数据转换的全流程优化
颠覆式数据处理解决方案:CyberChef实现复杂数据转换的全流程优化 【免费下载链接】CyberChef The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis 项目地址: https://gitcode.com/GitHub_Trending/cy/CyberChef …...
保姆级教程:用Nordic NRF52832搞定SIF一线通协议收发(附完整代码)
Nordic NRF52832实战:SIF一线通协议全双工通信开发指南 在物联网设备开发中,单线通信协议因其布线简单、成本低廉而广受欢迎。SIF(Single Interface)作为一种轻量级一线通协议,特别适合传感器与控制器之间的短距离数据…...
CogVideoX-2b行业落地:媒体公司内容生产提效实战分享
CogVideoX-2b行业落地:媒体公司内容生产提效实战分享 1. 前言:视频内容生产的痛点与机遇 作为一家媒体公司的技术负责人,我深知视频内容生产面临的挑战。每天需要制作大量短视频内容,从新闻快讯到产品介绍,从社交媒体…...
大数据领域数据预处理:优化数据分析结果的关键环节
大数据领域数据预处理:优化数据分析结果的关键环节 关键词:大数据、数据预处理、数据分析、优化、关键环节 摘要:本文深入探讨了大数据领域中数据预处理这一优化数据分析结果的关键环节。详细介绍了数据预处理的背景知识,包括目的、范围、预期读者等。通过生动形象的比喻解…...
SEO优化文章标题需要注意的重点有什么
SEO优化文章标题需要注意的重点有什么 在当前数字营销的环境中,SEO优化文章标题是吸引目标用户点击的重要因素之一。拥有一个高效的标题不仅可以提升文章的曝光率,还能提高用户的参与度和转化率。SEO优化文章标题需要注意的重点有哪些呢?本文…...
VVC/VTM编码分析进阶:如何利用DecoderAnalyserApp深度解读CU划分与语法元素
VVC/VTM编码分析进阶:如何利用DecoderAnalyserApp深度解读CU划分与语法元素 在视频编码领域,VVC(Versatile Video Coding)作为新一代标准,其编码效率相比前代HEVC有显著提升。而VTM(VVC Test Model…...
【HTTP】HTTP协议核心体系:请求方法与状态码全结构化解析(附《思维导图》)
文章目录HTTP协议核心体系:请求方法与状态码全结构化解析一、核心基础概念1.1 HTTP方法的两大核心属性(规范级定义)1.2 HTTP状态码分类规则二、HTTP请求方法2.1 标准核心方法(RFC 7231 定义)2.1.1 只读类方法ÿ…...
Qt串口通信避坑指南:用QSerialPort封装类解决粘包拆包(附源码+实战演示)
Qt串口通信实战:从粘包拆包到高可靠数据帧处理的完整解决方案 在嵌入式开发和工业控制领域,串口通信作为最基础却又最关键的通信方式,其稳定性直接影响整个系统的可靠性。许多开发者在使用Qt的QSerialPort进行串口通信时,都曾遇到…...
千问3.5-2B多场景落地:教育答题辅助、医疗报告图解、工业设备图识别实战分享
千问3.5-2B多场景落地:教育答题辅助、医疗报告图解、工业设备图识别实战分享 1. 引言:视觉语言模型的新应用 在数字化浪潮中,视觉语言模型正悄然改变着多个行业的运作方式。千问3.5-2B作为Qwen系列的小型视觉语言模型,凭借其图片…...
[RAG在LangChain中的实现-07]利用重排序选择相关性最高的检索内容构建上下文
重排序(Re-ranking)是一种关键的RAG优化技术。它通过在“初始检索”与“最终生成”之间,通过对初步检索出的文档进行二次评估,筛选出与用户查询语义最相关的结果,从而提高生成内容的准确性。在典型的检索流程中&#x…...
