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.hqwc.cn/news/698056.html

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

相关文章

Spring WebFlux 初探-响应式编程-020

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

4.2 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NO MATCH”

方法一:在程序内部设置两个字符串内容,终端返回是否匹配 运行效果: 思路: 1、先比较两个字符串的长度,如果长度不一样,则两组字符串肯定不匹配;如果长度一样,再进行内容的匹配 2、如…

读万卷书|《从负债2000万到心想事成每一天》相信相信的力量

‍ ‍‍今天是2024年第20周 这是「输出倒逼输入」计划的第8篇文章 全年进度:8/52 PART 1 书籍简要介绍 阅读动力 这本书是读书群的好朋友小鹅推荐的,当时看完她的推荐就记住了这本书,感觉会是一本轻松愉悦且积极向上的书。而且冲着这个活力满…

【管理咨询宝藏101】普华永道并购尽调内部培训

【管理咨询宝藏101】普华永道并购尽调内部培训 【格式】PDF版本 【关键词】普华永道、兼并收购、尽职调查 【核心观点】 - 尽职调查的目的,发现潜在的致命缺陷,判断是否继续交易进程;发现潜在的问题,制定交易前后相应的应对措施。…

activiti——流程变量

文章目录 前言定义说明定义流程变量的作用域(范围) 绘制流程图文件部署数据库设置流程变量并执行流程Global 作用域 流程变量设置启动流程时设定变量查询已经创建的流程信息完成提交申请节点任务,推进工作流任务执行完成部门经理审批 推进节点 Local 流程变量 删除已…

齐护K210系列教程(十二)_拍照存SD卡

在AIstart中我们经常会用到在某些情况成立时,要把当前摄像头中的图像进行保存,这时我们就要用到拍照保存到SD卡的功能。 1,按键拍照保存 下面以【AIstart_掌机】为例,按下“口”键拍照1次存1.jpg到SD卡,再按拍照2.jpg…

在云计算与人工智能中,7ECloud扮演着什么样的角色

数据驱动的时代,云计算和人工智能已成为推动现代科技进步的两大引擎。作为一家专注于云计算的公司,7ECloud正是在这个领域发挥自己的力量,力图为企业提供一站式解决方案,并拥有来自厂家的源头支持,用极其低的价格助力企…

初始Linux(一)基础命令

前言: 我们不能总沉浸在编程语言中,虽然代码能力提升了,但是也只是开胃小菜。我们要朝着更高的方向发展。 最近小编一直在刷力扣,以至于博客更新的比较少。今天就带各位开始学习全新的知识——Linux.至于为啥要学? Lin…

【简单探索微软Edge】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

内存屏障 - LINUX KERNEL MEMORY BARRIERS 上 与 下

内存屏障(Memory Barrier)是在计算机体系结构中使用的一种同步机制,用于确保在多线程或多核处理器环境中,对共享内存的操作按照预期顺序进行。它们通过强制在特定点执行一些指令来规定内存访问的顺序,并防止内存乱序执…

【antd + vue】Failed to resolve component: a-select-option

一、问题说明 1、出现情况&#xff1a; <a-select>嵌套<a-select-option>&#xff0c;其中<a-select-option>循环&#xff0c;能正常使用&#xff0c;但是控制台警告。 2、控制台警告&#xff1a; [Vue warn]: Failed to resolve component: a-select-op…

python下载及安装

1、python下载地址&#xff1a; Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2、python安装 &#xff08;1&#xff09; 直接点击下载后的可执行文件.exe &#xff08;2&…