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语句执行

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机有线已连接但无法上网—·可能性之一

背景 VMware虚拟机,搭建了三台Linux服务器,组成Hadoop集群,由于在Hadoop102上有一些经常与Mysql数据库交互的任务,需要经常打开运行,而Hadoop103和104则经常处于关闭状态,一段时间后再次启动集群时候&…

【go项目01_学习记录11】

操作数据库 1 文章列表2 删除文章 1 文章列表 (1)先保证文章已经有多篇,可以直接在数据库中添加,或者访问链接: localhost:3000/articles/create,增加几篇文章。 (2)之前设置好了articles.ind…

C语言 | Leetcode C语言题解之第87题扰乱字符串

题目: 题解: struct HashTable {int key;int val;UT_hash_handle hh; };void modifyHashTable(struct HashTable** hashTable, int x, int inc) {struct HashTable* tmp;HASH_FIND_INT(*hashTable, &x, tmp);if (tmp NULL) {tmp malloc(sizeof(st…

树莓派对FPGA板子上的流水灯程序的控制

文章目录 一 树莓派使用教程二 树莓派串口代码三 Verilog代码四 quartus引脚绑定五 运行效果总结 分别在DE2-115开发板和树莓派上编写串口通信程序, 实现树莓派串口指令对FPGA板子上的流水灯程序的控制,控制方式自定。 一 树莓派使用教程 参考&#xff…

第187题| 快速学会“阿贝尔定理”| 无穷级数(十五)|武忠祥老师每日一题

解题思路:这道题没有告诉我们是多少,没办法求出收敛半径,所以我们只能根据题目给的两个条件来解题(选项代入法)。 1.x-1,说明收敛的中心点是1,观察下列选项,显然答案在C和D之中。 …

Linux中的网络隔离功能 netns

Network Namespace(netns) 是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间,并且各自拥有独立的网络协议栈。通过 namespace 可以隔离容器的进程 PID、文件系统挂载点、主机名等多种资源,它可以为…

基于门控的循环神经网络:LSTM

之前我们介绍了循环神经网络的原理以及实现。但是循环神经网络有一个问题,也就是长期依赖问题。我们之前的01序列预测案例中可以看到,当序列长度到达10以上之后错误就会增多,说明简单的RNN记忆容量较小,当长度更大时就不怎么适用了…

可重构柔性装配产线:为工业制造领域注入了新的活力

随着科技的飞速发展,智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中,可重构柔性装配产线以其独特的技术优势和创新理念,为工业制造领域注入了新的活力,开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…

2024年一些值得关注的边缘计算招投标!中国移动、中国联通、中国铁塔大单来了!...

1.大单来了!中国移动湖北公司算力设备采购(移动边缘云四期扩容)招标公告,3079万! 项目名称:中国移动湖北公司算力设备采购(移动边缘云四期扩容)招标公告 本招标项目为(中国移动湖北公司算力设备采购(移动边缘云四期扩容)&#xff…

Cweek1

C语言学习 一.初识C语言 1.如何写C代码 ①创建工程 ②添加源文件&#xff1a;c文件&#xff1a;源文件&#xff0c;h文件&#xff1a;头文件 代码实例&#xff1a; main函数是程序的入口&#xff0c;有且仅有一个 在C语言中&#xff0c;#include <stdio.h> 是一个预…

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写&#xff08;推荐&#xff09; kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时&#xff0c;命令&#xff1a;bin\windows\zookeeper-server-star…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端&#xff1a;关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…

​​​【收录 Hello 算法】5.3 双向队列

目录 5.3 双向队列 5.3.1 双向队列常用操作 5.3.2 双向队列实现 1. 基于双向链表的实现 2. 基于数组的实现 5.3.3 双向队列应用 5.3 双向队列 在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如图 5-7 所示&#xff0c;双向队列&#xff08…

校园志愿者管理系统带万字文档

文章目录 校园志愿者管理系统一、项目演示二、项目介绍三、10000字论文参考四、部分功能页面五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 校园志愿者管理系统 一、项目演示 校园志愿者管理系统 二、项目介绍 基于Spring…

【数据结构】-- 相交链表-环形链表

交叉链表 . - 力扣&#xff08;LeetCode&#xff09; 如果链表的两条链的长度一样&#xff0c;链表两端对齐&#xff0c;解决这个问题将会变得非常简单&#xff0c;直接分别遍历两个链表&#xff0c;想等时的节点即为所求。我们想办法让链表对齐--分别从a和b遍历链表&#xff…

centos7中如何全局搜索一下nginx的配置文件?

在CentOS 7中搜索Nginx的配置文件&#xff0c;你可以使用一些常用的命令行工具&#xff0c;比如find、grep等。这些工具可以帮助你在文件系统中查找文件&#xff0c;也可以用来查找Docker容器内部的文件&#xff0c;只要你知道如何访问容器的文件系统。 1. 搜索系统中的Nginx配…

nowcoder——回文结构

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 我们来分析该题&#xff1a;我们首先要清楚什么是回文结构&#xff1f;其实就是对称结构。如果一个链表呈对称结构就说明该链表具有回文结构。 下面给上一些例子&#xff1a; 那我们怎么判断该链表是否属于回文结构呢&#xf…

Web3 Tools - Base58

Base58编码 Base58编码是一种用于表示数字的非常见的编码方法。它通常用于加密货币领域&#xff0c;例如比特币和其他加密货币的地址表示。 什么是Base58编码&#xff1f; Base58编码是一种将数字转换为人类可读形式的编码方法。与常见的Base64编码不同&#xff0c;Base58编码…

AI智能体|我把Kimi接入了个人微信

大家好&#xff0c;我是无界生长。 最近加入AI学习交流群的小伙伴越来越多&#xff0c;我打算在微信群接入一个聊天机器人&#xff0c;让它协助管理微信群&#xff0c;同时也帮忙给群友解答一些问题。普通的群聊机器人肯定是不能满足需求的&#xff0c;得上AI大模型&#xff0c…