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.rhkb.cn/news/196736.html

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

相关文章

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装(单机版本)环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装(单机版本) 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…

物联网网关在工业行业的应用案例

物联网网关在工业行业的应用案例 随着物联网技术的不断发展,物联网网关在工业行业的应用越来越广泛。本文将介绍一个物联网网关在工业行业的应用案例,以期为相关领域的研究和实践提供借鉴和启示。 一、案例背景 某大型制造企业是一家全球知名的汽车制…

【MySQL】运行报错:ERROR 1193 (HY000): Unknown system variable ‘tx_isolation‘ 查看隔离级别报错

1、查看事务隔离级别的时候报错: 原因: 老版本 MySQL 比如 5 中用的是 tx_isolation,而应该是在 5.7.20 版本之后,用的是 transaction_isolation。 所以:在 MySQL 8 及之后的版本中,只需将语句中的 tx_isol…

学习c#的第十四天

目录 C# 接口(Interface) 接口的特点 定义接口 接口继承 接口和抽象类的区别 C# 命名空间(Namespace) using 关键字 定义命名空间 嵌套命名空间 C# 接口(Interface) 接口定义了所有类继承接口时应…

LeetCode47-全排列II-剪枝逻辑

参考链接: 🔗:卡尔的代码随想录:全排列II 这里第一层,used只有一个元素为1,代表只取出了1个元素作为排列,第二层used有两个元素为1,代表取出了2个元素作为排列,因为数组有序,所以重复的元素都是挨着的,因此可以使用如下语句去重. 其中visit[i-1]False的话,就是代表…

机器学习第6天:线性回归模型正则化

文章目录 机器学习专栏 正则化介绍 岭回归 岭回归成本函数 核心代码 示例 Lasso回归 Lasso回归损失函数 核心代码 弹性网络 弹性网络成本函数 核心代码 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 正则化介绍 作用:正则化是为了防止模型过拟合…

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】 课本里章节里所有蓝色字体的思维导图

vs2017打开工程提示若要解决此问题,请使用以下选择启动 Visual Studio 安装程序: 用于 x86 和 x64 的 Visual C++ MFC

下载安装文件。 下载之后点击C项目,他会提示需要安装编译依赖。这个时候需要选择 用于 x86 和 x64 的 Visual C MFCWindows SDK 版本8.1 点击右下角的安装等待即可 error MSB8036: 找不到 Windows SDK 版本8.1。请安装所需的版本的 Windows SDK 或者在项目属性页…

Excel vlookup 如何使用

Excel vlookup 如何使用 打开WX, 搜索 “程序员奇点” Excel vlookup可以说是利器,非常好用的工具,用来查询 Excel 或者进行数据匹配,十分方便。 VLookuP 如何使用,不常用的同学经常容易忘记,这次做个记录&#xff…

【数据分享】2023年我国省市县三级的专精特新“小巨人”企业数量(Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

文章分类列表进行查询(实体类日期格式设置)

categoryController GetMappingpublic Result<List<Category>> list(){List<Category> cs categoryService.list();return Result.success(cs);} categoryService //列表查询List<Category> list(); categoryServiceImpl Overridepublic List<Cat…

Django模型层

模型层 与数据库相关的&#xff0c;用于定义数据模型和数据库表结构。 在Django应用程序中&#xff0c;模型层是数据库和应用程序之间的接口&#xff0c;它负责处理所有与数据库相关的操作&#xff0c;例如创建、读取、更新和删除记录。Django的模型层还提供了一些高级功能 首…

【STM32】串口和printf

1.数据通信的基本知识 1.串行/并行通信 2.单工/半双工/全双工通信 类似于【广播 对讲 电话】 不是有两根线就是全双工&#xff0c;而是输入和输出都有对应的数据线。 3.同步/异步通信 区分同步/异步通信的根本&#xff1a;判断是否有时钟信号&#xff08;时钟线&#xff09;。…

人工智能发展前景

随着人工智能的快速发展&#xff0c;这个行业对人才的需求也在不断增长。越来越多的有志之士开始关注人工智能&#xff0c;希望通过自学获得相关技能&#xff0c;进而在人工智能领域找到心仪的职业。本文将探讨人工智能职业发展的前景&#xff0c;并为大家提供自学人工智能的途…

零基础安装分布式数据服务注册系统

一、先安装VM虚拟机&#xff0c;安装最新的ubuntu22系统&#xff0c; 先安装mysql&#xff0c; sudo apt install mysql-server sudo mysql_secure_installation 根据自己需求选择 密码安全级别时&#xff0c;选择n 删除匿名用户&#xff1f;&#xff08;按y|Y表示是&…

此芯科技加入绿色计算产业联盟,参编绿色计算产业发展白皮书

近日&#xff0c;此芯科技正式加入绿色计算产业联盟&#xff08;Green Computing Consortium&#xff0c;简称GCC&#xff09;&#xff0c;以Arm架构通用智能CPU芯片及高能效的Arm PC计算解决方案加速构建软硬协同的绿色计算生态体系&#xff0c;推动绿色计算产业加速发展。 继…

【Spring总结】基于配置的方式来写Spring

本篇文章是对这两天所学的内容做一个总结&#xff0c;涵盖我这两天写的所有笔记&#xff1a; 【Spring】 Spring中的IoC&#xff08;控制反转&#xff09;【Spring】Spring中的DI&#xff08;依赖注入&#xff09;Dependence Import【Spring】bean的基础配置【Spring】bean的实…

基于单片机设计的电子指南针(LSM303DLH模块(三轴磁场 + 三轴加速度)

一、前言 本项目是基于单片机设计的电子指南针&#xff0c;主要利用STC89C52作为主控芯片和LSM303DLH模块作为指南针模块。通过LCD1602液晶显示屏来展示检测到的指南针信息。 在日常生活中&#xff0c;指南针是一种非常实用的工具&#xff0c;可以帮助我们确定方向&#xff0…

Elasticsearch 之聚合分析

本文主要介绍 Elasticsearch 的聚合功能&#xff0c;介绍什么是 Bucket 和 Metric 聚合&#xff0c;以及如何实现嵌套的聚合。 首先来看下聚合&#xff08;Aggregation&#xff09;&#xff1a; 1 什么是 Aggregation&#xff1f; 首先举一个生活中的例子&#xff0c;这个是京…

Mybatis学习笔记-映射文件,标签,插件

目录 概述 mybatis做了什么 原生JDBC存在什么问题 MyBatis组成部分 Mybatis工作原理 mybatis和hibernate区别 使用mybatis&#xff08;springboot&#xff09; mybatis核心-sql映射文件 基础标签说明 1.namespace&#xff0c;命名空间 2.select&#xff0c;insert&a…