Nginx - location中的匹配规则和动态Proxy

文章目录

  • 官网
  • location 规则详解
  • 动态Proxy
    • 使用多个 if 指令指定不同的 proxy_pass
    • 根据参数选择不同的 proxy_pass

在这里插入图片描述


官网

https://nginx.org/en/docs/http/ngx_http_core_module.html#location

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


location 规则详解

Nginx的location指令工作原理如下:

  1. 位置匹配
    • Nginx根据规范化的URI进行位置匹配。
    • 解码以"%XX"形式编码的文本。
    • 解析相对路径组件".“和”…"的引用。
    • 可能将两个或多个相邻的斜杠压缩为单个斜杠。

  1. 位置定义
    • 位置可以由前缀字符串或正则表达式定义。
    • 正则表达式可以是不区分大小写的(~*修饰符)或区分大小写的(~修饰符)。
    • 首先检查前缀位置,并选择具有最长匹配前缀的位置。
    • 正则表达式按照它们在配置文件中出现的顺序进行检查。
    • 一旦找到正则表达式匹配项,将使用相应的配置,并终止进一步检查。

  1. 修饰符
    • ^~修饰符:如果具有最长匹配前缀的位置具有此修饰符,则不会检查正则表达式。
    • =修饰符:定义URI和位置的精确匹配。一旦找到,搜索终止。
    • @前缀:为请求重定向定义了一个命名位置,而不是用于常规请求处理。不能嵌套,也不能包含嵌套位置。

  1. 匹配指令
    • ~:执行区分大小写的正则表达式匹配。
    • ~*:执行不区分大小写的正则表达式匹配。
    • ^~:执行普通字符匹配,不是正则表达式。如果匹配成功,只使用该选项,不再匹配其他选项,通常用于匹配目录。
    • =:执行精确匹配,即普通字符的精确匹配。
    • @:定义一个命名的location,用于内部重定向,例如error_pagetry_files

  1. 匹配优先级
    • 精确匹配(=)优先级最高。如果找到精确匹配,Nginx停止搜索其他匹配。
    • 普通字符匹配,正则表达式匹配以及长的块规则将优先于其他查询匹配。换句话说,如果某个项匹配成功,Nginx还会继续检查是否有正则表达式匹配和更长的匹配。
    • 如果使用了^~,则只匹配该规则,Nginx停止搜索其他匹配;否则,Nginx会继续处理其他location指令。
    • 最后,按照匹配程度最高的逐字匹配指令,如果找到相应的匹配,Nginx停止搜索其他匹配。

这些规则确保了location指令的匹配行为,并使得开发者能够有序地控制请求的路由和处理。


  1. 特殊处理
    • 如果位置由以斜杠结尾的前缀字符串定义,并且请求由某些指令(如proxy_pass)处理,则如果请求的URI没有尾部斜杠,则执行永久重定向(301)。

以下是基于提供的配置的示例:

location = / {[ 配置 A ]
}location / {[ 配置 B ]
}location /documents/ {[ 配置 C ]
}location ^~ /images/ {[ 配置 D ]
}location ~* \.(gif|jpg|jpeg)$ {[ 配置 E ]
}
  • 请求:
    • “/”: 匹配配置 A。
    • “/index.html”: 匹配配置 B。
    • “/documents/document.html”: 匹配配置 C。
    • “/images/1.gif”: 匹配配置 D。
    • “/documents/1.jpg”: 匹配配置 E。

特殊处理的示例:

location /user/ {proxy_pass http://user.example.com;
}location = /user {proxy_pass http://login.example.com;
}
  • 请求:
    • “/user/”: 代理到http://user.example.com
    • “/user”: 代理到http://login.example.com

动态Proxy

使用多个 if 指令指定不同的 proxy_pass

server {listen 127.0.0.1:80;set $test  A; set $testB B;location / {if ($test ~* "A") { proxy_pass http://www.so.com; break; } if ($testB ~* "B") { proxy_pass http://www.sogou.com; #break; } }
}

当希望根据不同的条件执行不同的proxy_pass时,可以使用多个if指令。例如,在上述配置中,如果多个条件都满足,比如在第一个if中没有使用break,那么下一个条件也会被执行。为了确保匹配到第一个条件后就执行相应的proxy_pass,可以在第一个if指令中加上break关键字。(在Nginx中没有if-else这样的结构)

在这种情况下,可以使用多个if语句来满足不同条件下的处理逻辑。但需要注意的是,if语句是在Nginx的rewrite模块中执行的,并且在性能方面可能会有一些影响。另外,需要小心使用if语句,因为它们可能会引起一些意想不到的问题


根据参数选择不同的 proxy_pass

location / {root    html;index   index.html index.htm index.php;proxy_redirect      off;proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header    X-Real-IP $remote_addr;proxy_set_header    Host $http_host;proxy_http_version  1.1;proxy_set_header    Connection "";if ( $query_string ~* "usg=0" ) {proxy_pass      http://local_workera;}if ( $query_string ~* "usg=1" ) {proxy_pass      http://local_workerb;}if ( $arg_uid ~* "(.*[AB]$)" ) {proxy_pass      http://local_workerf;}proxy_pass    http://local_workera;
}
  1. 请求路径中的 usg=0usg=1 这两个参数是固定的,因此可以使用 $query_string 进行正则匹配。
  2. 接下来,如果要对参数 uid 的值以 A 或 B 结尾的请求进行处理,就无法使用 $query_string 进行匹配了;因此,需要使用 $arg_uid 进行正则匹配。
  3. 由于 usg=0usg=1 这两个参数是互斥的,因此放在 location 块的顶部即可正确处理。而对于 uid 的匹配,则应放在最底部或者使用 break 关键字,以避免与 usg 参数的匹配冲突。

对于固定参数值,可以使用$query_string进行正则匹配,而对于变量参数值,则需要使用$arg_parameter进行匹配。对于可能互斥的参数匹配条件,确保按照正确的优先级进行排列,或者在适当的地方使用break来终止后续的if语句执行

在这里插入图片描述

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

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

相关文章

vs2019 c++ 对左值引用取地址得到的是谁的地址?

(1) 测试一下: 对左值引用取地址,返回的地址是其引用的变量的地址,而非自身的地址。 (2) 用反汇编看一下,为了代码容易看懂,改一下源代码,不使用 cout 这个复…

【格式控制】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 从键盘输入一批数值&#xff0c;要求保留3位小数&#xff0c;在输出时上下行小数点对齐。 源码 #include <iostream>using namespace std;int main(void) {double a, b, c;cout << "请输入三个实数&#xff0c;中间用空格…

阿里云OSS配置跨域及域名访问

1、配置跨域 进入对象存储OSS–>OSS存储桶–>数据安全–>跨域设置–>创建规则 2、配置跨域 Etag x-oss-request-id3、配置结果如下 4、数据源配置 切换到数据管理–>静态页面 配置根页面 保存结果如下 5、配置域名访问 绑定域名 添加txt记录 验证绑定 …

git仓库使用

git仓库是会限制空间大小限制的 git网络库的容量限制_github仓库大小限制-CSDN博客 git是用于管理github的工具 电脑左下角搜索git打开GitBash.exe 进入到要下载到本地的目录 下载到本地的文件不要更改&#xff01; 如果要使用请务必把文件复制到别的空间去再在这个别的空间…

论文阅读记录--关于水文系统的传递函数

文章目录 J-schuite的文章,地下水系统的响应的功率谱分析--传递函数1. 什么是冲激响应函数与传递函数?2. 地下水流系统中传递函数的求解3. J-schuite文章中传递函数的复现J-schuite的文章,地下水系统的响应的功率谱分析–传递函数 1. 什么是冲激响应函数与传递函数? 在信号…

社交媒体数据恢复:华为畅连

尊敬的用户您好&#xff0c;以下是关于社交软件华为畅连的聊天记录数据恢复教程。在华为手机中&#xff0c;我们可以通过华为云服务和第三方软件来恢复删除的聊天记录。以下是详细的步骤&#xff1a; 第一步&#xff1a;登录华为云服务 请在您的华为手机上找到并打开“云服务”…

网络编程:服务器模型-并发服务器-多进程

并发服务器概念&#xff1a; 并发服务器同一时刻可以处理多个客户机的请求 设计思路&#xff1a; 并发服务器是在循环服务器基础上优化过来的 &#xff08;1&#xff09;每连接一个客户机&#xff0c;服务器立马创建子进程或者子线程来跟新的客户机通信 &#xff08;accept之后…

SpringBoot报空指针错:java.lang.NullPointerException

虽然报空指针错误的原因可能有很多种&#xff0c;但是我还是写上我的报错原因&#xff0c;以此与各位共勉~ 在这里提前说一句&#xff0c;AI虽然强大&#xff0c;但是还是要谨慎使用啊(血的教训)~ 这里先截图我错误的地方&#xff1a; 前端能成功传进来值&#xff0c;后台控制…

图像质量评价指标:了解图像质量的度量方式

图像质量评价指标&#xff1a;了解图像质量的度量方式 在图像处理和计算机视觉领域&#xff0c;评价图像质量的准确性对于许多应用至关重要。通过合适的评价指标&#xff0c;我们可以量化图像的质量&#xff0c;从而更好地了解图像处理算法的效果和改进空间。本文将介绍图像质…

英语学习笔记12——名词所有格的运用

Whose is this … ? This is my/your/his/her … 这……是谁的&#xff1f;这是我的 / 你的 / 他的 / 她的…… Whose is that … ? That is my/your/his/her … 那……是谁的&#xff1f;那是我的 / 你的 / 他的 / 她的…… 词汇 Vocabulary father n. 爸爸 口语&#xf…

2024统计建模成品论文39页(附带完整数据集和代码)

2024统计建模成品论文完整版一等奖论文【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/

在idea中使用vue

一、安装node.js 1、在node.js官网&#xff08;下载 | Node.js 中文网&#xff09;上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装&#xff0c;一定要记住自己的安装路径 一直点击next即可&#xff0c;这部选第一个 3、安装成功后&#xff0c;按住winR输入…

如何使用 ArcGIS Pro 计算容积率

容积率是指地上建筑物的总面积与用地面积的比率&#xff0c;数值越小越舒适&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 计算容积率&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的建筑和小区数据&#xff0c;除了建筑和小区数据&am…

【408精华知识】速看!各种排序的大总结!

文章目录 一、插入排序&#xff08;一&#xff09;直接插入排序&#xff08;二&#xff09;折半插入排序&#xff08;三&#xff09;希尔排序 二、交换排序&#xff08;一&#xff09;冒泡排序&#xff08;二&#xff09;快速排序 三、选择排序&#xff08;一&#xff09;简单选…

【Arduino】数字I/O的使用

目录 1、引脚工作模式 2、写入引脚digitaWrite&#xff08;&#xff09; 3、读取引脚digitalRead(pin); 4、示例 跑马灯 1、引脚工作模式 Arduino通过pinMode()设置引脚的io工作模式&#xff0c;一共有4种模式 工作模式 Mode 说明 输出模式 OUTPUT 引脚为低阻抗状态&…

YOLOv9改进策略目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

&#x1f451; YOLOv9有效涨点专栏目录 &#x1f451; 专栏视频介绍&#xff1a;包括专栏介绍、得到的项目文件、模型二次创新、权重文件的使用问题&#xff0c;点击即可跳转。 前言 Hello&#xff0c;各位读者们好 本专栏自开设两个月以来已经更新改进教程50余篇其中包含Re…

自动攻丝机进出料激光检测 进料出料失败报警循环手动及关闭报警退出无限循环

/**************进料检测********************/ /***缺料无限次循环 手动退出 超时报警*******/ void check_Pon() // { zstatus0; //报警计数器归零 Signauto1; …

Pytorch 与 Tensorflow:深度学习的主要区别(1)

引言 目前&#xff0c;Python 深度学习领域已经涌现出多个由科技界巨头如 Google、Facebook 和 Uber 等公司公开发布的框架&#xff0c;这些框架旨在帮助开发者构建先进的计算架构。对于刚接触这一领域的你来说&#xff0c;深度学习是计算机科学中的一个分支&#xff0c;它通过…

如何查看centos7是否安装nginx

要查看 CentOS 7 系统上是否安装了 Nginx&#xff0c;您可以使用多种方法来检查。以下是一些常见的方法&#xff1a; 通过 RPM 包管理器查询 在 CentOS 系统上&#xff0c;可以使用 RPM 包管理器来查询已安装的软件包。要查看是否安装了 Nginx&#xff0c;您可以在终端中运行以…

【深度学习目标检测】二十六、基于深度学习的垃圾检测系统-含数据集、GUI和源码(python,yolov8)

设计垃圾检测系统的意义在于多个方面&#xff0c;这些方面不仅关乎环境保护和城市管理&#xff0c;还涉及到技术进步和社会效益。以下是设计垃圾检测系统的主要意义&#xff1a; 环境保护与资源回收&#xff1a; 垃圾检测系统能够有效地识别不同种类的垃圾&#xff0c;帮助人们…