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

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(三) 配置文件详解 由于文章篇幅较长,所以我就先把结论贴出来&#xff0c…...

八大学习方法(金字塔模型、费曼学习法、布鲁姆学习模型)

在微博上看到博主发的,觉得总结很好,在此摘录:...

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做的一个一点就转的转盘(音乐磁盘),点击停止时会在几秒内缓慢停止,再次点击按钮可以再次旋转,

先看效果&#xff1a; 代码&#xff1a;主要部分我会红线画出来 css:部分&#xff1a; 源码&#xff1a; vue部分&#xff1a; <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 加…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...