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

news2024/11/22 10:09:30

文章目录

  • 官网
  • 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.coloradmin.cn/o/1672676.html

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

相关文章

【中级软件设计师】上午题3-数据结构(查漏补缺版)

上午题3-数据结构 0 前言1 时间、空间复杂度2 串2.1 串的模式匹配 3 矩阵4 图4.1 邻接矩阵和邻接表 5 查找6 哈希表、7 树7.1 B树 0 前言 因为我之前考研系统地学习过数据结构和操作系统&#xff0c;这两部分的笔记不完整 1 时间、空间复杂度 指数<阶乘<n次方阶 使用队…

Java入门基础学习笔记22——程序流程控制

程序流程控制&#xff1a;控制程序的执行顺序。 程序有哪些执行顺序&#xff1f; 顺序、分支和循环。 分支结构&#xff1a; if、switch 循环&#xff1a; for、while、do-while 顺序结构是程序中最简单最基本的流程控制&#xff0c;没有特定的语法结构&#xff0c;按照代码…

01-02-5

1、单链表中按位置查找 a.原理 通过传递的位置&#xff0c;返回该位置对应的地址&#xff0c;放到主函数定义的指针变量中。 我们认为位置从&#xff1a;有数据的节点开始计数 即如下结构&#xff1a; 查找位置&#xff0c;就是返回该位置对应的空间地址。 b.代码说明 Ⅰ…

深度剖析深度神经网络(DNN):原理、实现与应用

目录 引言 一、DNN基本原理 二、DNN核心算法原理 三、DNN具体操作步骤 四、代码演示 引言 在人工智能和机器学习的浪潮中&#xff0c;深度神经网络&#xff08;Deep Neural Network&#xff0c;简称DNN&#xff09;已经成为了一种非常重要的工具。DNN模仿人脑神经网络的结…

2023年数维杯国际大学生数学建模挑战赛A题复合直升机的建模与优化控制问题解题全过程论文及程序

2023年数维杯国际大学生数学建模挑战赛 A题 复合直升机的建模与优化控制问题 原题再现&#xff1a; 直升机具有垂直起降等飞行能力&#xff0c;广泛应用于侦察、运输等领域。传统直升机的配置导致旋翼叶片在高速飞行过程中受到冲击波的影响&#xff0c;难以稳定飞行。为了在保…

【轮转数组】力扣python

1.python切片 这里nums[:]代表列表 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)nums[:]nums[-k%n:]nums[:-k%n] 2.边pop边push 0代表插入的位置 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)fo…

[Linux] 入门指令详解

目录 ls指令 pwd指令 whoami指令 cd指令 clear指令 touch指令 mkdir指令 rmdir指令 rm指令 man指令 cp指令 mv指令 cat指令 tac指令 more指令 less指令 head指令 tail指令 如何读取文件中间某一段内容&#xff1f; date指令 cal指令 find指令 which指令…

Java Web开篇

Java Web开篇 大纲 整个内容梳理 具体案例 整个内容梳理 这是前端和后端组成的系统的框架结构

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

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

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…

Python | Leetcode Python题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; class Solution:def isScramble(self, s1: str, s2: str) -> bool:cachedef dfs(i1: int, i2: int, length: int) -> bool:"""第一个字符串从 i1 开始&#xff0c;第二个字符串从 i2 开始&#xff0c;子串的长度为 le…

MyBatis——MyBatis 参数处理

一、单个简单类型参数 简单类型包括&#xff1a; byte short int long float double char Byte Short Integer Long Float Double Character String java.util.Date java.sql.Date parameterType 属性&#xff1a;告诉 MyBatis 参数的类型 MyBatis 自带类型自动推断机制…

部署Discuz论坛项目

DIscuz 是由 PHP 语言开发的一款开源社交论坛项目。运行在典型的LNMP/LAMP 环境中。 安装MySQL数据库5.7 主机名IP地址操作系统硬件配置discuz-db192.168.226.128CentOS 7-mini-20092 Core/4G Memory 修改主机名用来自己识别 hostnamectl set-hostname discuz-db #重连远程…

虚拟资源在线交易服务平台源码 线上虚拟商品交易平台搭建

在信息爆炸的时代&#xff0c;虚拟资源、素材、源码系统等等以其独特的魅力&#xff0c;逐渐成为人们日常生活和工作中不可或缺的一部分。如何高效地获取、管理和交易这些虚拟资源&#xff0c;分享一款虚拟资源在线交易服务平台源码&#xff0c;轻松搭建线上虚拟商品交易平台&a…

【全开源】智慧小区物业管理小程序基于FastAdmin+UniApp

基于FastAdminUniApp开发的智慧小区物业管理小程序&#xff0c;包含小区物业缴费、房产管理、在线报修、业主活动报名、在线商城等功能。为物业量身打造的智慧小区运营管理系统&#xff0c;贴合物业工作场景&#xff0c;轻松提高物业费用收缴率&#xff0c;更有功能模块个性化组…

HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现首页图片切换轮播效果&#xff0c;共有1个页面…

【网络安全产品互联互通 告警信息资产信息】相关思维导图

近日&#xff0c;在某客户安全建设项目中&#xff0c;涉及安全告警事件的梳理上报。在整理及学习中发现最近&#xff08;以19年等保2.0为参考分隔“最近”&#xff09;发布的可参考标准&#xff0c;因此做了思维导图的整理。 PS&#xff1a;标准中存在引用的情况&#xff0c;过…

OpenHarmony NAPI 使用Cmake 编译C++ .so 并ets调用

一、前言 这两年多随着国产化兴起&#xff0c;国内越来越多的项目都要求支持国产化系统&#xff0c;并且随着OpenHarmony 开源&#xff0c;更多的人都想分一杯羹。因此&#xff0c;我们公司也要求&#xff0c;所有产品的都需要支持开源鸿蒙OpenHarmony。 对于我们这边的设备&am…

Mybatis进阶详细用法

目录 条件构造器 案例 自定义SQL 案例 Service接口 案例 综合案例 条件构造器 案例 Testvoid testQueryMapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…

uniapp小程序:大盒子包裹小盒子但是都有点击事件该如何区分?

在开发过程中我们会遇到这种情况&#xff0c;一个大盒子中包裹这一个小盒子&#xff0c;两个盒子都有点击事件&#xff0c;例如&#xff1a; 这个时候如果点击评价有可能会点击到它所在的大盒子&#xff0c;如果使用css中的z-index设置层级的话如果页面的盒子多的话会混乱&…