当前位置: 首页 > news >正文

Nginx 请求的 匹配规则 与 转发规则

博文目录

文章目录

  • URL 与 URI
  • 匹配规则
    • 案例说明
  • 转发规则
    • 响应静态资源
      • 案例说明
    • 转发动态代理
      • 案例说明
      • 案例说明


URL 与 URI

通常, 一个 URL 由以下部分组成

scheme://host:port/path?query#fragment

  • scheme: 协议, 如 http, https, ftp 等
  • host; 主机名或 IP 地址
  • post: 端口, 80 可省略
  • path: 要访问的资源, 从 port 后面的 / 开始, 到 query 前面的 ? 结束, 如 /demo/user/list
  • query: 可选, 查询字符串, 用于向服务器传递参数, 参数之间用 & 符号分隔
  • fragment: 可选, 标识文档中的特定位置, 常用于锚点链接

URI 就是 除去 scheme, host, post 剩余的部分, 以 / 开头, 如 /demo/user/list?name=王#test

匹配规则

  • Nginx Location
  • Beginner’s Guide
  • How nginx processes a request

location [ = | ~ | ~* | ^~ ] uri { ... }

Location 常用配置有两种, 一种叫做 前缀配置, 一种叫做 正则配置

  • 前缀配置: location /, location = /, location ^~ /, location /test, location = /pvw, location ^~ /demo/user/list
  • 正则配置: location ~ \.(gif|jpg|jpeg)$, location ~* \.(gif|jpg|jpeg)$

还有一种以 @ 开头的被称为 Named Location, 这种不能用于常规请求处理, 而是用于请求重定向

Nginx 会将 URL 做如下规范化处理, 然后再根据 Location 配置, 开始尝试匹配

  • 解码以 %XX 形式编码的文本
  • 解析 ... 相对路径组件
  • 将相邻的多个 / 压缩为单个斜杠

Nginx 用请求的 URI 部分与 location 做匹配与响应或转发, 如果 URI 不存在(如: 请求 URL 为 http://host:port), 则认为 URI 为 /

  • 先找前缀配置, 判断 URI 是否以配置的前缀开头, 是的话就匹配到了, 如果匹配到多个前缀配置, 则取前缀最长的这个作为保底配置
    • 若匹配到的最长前缀配置是以 ^~ 开头的, 则匹配搜索将终止
    • 此外, 以 = 开头的是精确匹配, 只匹配 URI 和 location 前缀完全相同的情况, 若匹到了精确匹配, 则匹配搜索将终止
  • 再找正则配置, 按配置文件从上到下的顺序逐一匹配, 在首次匹配到后终止匹配搜索, 如果没有匹配到, 则使用先前找到的前缀配置
    • ~ 开头, 表示区分大小写
    • ~* 开头, 表示不区分大小写
  • 如果前缀配置也没有匹配的, 则匹配失败, 返回 404

案例说明

location = / {[ configuration A ]
}
location / {[ configuration B ]
}
location /documents/ {[ configuration C ]
}
location ^~ /images/ {[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {[ configuration E ]
}
  • http://host:port, 匹配到 A, 精确匹配, 搜索终止
  • http://host:port/index.html, 匹配到 B, 前缀配置里找到 B, 正则配置里没找到, 所以最终使用 B
  • http://host:port/documents/index.html, 匹配到 C, 前缀配置里找到 B 和 C, C 长将 C 设为候选, 正则配置里没找到, 所以最终使用 C
  • http://host:port/images/1.gif, 匹配到 D, 前缀配置里找到 B 和 D, D 长将 D 设为候选, 因 D 以 ^~ 开头, 搜索终止, 最终使用 D
  • http://host:port/documents/1.jpg, 匹配到 E, 前缀配置里找到 B 和 C, C 长将 C 设为候选, 正则配置里找到 E, 搜索终止, 最终使用 E

转发规则

响应静态资源

  • 请求的 URI 会被添加到 root 指定的路径后, 在本地文件系统上形成请求文件的路径
# 匹配到 / 的, 服务器发送 /data/www 目录 + Path 路径 的文件
location / {root /data/www;
}
# 匹配到 /images/ 的, 服务器发送 /data 目录 + Path 路径 的文件
location /images/ {root /data;
}

案例说明

  • http://host:port/a/b.gif
    • 请求 URI 为 /a/b.gif
    • 响应文件为 /data/www/a/b.gif
  • http://host:port/images/a/b.gif
    • 请求 URI 为 /images/a/b.gif
    • 响应文件为 /data/images/a/b.gif

转发动态代理

Nginx proxy_pass

  • 无需关心 location 后面的前缀是否以 / 结尾, 因为只有一种无关紧要的特殊情况, 绝大多数时候, 是否以 / 结尾没有区别

  • 需要关心的是 proxy_pass 后面指定的 URL 中是否有 URI 部分. 即使端口后面只有 /, 那也是有 URI

    • 有: 把请求 URI 中与 location 配置匹配的部分剔除掉, 然后拼到 proxy_pass 指定的 URL 后面
    • 无: 把请求 URI 直接拼到 proxy_pass 指定的 URL 后面
      • 通过这种方式可以魔改请求 URL, 达到隐藏真实 URL 的效果
  • 除此之外, 还有 3 个例外情况

    • location 使用正则或者 Named (@) 时, Nginx 无法确定要替换的请求 URI 中的哪一部分, 这时候 proxy_pass 后面不能带 URI
    • 使用 rewrite 指令修改了请求的 URI 时, proxy_pass 指令中的 URI 会被忽略, 转发服务器将收到修改后的完整请求 URI
    • 如果在 proxy_pass 指令中使用了 URI 变量, 它将原封不动地传递给转发服务器,替换原始的请求 URI
      • 例如,在 proxy_pass http://127.0.0.1$request_uri; 中,$request_uri 变量将被替换为原始请求的 URI

案例说明

location /test {proxy_pass http://localhost:8080/demo;
}
location /foo/bar {proxy_pass http://localhost:8080;
}
location /a {proxy_pass http://localhost:8080/;
}
location /b/c {proxy_pass http://localhost:8080/demo;
}
  • http://host:port/test/a/b/c
    • 请求 URI 是 /test/a/b/c
    • 匹配到 location /test
    • proxy_pass 后面的 url 有 uri 部分, uri 为 /demo
    • 把匹配到 location 的 uri 开头部分的 /test 剔除, 剩余 /a/b/c
    • 拼到 proxy_pass 指定的 url 后面, 最终转发到 http://localhost:8080/demo/a/b/c
  • http://host:port/foo/bar/a/b
    • 请求 URI 是 /foo/bar/a/b
    • 匹配到 location /foo/bar
    • proxy_pass 后面的 url 无 uri 部分
    • 拼到 proxy_pass 指定的 url 后面, 最终转发到 http://localhost:8080/foo/bar/a/b
  • http://host:port/a/b/c
    • 请求 URI 是 /a/b/c
    • 匹配到 locataion /a
    • proxy_pass 后面的 url 有 uri 部分, uri 为 /
    • 把匹配到 location 的 uri 开头部分的 /a 剔除, 剩余 /b/c
    • 拼到 proxy_pass 指定的 url 后面, 最终转发到 http://localhost:8080//b/c
  • http://host:port/b/c/d
    • http://localhost:8080/demo/d

案例说明

后端服务为 http://springboot:8080/demo/user/list

# http://localhost/demo/user/list, 通
location /demo {proxy_pass http://springboot:8080;
}
# http://localhost/demo/user/list, 通
location /demo/user {proxy_pass http://springboot:8080;
}# http://localhost/test/user/list, 通
location /test {proxy_pass http://springboot:8080/demo;
}
# http://localhost/a/b/user/list, 通
location /a/b {proxy_pass http://springboot:8080/demo;
}
# http://localhost/a/b/c/list, 通
location /a/b/c {proxy_pass http://springboot:8080/demo/user;
}# http://localhost/demo/user/list, 通
location /demo {proxy_pass http://springboot:8080$request_uri;
}

相关文章:

Nginx 请求的 匹配规则 与 转发规则

博文目录 文章目录 URL 与 URI匹配规则案例说明 转发规则响应静态资源案例说明 转发动态代理案例说明案例说明 URL 与 URI 通常, 一个 URL 由以下部分组成 scheme://host:port/path?query#fragment scheme: 协议, 如 http, https, ftp 等host; 主机名或 IP 地址post: 端口…...

OWASP发布10大开源软件风险清单

3月20日,xz-utils 项目被爆植入后门震惊了整个开源社区,2021 年 Apache Log4j 漏洞事件依旧历历在目。倘若该后门未被及时发现,那么将很有可能成为影响最大的软件供应链漏洞之一。近几年爆发的一系列供应链漏洞和风险,使得“加强开…...

大学生前端学习第一天:了解前端

引言: 哈喽,各位大学生们,大家好呀,在本篇博客,我们将引入一个新的板块学习,那就是前端,关于前端,GPT是这样描述的:前端通常指的是Web开发中用户界面的部分,…...

公安机关人民警察证照片采集规范及自拍制作电子版指南

在当今社会,证件照的拍摄已成为我们生活中不可或缺的一部分。无论是办理身份证、驾驶证还是护照,一张规范的证件照都是必需的。而对于公安机关的人民警察来说,证件照片的采集更是有着严格的规范和要求。本文将为您详细介绍公安机关人民警察证…...

使用Python插入100万条数据到MySQL数据库并将数据逐步写出到多个Excel

Python插入100万条数据到MySQL数据库 步骤一:导入所需模块和库 首先,我们需要导入 MySQL 连接器模块和 Faker 模块。MySQL 连接器模块用于连接到 MySQL 数据库,而 Faker 模块用于生成虚假数据。 import mysql.connector # 导入 MySQL 连接…...

【备忘录】openssl记录

openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.crt -subj “/CCN/STBeijing/LBeijing/Okubernetes/OUKubernetes-manual/CNkubernetes-ca” openssl genrsa -out etcd-ca.key 2048 openssl req -x509 -new -nodes -key etc…...

hadoop编程之工资序列化排序

数据集展示 7369SMITHCLERK79021980/12/17800207499ALLENSALESMAN76981981/2/201600300307521WARDSALESMAN76981981/2/221250500307566JONESMANAGER78391981/4/22975207654MARTINSALESMAN76981981/9/2812501400307698BLAKEMANAGER78391981/5/12850307782CLARKMANAGER78391981/…...

OpenXR手部跟踪接口与VIVE OpenXR扩展详细解析

随着虚拟现实技术的发展,手部跟踪已成为提高沉浸感和交互性的关键技术。OpenXR标准为开发者提供了一套手部跟踪的扩展接口,特别是针对VIVE设备的特定实现。以下是这些接口和类的详细解释: 1. VIVE.OpenXR.Hand VIVE.OpenXR.Hand 是HTC VIVE…...

慎投!5本On Hold全被剔除!新增9本SCI/SSCI被除名!4月WOS更新

本周投稿推荐 SSCI • 2/4区经管类,2.5-3.0(录用率99%) SCIE(CCF推荐) • 计算机类,2.0-3.0(最快18天录用) SCIE(CCF-C类) • IEEE旗下,1/2…...

华为云CodeArts IDE For Python 快速使用指南

CodeArts IDE 带有 Python 扩展,为 Python 语言提供了广泛的支持。Python 扩展可以利用 CodeArts IDE 的代码补全、验证、调试和单元测试等特性,与多种 Python 解释器协同工作,轻松切换包括虚拟环境和 conda 环境的 Python 环境。本文简要概述…...

C# 截图并保存为图片

在winform开发中,有时会用到截图并保存为图片的时候,这里列了三种保存图片的可能情况。 将窗体截图保存成图片的方式是: Bitmap bit new Bitmap(this.Width, this.Height);//实例化一个和窗体一样大的bitmap Graphics g Graphics.FromImag…...

[html]一个动态js倒计时小组件

先看效果 代码 <style>.alert-sec-circle {stroke-dasharray: 735;transition: stroke-dashoffset 1s linear;} </style><div style"width: 110px; height: 110px; float: left;"><svg style"width:110px;height:110px;"><cir…...

Hive-Sql复杂面试题

参考链接&#xff1a;hive sql面试题及答案 - 知乎 有哪些好的题目都可以给我哦 我来汇总到一起 1、编写sql实现每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数 数据&#xff1a; userid,month,visits A,2015-01,5 A,2015-01,15 B,2015-01,5 A,2015-01,…...

WPS二次开发系列:WPS SDk功能就概览

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 作者通过深度测试使用了WPS SDK提供的Demo&#xff0…...

华为OD-C卷-结队编程[200分]

题目描述 某部门计划通过结队编程来进行项目开发, 已知该部门有 N 名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程, 结队分组规则如下: 从部门中选出序号分别为 i、j、k 的3名员工,他们的职级分别为 level[i],level[j],level[k], 结队小组满…...

连连看游戏页面网站源码,直接使用

可以上传自己喜欢的图片 游戏页面 通关页面 源码免费下载地址抄笔记 (chaobiji.cn)...

在 Kubernetes 1.24 中使用 Docker:配置与应用指南

在 Kubernetes 1.24 中使用 Docker&#xff1a;配置与应用指南 引言 随着 Kubernetes 社区对容器运行时接口&#xff08;CRI&#xff09;的标准化推进&#xff0c;Docker 原生支持在 Kubernetes 1.24 版本中被弃用。然而&#xff0c;许多开发者和组织仍希望继续使用 Docker。…...

Canvas使用详细教学:从基础绘图到进阶动画再到实战(海报生成、Flappy Bird 小游戏等),掌握绘图与动画的秘诀

一、Canvas基础 1. Canvas简介 Canvas是HTML5引入的一种基于矢量图形的绘图技术&#xff0c;它是一个嵌入HTML文档中的矩形区域&#xff0c;允许开发者使用JavaScript直接操作其内容进行图形绘制。Canvas元素不包含任何内在的绘图能力&#xff0c;而是提供了一个空白的画布&a…...

【MATLAB 分类算法教程】_2粒子群算法优化支持向量机SVM分类 - 教程和对应MATLAB代码

分类代码案例2:粒子群算法优化支持向量机SVM分类 - MATLAB完全代码教程 1. 初始化代码2. 读取数据代码3.数据预处理代码4.利用粒子群算法PSO求解最佳的SVM参数c和g代码5.根据最佳的参数进行SVM模型训练代码6.SVM模型预测代码7.准确率分析以及分类结果对比作图代码本文以红酒数…...

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发action…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...