【Nginx】location匹配模式与规则

文章目录

  • 一、环境
  • 二、匹配模式
    • 1. 精准模式
    • 2. 前缀模式(不继续匹配正则)
    • 3. 前缀模式(继续匹配正则)
    • 4. 正则模式(大小写敏感)
    • 5. 正则模式(大小写不敏感)
  • 三、需要注意的地方
    • 1. 命中多个正则模式时的优先级
    • 2. 命中多个前缀模式时的优先级
    • 3. 命中多个不同模式时的优先级
    • 4. 两种前缀模式不能同时存在

一、环境

Nginx 1.19

二、匹配模式

在 Nginx 的location指令里,常用的匹配模式有:

  • 精准模式(=)
  • 前缀模式,不继续匹配正则(^~),
  • 前缀模式,继续匹配正则,
  • 正则模式,大小写敏感(~)
  • 正则模式,大小写不敏感(~*)

1. 精准模式

location = /path {default_type text/html;return 200 'hello';
}

2. 前缀模式(不继续匹配正则)

location ^~ /path {default_type text/html;return 200 'hello';
}

3. 前缀模式(继续匹配正则)

location /path {default_type text/html;return 200 'hello';
}

4. 正则模式(大小写敏感)

location ~ /path {default_type text/html;return 200 'hello';
}

5. 正则模式(大小写不敏感)

location ~* /path {default_type text/html;return 200 'hello';
}

Nginx会按照 精准模式 -> 前缀模式 -> 正则模式 的顺序来匹配。

精准模式优先级最高,匹配到后就不再继续匹配其它模式。而前缀模式匹配到后,还要视乎指令的配置情况,来决定要不要继续匹配正则模式。

三、需要注意的地方

1. 命中多个正则模式时的优先级

看例子:

# 正则模式(大小写敏感)
location ~ /a {default_type text/html;return 200 '111';
}# 正则模式(大小写敏感)
location ~ /a/b {default_type text/html;return 200 '222';
}

如果访问http://localhost/a/b,会命中哪个location?答案是第一个。

因为两个location都是正则模式(无论是否大小写敏感),从上之下,哪个先匹配到就哪个负责处理

2. 命中多个前缀模式时的优先级

# 前缀模式(继续匹配正则)
location /a {default_type text/html;return 200 '111';
}# 前缀模式(继续匹配正则)
location /a/b {default_type text/html;return 200 '222';
}

访问http://localhost/a,命中第一个;
访问http://localhost/a/b,命中第二个;
访问http://localhost/a/b/c,命中第二个;

简单来说,哪个location匹配到的字符串最长,就由哪个来处理,比如http://localhost/a/b/c能匹配到的最长字符串是/a/b,所以由第二个location来处理。

前缀模式(不继续匹配正则)也是同样的匹配规则。

3. 命中多个不同模式时的优先级

# 前缀模式(不继续匹配正则)
location ^~ /a {default_type text/html;return 200 '111';
}# 前缀模式(继续匹配正则)
location /a/b {default_type text/html;return 200 '333';
}# 正则模式(大小写敏感)
location ~ /a/b {default_type text/html;return 200 '222';
}

访问http://localhost/a/b,会命中第三个location

前面两个location都是前缀模式,由匹配字符串最长的处理(即第二个)。第二个location没有阻止继续匹配正则,于是又继续匹配第三个location(正则模式),所以最后是由第三个location处理。

4. 两种前缀模式不能同时存在

看例子:

# 前缀模式(不继续匹配正则)
location ^~ /a {default_type text/html;return 200 '333';
}# 前缀模式(继续匹配正则)
location /a {default_type text/html;return 200 '444';
}

上面这段配置 Nginx 会报错,因为在路径相同的情况下,这两种模式不能共存。

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

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

相关文章

JavaScript基础-定时器

在Web开发中,有时我们需要延迟执行某些操作或者定期重复执行某段代码。JavaScript提供了强大的定时器功能,使得这些需求变得简单易行。本文将详细介绍JavaScript中的定时器,包括setTimeout和setInterval函数的使用方法、注意事项以及一些实际…

【Python】and 和 or 的返回值

文章目录 选项 A选项 B选项 C选项 D正确答案 以下哪些选项输出结果为True ( ) A、print(2 0 or True) B、print(2 ! 0 or True) C、print(str(2) and str(0) or True) D、print(str(2) or str(0) or True)要确定哪些选项的输出结果为 True,我们需要分析每个表达式的…

【deepseek 学c++】weakptr引用场景

std::weak_ptr 是 C 中与 std::shared_ptr 配合使用的智能指针,它本身不拥有资源的所有权,仅观察资源的状态,主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值:![ 为…

新手SEO优化实战快速入门

内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…

如何用Redis统计网站的UV

在 Java 项目中使用 Redis 统计网站的 UV(独立访客数),我们可以利用 Redis 提供的 HyperLogLog 数据结构。HyperLogLog 适合用来做基数统计,它在空间复杂度上非常高效,可以在存储大量数据的情况下,提供非常…

Android系统的安全问题 - Android的启动时验证

Android 启动时验证(Verified Boot) Android 的 启动时验证(Verified Boot) 是一项关键安全机制,用于确保设备启动过程中加载的所有系统镜像(如 Bootloader、内核、系统分区)未被篡改&#xff…

【操作系统】(四)体系结构

(一)大内核与微内核 把橘色部分划分到内核中的操作系统属于大内核,不把橘色划到内核中的操作系统属于微内核 大内核与微内核的具体区别: (二)计算机的层次结构 (三)操作系统内核非内…

Kotlin 协程官方文档知识汇总(一)

1、协程基础 Kotlin 是一门仅在标准库中提供最基本底层 API 以便其他库能够利用协程的语言。与许多其他具有类似功能的语言不同,async 与 await 在 Kotlin 中并不是关键字,甚至都不是标准库的一部分。此外,Kotlin 的挂起函数概念为异步操作提…

MySQL 的 JSON 查询

MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件]路径组件详解 | 操作符 | 描述 | 示例 | | ----------- | --------- | ----------…

Wi-SUN技术,强势赋能智慧城市构筑海量IoT网络节点

在智慧城市领域中,当一个智慧路灯项目因信号盲区而被迫增设数百个网关时,当一个传感器网络因入网设备数量爆增而导致系统通信失效时,当一个智慧交通系统因基站故障而导致交通瘫痪时,星型网络拓扑与蜂窝网络拓扑在构建广覆盖与高节…

Leetcode13-罗马数字转整数

题目链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 如同上一题&#xff0c;直接用暴力法破解&#xff0c;简单好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…

Linux系统加固笔记

检查口令为空的账户 判断依据&#xff1a;存在则不符合 特殊的shell a./bin/false:将用户的shell设置为/bin/false&#xff0c;用户会无法登录&#xff0c;并且不会有任何提示信息b./sbib/nologin&#xff1a;nologin会礼貌的向用户发送一条消息&#xff0c;并且拒绝用户登录…

23种设计模式-责任链(Chain of Responsibility)设计模式

责任链设计模式 &#x1f6a9;什么是责任链设计模式&#xff1f;&#x1f6a9;责任链设计模式的特点&#x1f6a9;责任链设计模式的结构&#x1f6a9;责任链设计模式的优缺点&#x1f6a9;责任链设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

【宇宙回响】从Canvas到MySQL:飞机大战的全栈交响曲【附演示视频与源码】

🌟 这是星际大战系列的第三篇,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之处,欢迎各位朋友指出,让我们一起在交流中进步。 🎁 项目代码、文档和相关资源都可以免费获取,希望能帮助到更多对游戏开发感兴趣的朋友。 💌 如果您有任…

MyBatis-Plus(Ⅵ)插件

目录 一、分页插件 1.添加配置类 2.在测试类测试 结果 二、xml实现分页的自定义 1.UserMapper中定义接口方法 2.创建UserMapper.xml文件 3.在测试类测试 结果 三、乐观锁 1.场景 2.乐观锁与悲观锁 3.模拟修改冲突 数据库中添加商品表 添加数据 添加实体类 添加map…

火山引擎云上实战: DeepSeek R1 大模型(全尺寸)

本文将介绍两种在火山引擎云上部署 DeepSeek-R1 全尺寸模型服务的方案&#xff0c;涵盖大模型推理服务的 Terraform 一键部署、容器化部署、资源弹性伸缩和模型可观测。 来源 | 火山引擎云基础 在 AI 大模型日新月异的当下&#xff0c;企业在使用大模型时往往面临着数据隐私保…

vue遗漏的知识点(动态组件.)

----动态组件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的内置组件&#xff0c;用于动态渲染其他组件。:is 属性 用于指定要渲染的组件。它的值可以是&#xff1a; 组件的名称&#xff08;字符串&#xf…

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介 Flowable 是一个轻量级的业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 项目发展而来&#xff0c;专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…

【uni-app】引用公共组件

目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…

STL中vector模拟实现

vector各个接口函数 //构造函数 vector() vector(size_t n,const T& valT()) vector(int n,const T& val T()) //拷贝构造函数 vector(const vector<T>& v) //迭代器版本的 vector(inputiterator first, inputiterator end) //赋值运算符重载 vector<T&…