nginx 的 location 模块

目录

一、匹配规则

1.基础匹配

2.精确匹配

3.前缀匹配

4.正则表达式匹配

二、优先级顺序

三、示例

1.精确匹配

 2.前缀匹配

3.正则匹配

4.默认匹配

第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/)

第二种情况: proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/)

第三种情况:proxy_pass后面还有其他路径但是最后没有 “/”, 匹配路径也有斜杠(/bbb/) 

第四种情况: proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/) 

第五种情况:location匹配路径末尾没有 “/”,proxy_pass后面也没有“/”


一、匹配规则

1.基础匹配

  • location / { ... }:这是最基本的匹配,匹配所有请求。因为它没有指定具体的文件或目录,所以通常作为后备选项出现。

2.精确匹配

  • location = /exact/path { ... }:精确匹配这个路径。如果请求的 URI 完全等于 /exact/path,则使用这个 location 块的配置处理此请求。这具有最高的优先级。

3.前缀匹配

  • location /prefix/ { ... }:前缀匹配请求的 URI 的开始部分。如果请求的 URI 以 /prefix/ 开始,这个 location 块将被用来处理请求。
  • location ^~ /prefix/ { ... }:前缀匹配,但它会停止正则表达式匹配,即使正则表达式可能会更具体匹配。如果该 location 匹配,Nginx 不会考虑之后的正则 location 块。

4.正则表达式匹配

  • location ~ /regex/ { ... }:大小写敏感的正则匹配。
  • location ~* /regex/ { ... }:大小写不敏感的正则匹配。
  • location / { ... } 正则表达式匹配会在普通字符串前缀匹配后进行。如果有多个正则表达式 location 都匹配请求,则使用第一个匹配的 location 块。

二、优先级顺序

Nginx 处理请求时 location 匹配的优先级顺序如下:

  1. 首先进行精确匹配 location =
  2. 其次按文件中出现顺序匹配所有正则表达式 location ~ 和 location ~*
  3. 然后进行最长的前缀匹配 location ^~
  4. 最后是通常的前缀匹配 location /prefix/
  5. 如果前面的匹配都没有找到,就使用默认的 location /

三、示例

1.精确匹配

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;location /test.html {root /usr/share/nginx/html;}location = /test.html {#通过 root 路径,会将条件拼接进来root /var/www/html;index index.html;}error_page 404 /404.html;    location = /404.html {root /usr/share/nginx/test_html;}error_page 500 502 503 504 /50x.html;location = /50x.html {}
}
# 第一个和第二个location匹配条件一样,都是/test.html
# 但第二个为精准匹配到静态路径,因此第一个不会执行,会执行第二个。
server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;location /test.html {#通过alias指定路径,无需拼接条件#alias指定的路径结尾要加“/”alias /usr/share/nginx/test_html/;}error_page 404 /404.html;    location = /404.html {root /usr/share/nginx/test_html;}error_page 500 502 503 504 /50x.html;location = /50x.html {}
}# 指定静态资源路径除了使用关键字root,还可以用alias。
# 那么root和alias的区别是什么?
# 用root属性指定的值是要加入到最终路径中的,匹配条件会拼接到路径中
# 用alias属性指定的值不需要加入到最终路径中# 请求的条件为test.html,通过root指定的路径为/usr/share/nginx/test_html,因此在匹配的时候,这个路径下就必须要有test.html这个文件才可以,否则就会找不到而报错,如果用alias,那么通过浏览器进行请求的时候,alias也是指定到/usr/share/nginx/test_htm路径下,但是会匹配默认的index.html,而无须强制匹配test.html。# 不能使用”=”来进行精确匹配

 2.前缀匹配

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;location ^~ /a/ {root /data/webroot/;}location ^~ /a/www/ {root /data/webroot/;}}# 当请求为 http://welcome.com/a/ 时,访问 /data/webroot/a/ 下的index.html文件
# 当请求为 http://welcome.com/a/www/ 时,访问 /data/webroot/a/www/ 下的index.html文件
# 如果^~匹配成功了,那么表示阻断正则表达式,不再进行正则匹配

3.正则匹配

# 正则表达式匹配,大小写敏感
server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;location ~ \.(gif|jpg|png)$ {root /var/www/images;}error_page 404 /404.html;    location = /404.html {root /usr/share/nginx/test_html;}error_page 500 502 503 504 /50x.html;location = /50x.html {}
}
# 正则表达式匹配,大小写不敏感
server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;location ~* \.(css|js)$ {root /var/www/assets;}error_page 404 /404.html;    location = /404.html {root /usr/share/nginx/test_html;}error_page 500 502 503 504 /50x.html;location = /50x.html {}
}

4.默认匹配

第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/)

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;#默认匹配location /bbb/ {proxy_pass http://127.0.0.1:9190;proxy_redirect    off;proxy_set_header    Host $host;proxy_set_header    X-Real-IP $remote_addr;proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;}}# proxy_pass最后面没有斜杠“/”,此时通过浏览器请求http://10.9.2.248/bbb/
# 那么实际访问的地址就是 http://127.0.0.1:9190/bbb/,会将匹配路径/bbb一起加过去。

第二种情况: proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/)

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;#默认匹配location /bbb/ {proxy_pass http://127.0.0.1:9190/;proxy_redirect    off;proxy_set_header    Host $host;proxy_set_header    X-Real-IP $remote_addr;proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;}}
# proxy_pass最后面有斜杠”/”,此时通过浏览器请求http://10.9.2.248/bbb/
# 那么实际访问的地址就是 http://127.0.0.1:9190,会将/bbb抛弃的,

第三种情况:proxy_pass后面还有其他路径但是最后没有 “/”, 匹配路径也有斜杠(/bbb/) 

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;#默认匹配location /bbb/ {proxy_pass http://127.0.0.1:9190/ccc;proxy_redirect    off;proxy_set_header    Host $host;proxy_set_header    X-Real-IP $remote_addr;proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;}
}
# 通过浏览器访问http://10.9.2.248/bbb/index.html
# 实际请求的是http://127.0.0.1/index.html
# 位置是默认路径下,不是ccc路径下
# 如果proxy_pass的路径为/ccc/ddd,那么实际请求的就是ccc路径下的cccindex.html

第四种情况: proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/) 

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;#默认匹配location /bbb/ {proxy_pass http://127.0.0.1:9190/ccc/;proxy_redirect    off;proxy_set_header    Host $host;proxy_set_header    X-Real-IP $remote_addr;proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;}
}
# 通过浏览器访问:http://10.9.2.248/bbb/index.html,
# 实际访问的是http://127.0.0.1/ccc/index.html

第五种情况:location匹配路径末尾没有 “/”,proxy_pass后面也没有“/”

server {listen 80;listen [::]:80;server_name welcome.com;access_log /etc/nginx/vhost/logs/access_welcome.log;error_log /etc/nginx/vhost/logs/error_welcome.log;#默认匹配location /bbb {proxy_pass http://127.0.0.1:9190;proxy_redirect    off;proxy_set_header    Host $host;proxy_set_header    X-Real-IP $remote_addr;proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;}
}
# 匹配路径和proxy_pass后都没有”/”
# 访问http://10.9.2.248/bbb
# 默认将请求到http://127.0.0.1:9190/bbb/index.html的内容

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

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

相关文章

日常开发Git命令

场景: 在远程库创建分支后,在本地开发后-合并代码-push到远程库 命令行 #查看现在分支 git branch #切换到master分支 git checkout master #拉取远程库修改 git pull git branch #切换到修改的分支 git checkout feature/s3-use-internel-name #merg…

c1-第三周

文章目录 1月份2.定义一个整形数组arr2.定义整形栈s3.输入一个字符串包括大小写和数字,将其中的大写英文字母改为小写,并且输出数字个数4.根据下面数据,编程实现要求功能: 9月1.编写程序实现以下功能或问题3.完成以下功能4.对运算…

数据结构之单链表详解(C语言手撕)

​ 🎉个人名片:🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN…

移动执法远程视频监控方案:视频监控系统EasyCVR+4G/5G移动执法仪

一、背景需求 在现代城市管理中,移动执法仪视频监控方案正逐渐成为一种高效、便捷的管理工具。该方案通过结合移动执法仪和视频监控技术,实现了对城市管理现场的实时监控和取证,有效提升了城市管理水平和效率。 移动执法仪作为现场执法的重…

深入浅出(二)MVVM

MVVM 1. 简介2. 示例 1. 简介 2. 示例 示例下载地址:https://download.csdn.net/download/qq_43572400/88925141 创建C# WPF应用(.NET Framework)工程,WpfApp1 添加程序集 GalaSoft.MvvmLight 创建ViewModel文件夹,并创建MainWindowV…

探索免安装的轻量级数据库:SQLite、SQL Server Compact

在应用程序开发中,有时候我们不需要复杂的数据库系统,而只需要一个轻量级的解决方案来存储和管理数据。本文将向您介绍三种免安装的轻量级数据库:SQLite和SQL Server Compact,并提供它们的特性、使用方式和实际应用场景。 1、SQL…

S3---FPGA-A7板级电源硬件实战

视频链接 FPGA-A7板级电源硬件实战01_哔哩哔哩_bilibili FPGA-A7板级电源硬件实战 1、基于A7 板级的系统框图 2、基于A7 板级的电源设计细则 2.1、A7 FPGA功耗评估 Artix-7 FPGA电源有VCCINT, VCCBRAM, VCCAUX, VCCO, VMGTAVCC和VMGTAVTT。 2.1.1、A7 FPGA电源管脚 2.1.2…

vue2的element UI 表格单选

代码 this.$refs.multipleTable.toggleRowSelection(selection.shift(), false);multipleTable 是定义的表格的ref

Qt添加VTK并绘制图形

文章目录 准备环境使用VS创建Qt Widget项目配置VTK依赖调试C/C链接器 添加vtk窗口测试代码 参考链接: VS2017配置QT环境(详细版)_vs2017 qt-CSDN博客 QT5VTK9.1最新配置方法_qt vtk-CSDN博客 VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget-CSDN博客 准…

【C++】设计模式:观察者、策略、模板

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍设计模式:观察者、策略、模板。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#xf…

构建MySQL数据库的高可用与高容错系统:关键策略与最佳实践

简介 在今天的数据驱动时代,数据库的高可用性(High Availability, HA)和高容错性(High Fault Tolerance)不再是可选项,而是每一个企业和应用都必须考虑的核心特性。特别是对于MySQL这样广泛使用的数据库系统,如何确保它能在各种故障面前保持持续可用,并且能迅速从故障…

VsCode搭建Spring Boot项目环境

VsCode搭建Spring Boot项目环境 1、前提条件:配置Java环境 下载安装JDK配置环境变量 2、VsCode配置SpringBoot环境 安装扩展 配置Maven 找到Maven配置文件,进行打开settings.json,添加如下代码: "workbench.iconThem…

用C语言easyx 做一个《正弦彩环》

#include <easyx.h> #include <cmath> #include<stdio.h> #define WIN_WIDTH 800 #define WIN_HEIGHT 800int main() {// 初始化图形界面initgraph(WIN_WIDTH, WIN_HEIGHT);setbkcolor(WHITE);cleardevice();// 开启双缓冲// BeginBatchDraw();// 设置颜色变…

数字孪生技术快速构建智慧光伏电站智能运维系统

前言 光伏即光生伏特&#xff0c;是通过半导体材料实现的光电转化。以太阳能电池板为核心的光伏设施将太阳能直接转化为电能&#xff0c;释放光能这一清洁能源的应用价值。 经过十几年的发展&#xff0c;光伏产业已成为我国少有的形成国际竞争优势、实现端到端自主可控、并有望…

Python数据处理实战(5)-上万行log数据提取并分类进阶版

系列文章&#xff1a; 0、基本常用功能及其操作 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xff0c;上万行log数据提取并作图进阶版 …

HttpRequest请求模块设计与实现(http模块二)

目录 类功能 类定义 类实现 编译测试 类功能 类定义 // HttpRequest请求模块 class HttpRequest { public:std::string _method; // 请求方法std::string _path; // 资源路径std::string _version…

MySQL查询优化方案汇总(索引相关)

索引相关 类型隐式转换 大坑 **字段filed1是varchar类型&#xff0c;且加了索引&#xff0c;如果 where filed1 123; type 可能是all&#xff0c;因为123是数字类型&#xff0c;mysql内部会用函数做隐式转换&#xff0c;用了函数&#xff0c;索引就失效了。**大数据深度分页…

【技术干货】教你如何基于华为昇腾CANN架构快速实现模型推理应用(内含视频教程)

昇腾的AI全软件栈平台、开源框架、CANN、MindSpore、MindX 等工具&#xff0c;可以让开发者实现「统一端边云&#xff0c;全端自动部署」&#xff0c;开启了机器学习开发的新时代&#xff0c;一直被人们寄予厚望。但正因为资源极其丰富&#xff0c;浩如星辰&#xff0c;想要快速…

使用Python进行股票分析(1)

简介 Python具有非常好的数据分析和数据可视化的功能。在本文中&#xff0c;我们将通过使用Python获取股票的闭市价格&#xff0c;并且对股票价格进行分析从而向我们提供买卖股票的依据。 数据获取 需要说明的是在这里我们获取的是美国股票的数据。至于中国股市的数据大家可…

LeetCode 第53天 | 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和 PTA一些注意点 动态规划

1143. 最长公共子序列 最长公共子序列和最长公共子数组的区别在于&#xff0c;dp中子序列可以不连续&#xff0c;可以从左上&#xff08;text1[i-1] text2[j-1]&#xff09;推出&#xff0c;也能从左边或者上边&#xff08;取最大值&#xff09;推出&#xff1b;公共子数组只能…