Nginx(六) Nginx location 匹配顺序及优先级深究(亲测有效)

        Nginx配置文件详解请参考另一篇文章 Nginx(三) 配置文件详解 

        本篇文章主要是探讨Nginx location的匹配顺序,依照惯例,我们还是先贴结论再看测试结果。

匹配顺序

        匹配location的过程,其实可以理解成一个在众多选项中寻找最佳答案的过程。当然,“=”代表的就是正确答案,而其它情况只是相对于正确答案的最佳选项。下面我们来看具体的匹配顺序:

        1.Nginx按照location配置顺序依次进行匹配;

        2.如果请求URI部分前缀或全部与location uri匹配,先记录下来(如有匹配长度更长的则覆盖记录),继续向下匹配,再看看是否还有最佳答案备胎,最后再考虑你

        3.如果与"="选项精确匹配,则立刻停止匹配高富帅,你就是我心目中的白马王子参考测试1

        4.如果跟"^~"选项匹配成功,还要继续完成所有匹配最长匹配策略,直到找到与"^~"匹配长度最长的那个选项后再停止匹配(如果实在找不到其它的,就只能拿这个凑合了)(虽然都不帅,但我要找最有钱的那位)参考测试2

        5.如果跟"~"或"~*"任意选项匹配成功,则立刻停止(好不容易遇到一个爆发户,不拖泥带水,立刻下手)参考测试3、4

        6.完成所有匹配前面5步中,每一步但凡匹配成功都会覆盖结果记录。如果匹配过程能进入第6步,说明请求URI前缀与location uri匹配是最好的结果了最长匹配策略,最终的结果记录也就是最佳答案(在备胎中选择最佳备胎,残忍,现实)参考测试5

优先级

       结合上面的匹配顺序和所有测试过程,我们对各种匹配规则的作用优先级做个排序

优先级排序匹配规则修饰符
1精确匹配=
2指定字符串开头^~
3正则匹配~、~* 、!~、!~*、~* \.(gif|jpg|jpeg)$、~* /js/.*/\.js
4通用匹配/

下面,我们开始测试。基本配置如下

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",''}';absolute_redirect on;server_name_in_redirect off;port_in_redirect on; server {listen 8688;server_name www.read********.cn;access_log  logs/access.log  format2;error_log  logs/error.log  notice;	# 将error_log日志级别修改为notice,否则rewrite log无法记录。rewrite_log on;    # 开启记录请求重写日志,默认是关闭root pages;     # 根目录设置为psges,该目录下有index.html、test.html、one.html、two.html、three.html# 下面配置本次测试的指令······}
}

测试1:精确匹配 "="

server {···set $sn 8;location /test {set $sn 11;rewrite /test /t11;}location ~* /tes {set $sn 22;rewrite /test /t22;}location ~ /tes {set $sn 33;rewrite /test /t33;}location ~ /test {set $sn 44;rewrite /test /t44;}location ~* /test {set $sn 55;rewrite /test /t55;}location ^~ /tes {set $sn 66;rewrite /test /t66;}location ^~ /test.h {set $sn 77;rewrite /test /t77;}location = /test {set $sn 88;rewrite /test /t88;}location / {index  index.html index.htm;}
}
请求地址host:8688/test
请求结果404

error.log

日志输出

*697 open() "/usr/local/nginx/pages/t88" failed (2: No such file or directory)

access.log

日志输出

{"SN":"88",···,"request":"GET /test HTTP/1.1"
最终地址host:8688/t88
结论“精确匹配”优先级最高
2023/11/18 23:46:38 [notice] 16455#16455: *697 "/test" matches "/test", client: 14.145.163.156, server: www.read********.cn, request: "GET /test HTTP/1.1", host: "www.read********.cn:8688"
2023/11/18 23:46:38 [notice] 16455#16455: *697 rewritten data: "/t88", args: "", client: 14.145.163.156, server: www.read********.cn, request: "GET /test HTTP/1.1", host: "www.read********.cn:8688"
2023/11/18 23:46:38 [error] 16455#16455: *697 open() "/usr/local/nginx/pages/t88" failed (2: No such file or directory), client: 14.145.163.156, server: www.read********.cn, request: "GET /test HTTP/1.1", host: "www.read********.cn:8688"

测试2:指定字符串开头 "^~"

server {···set $sn 8;location /test {set $sn 11;rewrite /test /t11;}location ~* /tes {set $sn 22;rewrite /test /t22;}location ~ /tes {set $sn 33;rewrite /test /t33;}location ~ /test {set $sn 44;rewrite /test /t44;}location ~* /test {set $sn 55;rewrite /test /t55;}location ^~ /tes {set $sn 66;rewrite /test /t66;}location ^~ /test.h {set $sn 77;rewrite /test /t77;}location = /test {set $sn 88;rewrite /test /t88;}location / {index  index.html index.htm;}
}
请求地址host:8688/test.ht
请求结果404

error.log

日志输出

*699 open() "/usr/local/nginx/pages/t77" failed (2: No such file or directory)

access.log

日志输出

{"SN":"77",···,"request":"GET /test.ht HTTP/1.1"
最终地址host:8688/t77
结论

虽然先匹配到了"^~ /tes",但最终还是选择了匹配长度最长的"^~ /test.h"。所以"^~"修饰符有最长匹配策略。

“指定字符串开头”匹配规则优先级排第二。

测试3:正则表达式 "~*"

server {···set $sn 8;location /test {set $sn 11;rewrite /test /t11;}location ~* /tes {set $sn 22;rewrite /test /t22;}location ~ /tes {set $sn 33;rewrite /test /t33;}location ~ /test.ht{set $sn 44;rewrite /test /t44;}location ~* /test.ht{set $sn 55;rewrite /test /t55;}location / {index  index.html index.htm;}
}
请求地址host:8688/test.ht
请求结果404

error.log

日志输出

*702 open() "/usr/local/nginx/pages/t22" failed (2: No such file or directory)

access.log

日志输出

{"SN":"22",···,"request":"GET /test.ht HTTP/1.1"
最终地址host:8688/t22
结论

虽然"~ /test.ht"和"~* /test.ht"两个的匹配程度最高,但还是选择了首次匹配到的"~* /tes"。

“正则表达式”匹配规则但凡匹配到任意选项都会立刻终止匹配。

2023/11/19 00:10:23 [notice] 16724#16724: *702 "/test" matches "/test.ht", client: 14.145.163.156, server: www.read********.cn, request: "GET /test.ht HTTP/1.1", host: "www.read********.cn:8688"
2023/11/19 00:10:23 [notice] 16724#16724: *702 rewritten data: "/t22", args: "", client: 14.145.163.156, server: www.read********.cn, request: "GET /test.ht HTTP/1.1", host: "www.read********.cn:8688"
2023/11/19 00:10:23 [error] 16724#16724: *702 open() "/usr/local/nginx/pages/t22" failed (2: No such file or directory), client: 14.145.163.156, server: www.read********.cn, request: "GET /test.ht HTTP/1.1", host: "www.read********.cn:8688"

测试4:正则表达式 "~" 

server {···set $sn 8;location /test {set $sn 11;rewrite /test /t11;}location ~ /tes {set $sn 33;rewrite /test /t33;}location ~* /tes {set $sn 22;rewrite /test /t22;}location ~ /test.ht{set $sn 44;rewrite /test /t44;}location ~* /test.ht{set $sn 55;rewrite /test /t55;}location / {index  index.html index.htm;}
}
请求地址host:8688/test.ht
请求结果404

error.log

日志输出

*703 open() "/usr/local/nginx/pages/t33" failed (2: No such file or directory)

access.log

日志输出

{"SN":"33",···,"request":"GET /test.ht HTTP/1.1"
最终地址host:8688/t33
结论

虽然"~ /test.ht"和"~* /test.ht"两个的匹配程度最高,但还是选择了首次匹配到的"~ /tes"。

“正则表达式”匹配规则但凡匹配到任意选项都会立刻终止匹配。

"~"和"~*"没有优先级区分。

2023/11/19 00:17:14 [notice] 16797#16797: *703 "/test" matches "/test.ht", client: 14.145.163.156, server: www.read********.cn, request: "GET /test.ht HTTP/1.1", host: "www.read********.cn:8688"
2023/11/19 00:17:14 [notice] 16797#16797: *703 rewritten data: "/t33", args: "", client: 14.145.163.156, server: www.read********.cn, request: "GET /test.ht HTTP/1.1", host: "www.read********.cn:8688"
2023/11/19 00:17:14 [error] 16797#16797: *703 open() "/usr/local/nginx/pages/t33" failed (2: No such file or directory), client: 14.145.163.156, server: www.read********.cn, request: "GET /test.ht HTTP/1.1", host: "www.read********.cn:8688"

测试5:URI前缀匹配

server {···set $sn 8;location /test {set $sn 11;rewrite /test /t11;}location /test.h {set $sn 22;rewrite /test /t22;}location /tes {set $sn 33;rewrite /test /t33;}location / {index  index.html index.htm;}
}
请求地址host:8688/test.ht
请求结果404

error.log

日志输出

*705 open() "/usr/local/nginx/pages/t22" failed (2: No such file or directory)

access.log

日志输出

{"SN":"22",···,"request":"GET /test.ht HTTP/1.1"
最终地址host:8688/t22
结论URI前缀匹配时取匹配长度最长的那个选项为最佳选择。
2023/11/19 00:22:11 [notice] 16870#16870: *705 "/test" matches "/test.ht", client: 14.145.163.156, server: www.readerschool.cn, request: "GET /test.ht HTTP/1.1", host: "www.readerschool.cn:8688"
2023/11/19 00:22:11 [notice] 16870#16870: *705 rewritten data: "/t22", args: "", client: 14.145.163.156, server: www.readerschool.cn, request: "GET /test.ht HTTP/1.1", host: "www.readerschool.cn:8688"
2023/11/19 00:22:11 [error] 16870#16870: *705 open() "/usr/local/nginx/pages/t22" failed (2: No such file or directory), client: 14.145.163.156, server: www.readerschool.cn, request: "GET /test.ht HTTP/1.1", host: "www.readerschool.cn:8688"

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

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

相关文章

关于Vue3和Vue-rounter的几个理解

router-link对应的router-view能分开在不同的vue模块中吗&#xff1f; <router-link>和<router-view>可以分别在不同的Vue模块中使用。<router-link>是用于生成路由链接的组件&#xff0c;它可以在任何Vue模块中使用&#xff0c;例如在导航栏组件、侧边栏组…

LeetCode:342. 数位和相等数对的最大和(C++)

目录 342. 数位和相等数对的最大和 题目描述&#xff1a; 实现代码与解析&#xff1a; 暴力模拟&#xff08;超时&#xff0c;考虑优化&#xff09; 如何优化&#xff1f; hash 342. 数位和相等数对的最大和 题目描述&#xff1a; 给你一个下标从 0 开始的数组 nums &am…

ubuntu20中安装cmake-gui

参考&#xff1a;ubuntu20 安装cmake-gui 基本上是先下载&#xff0c;后解压&#xff0c;再添加软链接--使系统识别该程序的路径。 我因为通过其他方式安装了&#xff0c;这里只是记录下这种安装方式。

Swift开发中:非逃逸闭包、逃逸闭包、自动闭包的区别

1. 非逃逸闭包&#xff08;Non-Escaping Closure&#xff09; 定义&#xff1a;默认情况下&#xff0c;在 Swift 中闭包是非逃逸的。这意味着闭包在函数结束之前被调用并完成&#xff0c;它不会“逃逸”出函数的范围。内存管理&#xff1a;由于闭包在函数返回前被调用&#xf…

【原创】java+swing+mysql鲜花购物商城设计与实现

前言&#xff1a; 本文主要介绍了鲜花购物商城的设计与实现。首先&#xff0c;通过市场需求&#xff0c;我们确定了鲜花商场的功能&#xff0c;通常的商城一般都是B/S架构&#xff0c;然而我们今天要用javaswing去开发一个C/S架构的鲜花商城&#xff0c;利用开发技术和工具&am…

解密网络世界的秘密——Wireshark Mac/Win中文版网络抓包工具

在当今数字化时代&#xff0c;网络已经成为了人们生活和工作中不可或缺的一部分。然而&#xff0c;对于网络安全和性能的监控和分析却是一项重要而又复杂的任务。为了帮助用户更好地理解和解决网络中的问题&#xff0c;Wireshark作为一款强大的网络抓包工具&#xff0c;应运而生…

回溯算法(3)--n皇后问题及回溯法相关习题

一、n皇后问题 1、概述 n皇后要求在一个nn的棋盘上放置n个皇后&#xff0c;使得他们彼此不受攻击&#xff0c;皇后可以攻击同一行、同一列、同一斜线上的敌人&#xff0c;所以n皇后问题要求寻找在棋盘上放置这n个皇后的方案&#xff0c;使得任意两个皇后都不在同一行、同一列或…

基于STC12C5A60S2系列1T 8051单片机的模数芯片ADC0832实现模数转换应用

基于STC12C5A60S2系列1T 8051单片的模数芯片ADC0832实现模数转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍模数芯片ADC0832介绍通过模数芯片ADC0832把电压模…

kafka入门(一):kafka消息消费

安装kafka&#xff0c;创建 topic&#xff1a; Windows安装kafka, 详情见&#xff1a;https://blog.csdn.net/sinat_32502451/article/details/133067851 Linux 安装kafka&#xff0c;详情见&#xff1a;https://blog.csdn.net/sinat_32502451/article/details/133080353 添…

一键云端,AList 整合多网盘,轻松管理文件多元共享

hello&#xff0c;我是小索奇&#xff0c;本篇教大家如何使用AList实现网盘挂载 可能还是有小伙伴不懂&#xff0c;所以简单介绍一下哈 AList 是一款强大的文件管理工具&#xff0c;为用户提供了将多种云存储服务和文件共享协议集成在一个平台上的便利性。它的独特之处在于&am…

Mendix 创客访谈录|低代码赋能IoT应用开发

本期创客 郑锴 舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部 毕业于浙江大学&#xff0c;三年软件设计开发经验。目前任职于舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部&#xff0c;担任软件开发工程师&#xff0c;主要负责工业互联网相关软件…

【Python 千题 —— 基础篇】输出列表方差

题目描述 题目描述 输出列表的方差。题中有一个包含数字的列表 [10, 39, 13, 48, 32, 10, 9]&#xff0c;使用 for 循环获得这个列表中所有项的方差。 输入描述 无输入。 输出描述 输出列表的方差。 示例 示例 ① 输出&#xff1a; 列表的方差是&#xff1a;228.0代码…

MIKE水动力笔记20_由dfs2网格文件提取dfs1断面序列文件

本文目录 前言Step 1 MIKE Zero工具箱Step 2 提取dfs1 前言 在MIKE中&#xff0c;dfs2是一个一个小格格的网格面的时间序列文件&#xff0c;dfs1是一条由多个点组成的线的时间序列文件。 如下两图&#xff1a; 本博文内容主要讲如何从dfs2网格文件中提取dfs1断面序列文件。 …

ctfshow 文件上传 151-161

文件上传也好久没做了。。 手很生了 151 前端绕过 只能上传png文件 使用bp抓包&#xff0c;修改文件名后缀为php 上传成功&#xff0c;发现文件上传路径 使用蚁剑连接 找到flag 152 152 后端校验 跟上一关一样 表示后面即使执行错误&#xff0c;也不报错 抓包修改文件…

数智竞技何以成为“科技+体育”新样本?

文 | 智能相对论 作者 | 青月 “欢迎来到&#xff0c;钢铁突袭。” 三人一组&#xff0c;头戴VR设备&#xff0c;中国香港队和泰国队在数实融合的空间里捉对厮杀&#xff0c;通过互相射击对方能量铠甲获取积分。 虽然双方都展现出了极强的机动性&#xff0c;但显然中国香港队…

解决:微软在登录时总是弹出需要家长或监护人同意才能使用该账户并且不断循环?

目录 问题来源&#xff1a; 解决办法&#xff1a; 问题来源&#xff1a; 我的edge浏览器账号登录&#xff0c;一直弹出来需要家长或监护人同意才能使用&#xff0c;然后按照提示操作&#xff0c;会一直循环&#xff0c;是个无穷循环。 解决办法&#xff1a; 参考&#xff1…

表格型方法

表格型方法 概念 强化学习是一个与时间相关的序列决策的问题。 概率函数与奖励函数 概率函数定量地表达状态转移的概率&#xff0c;其可以表现环境的随机性。但是实际上&#xff0c;我们经常处于一个未知的环境中&#xff0c;即概率函数和奖励函数是未知的。 时序差分法 …

Vue.js正式环境中配置多个请求的URL

在Vue.js中&#xff0c;你可以在正式环境中配置多个请求的URL&#xff0c;通常使用一些配置文件或者环境变量的方式。下面是一种常见的配置方式&#xff1a; 1. 创建配置文件&#xff1a;在项目的根目录下&#xff0c;创建一个配置文件&#xff0c;比如可以是config.js&#x…

vb.net 实时监控双门双向门禁控制板源代码

本示例使用设备介绍&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) Imports System.Net.Sockets Imports System.Net Imports System.Text Imports System.ThreadingImports System.Net.NetworkInformation Imports System.Man…

《算法通关村——不简单的字符串转换问题》

《算法通关村——不简单的字符串转换问题》 8. 字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入…