【nginx】nginx之location规则详解:

news2024/10/10 10:22:54

文章目录

        • 一、语法规则:
        • 二、优先级:
        • 三、验证:
            • 1、精确匹配:
            • 2、通过^~方式实现匹配:
            • 3、通过”~”方式实现匹配:
            • 4、通过"~*"方式实现匹配:
            • 5、”!~*” 和”!~” 不常用,再次不做介绍
            • 6、通过”/” 实现通用匹配:


一、语法规则:

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可(非正则)

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则

/ 通用匹配,任何请求都会匹配到

二、优先级:

等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他location的匹配项

^~和通用匹配。使用前缀匹配,不支持正则表达式,如果有多个location匹配成功的话,不会终止匹配过程,会匹配表达式最长的那个(下方有例子)

如果上一步得到的最长的location为^~类型,则表示阻断正则表达式,不再匹配正则表达式

如果上一步得到的最长的location不是^~类型,继续匹配正则表达式,只要有一个正则成功,则使用这个正则的location,立即返回结果,并结束解析过程

在这里插入图片描述

三、验证:

1、精确匹配:

在conf.d文件夹下创建配置文件test.com.conf,内容如下:
在这里插入图片描述
上图中第一个和第二个location匹配条件一样,都是/test.html,但第二个为精准匹配到静态路径,因此第一个不会执行,会执行第二个,www.test.com为本地域名解析,access_log和error_lor可以单独为每个模块定义日志
通过域名和路径访问后的内容如下:
在这里插入图片描述
注意:路径/usr/share/nginx/test_html文件夹下需要有test.html才可以正常访问

上图中指定静态资源路径用的关键字root,还可以用alias,那么root和alias的区别是什么?
(1)用root属性指定的值是要加入到最终路径中的,匹配条件会拼接到路径中
(2)用alias属性指定的值不需要加入到最终路径中

如上图中所示,请求的条件为test.html,通过root指定的路径为/usr/share/nginx/test_html,因此在匹配的时候,这个路径下就必须要有test.html这个文件才可以,否则就会找不到而报错,如果用alias,那么通过浏览器进行请求的时候,alias也是指定到/usr/share/nginx/test_htm路径下,但是会匹配默认的index.html,而无须强制匹配test.html,但是此时就不能使用”=”来进行精确匹配,现在将root改为alias,如图:
在这里插入图片描述
注意:alias指定的路径结尾要加”/”

下面的配置文件采用roo指定路径,当通过域名请求http://www.test.com/html/的时候,将跳转到/usr/share/nginx/html/下的index.html页面,如图:
在这里插入图片描述

下面的配置文件采用alias指定路径,请求http://www.test.com/linshi/的时候,将跳转到/usr/share/nginx/test_html/index.html页面,如图:
在这里插入图片描述

2、通过^~方式实现匹配:

例如:下面配置文件有两条规则,分别匹配url以字母a开头,但是长度不同,首先将长的规则先注释掉,如图:
在这里插入图片描述

通过curl请求查看状态码,如图:
在这里插入图片描述

说明:当前只有一个规则开启,因此当匹配url以/a/开头的任何url时,都会返回状态码666

现在将第二条规则注释取消,打开规则,如图:
在这里插入图片描述
再次发起同样的请求,观察返回状态码,如图:
在这里插入图片描述

从上图可以看出,两条规则同时被匹配成功,但是第二条规则比较长,因此第二条规则优先被匹配,如果^~匹配成功了,那么表示阻断正则表达式,不再进行正则匹配

3、通过”~”方式实现匹配:

上图中的匹配规则都是通过”^~”方式来实现的,那么在匹配最长规则的时候又分为两种情况:
第一种:最长规则通过~来实现匹配(上图中的最长规则就是通过~实现)
第二种:最长的规则不是通过^~实现匹配,而是通过普通匹配来实现

当最长规则是通过普通匹配的时候,将会继续正则匹配, 只要有一个正则成功,则使用这个正则的location,停止继续匹配,返回结果
现在将第二条规则改为普通匹配,并添加一条正则匹配,如图:
在这里插入图片描述
再次执行同样的请求命令,得到的状态码如下:
在这里插入图片描述

说明:从上图可以看出请求/a/b/的时候,首先会到达第二条规则(最长规则),由于第二条规则为普通匹配(不是^~匹配),因此会继续去匹配正则,也就是第三条规则,因此最终返回状态码为888

4、通过"~*"方式实现匹配:

” ~* ” 表示不区分大小写的正则匹配
例如:通过url请求/a/b/或者/A/B/,查看返回状态码,如图:
在这里插入图片描述
请求结果如下:
在这里插入图片描述
从上图可以看出,无论匹配的是大写还是小写,都会返回对应状态码888
常用方法还有匹配图片后缀,并返回指定信息,如图:
在这里插入图片描述
在这里插入图片描述

5、”!~*” 和”!~” 不常用,再次不做介绍
6、通过”/” 实现通用匹配:

本例子中,9091服务为httpd
第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/),如图:
在这里插入图片描述
说明:proxy_pass最后面没有斜杠”/”,此时通过浏览器请求http://10.9.2.248/bbb/,那么实际访问的地址就是 http://10.9.2.248:9091/bbb/,会将匹配路径/bbb一起加过去
此时如果在http的目录页面目录htdocs中创建目录bbb,在bbb目录下创建文件index.html,然后即可实现正常访问,如图:
在这里插入图片描述

第二种情况: proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/),如图:
在这里插入图片描述
说明:proxy_pass最后面有斜杠”/”,此时通过浏览器请求http://10.9.2.248/bbb/,那么实际访问的地址就是 http://10.9.2.248:9091,会将/bbb抛弃的,如图:
在这里插入图片描述

第三种情况:proxy_pass后面还有其他路径但是最后没有 “/”, 匹配路径也有斜杠(/bbb/) ,如图:
在这里插入图片描述
说明,此时通过浏览器访问http://10.9.2.248/bbb/index.html,实际请求的是http://10.9.2.248/cxxindex.html(注意位置是默认路径下,不是ccc路径下,如果proxy_pass的路径为/ccc/ddd,那么实际请求的就是ccc路径下的cccindex.html)
在httpd的默认路径下(htdocs)创建文件cxxindex.html,然后访问,如图:
在这里插入图片描述

第四种情况: proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/) ,如图:
在这里插入图片描述
说明:此时通过浏览器访问:http://10.9.2.248/bbb/index.html,实际访问的是http://10.9.2.248/ccc/index.html
在httpd默认路径下(htdocs)创建一个名称为ccc的文件夹,在内部定义一个index.html,然后访问,如图:
在这里插入图片描述

第五种情况:location匹配路径末尾没有 “/”,proxy_pass后面也没有”/”,如图:
在这里插入图片描述
说明:8081端口为httpd的服务器端口,如果匹配路径和proxy_pass后都没有”/”,那么此时访问http://10.9.2.248/bbb,默认将请求到http://127.0.0.1:8081/bbb/index.html的内容,此时在httpd默认路径htdocs下创建文件夹bbb,内部创建index.html,定义内容为:i am match bbb,通过IP请求如图:
在这里插入图片描述

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

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

相关文章

JWT token

一、为什么使用JWT? 随着分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成token的方式做登录身份验证,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式…

vue/cli 自定义配置

vue/cli 自定义配置 1、更改默认的端口号8080 只需要更改vue.config.js文件 1、更改默认的端口号8080 只需要更改vue.config.js文件

2023年基准Kubernetes报告:6个K8s可靠性失误

云计算日益成为组织构建应用程序和服务的首选目的地。尽管一年来经济不确定性的头条新闻主要集中在通货膨胀增长和银行动荡方面,但大多数组织预计今年的云使用和支出将与计划的相同(45%),或高于计划的(45%)…

Vite+Typescript+Vue3学习笔记

ViteTypescriptVue3学习笔记 1、项目搭建 1.1、创建项目(yarn) D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages...success Installed…

MyBatisPlus之DQL编程控制

MyBatisPlus之DQL编程控制 1. 条件查询方式1.1 条件查询1.1.1 方式一:按条件查询1.1.2 方式二:lambda格式按条件查询1.1.3 方式三:lambda格式按条件查询(推荐) 1.2 组合条件1.2.1 并且关系(and)…

【算法 -- LeetCode】(027) 移除元素

1、题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

【Linux进程】进程控制(中) {进程等待:等待的必要性,进程等待的方法wait,waitpid,退出状态status,waitpid非阻塞等待}

三、进程等待 3.1 进程等待必要性 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill …

easyexcel 将对应列的格式改为数字或者文本格式

1.在easyexcel 导出excel时 需要将某个列的格式指定,例如指定为数字格式 例如 需要把单元格格式设置为数值,并且保留小数点后三位,按道理来说应该是这样子设置 /** * test, 最终导出值 */ ExcelProperty(value "test")…

01 linux基础(1)

环境安装 解压,从vmware打开虚拟机。 设置密码:1 打开终端:ctrlaltt linux介绍 Linux的发展 1)1969年,由kenthompson在AT&T贝尔实验室实现的。使用的是汇编语言。 2)1970年,KenThompson…

【Linux后端服务器开发】HTTPS协议

目录 一、加密算法 二、中间人攻击 三、CA认证 一、加密算法 HTTPS协议是什么?HTTPS协议也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层。 HTTP协议内容是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况…

Java使用FFmpeg实现mp4转m3u8

Java使用FFmpeg实现mp4转m3u8 前言FFmpegM3U8 一、需求及思路分析二、安装FFmpeg1.windows下安装FFmpeg2.linux下安装FFmpegUbuntuCentOS 三、代码实现1.引入依赖2.修改配置文件3.工具类4.Controlle调用5.Url转换MultipartFile的工具类 四、播放测试1.html2.nginx配置3.效果展示…

QT读写ini文件

QT读写ini文件 源代码文件结构mysql.hmysql.cppmain.cpp my.ini文件截图运行截图QSettings 最开始的需求是使用qt读取不同电脑上的MySQL的my.ini文件实现在不同电脑上也可以成功登录数据库,不用担心密码和用户名不同的问题 到之后发现其实并没有什么用,因…

一文搞定Java IO流,输入流、输出流、字符流、缓冲流,附详细代码示例

目录 一、InputStream1、FileInputStream的代码示例2、ByteArrayInputStream的代码示例3、PipedInputStream的代码示例 二、 OutputStream1、FileOutputStream代码示例2、ByteArrayOutputStream代码示例:3、PipedOutputStream代码示例: 三、字符输入流Re…

7.25 作业 QT

手动实现登录框&#xff1a; widget.cpp: #include "widget.h" #include <QMovie> Widget::Widget(QWidget *parent): QWidget(parent) {//设置尺寸this->resize(800,600); //设置宽高//设置固定尺寸this->setFixedSize(800,600);//窗口标题操作qDebu…

C数据结构与算法——顺序栈 应用(C语言纯享版 迷宫)

实验任务 (1) 掌握顺序栈及其C语言的表示&#xff1b; (2) 掌握入栈、出栈等基本算法的实现&#xff1b; (3) 掌握顺序栈的基本应用&#xff08;求解迷宫通路&#xff09;。 实验内容 使用C语言实现顺序栈的类型定义与算法函数&#xff1b;编写main()函数并根据需要修改、补…

❓“如何创业?互联网创业又该如何入手?

&#x1f31f;5大创业建议&#xff0c;让你轻松入门&#xff01; 作为一名互联网创业者&#xff0c;我想分享一下我的创业经验。下面是我的五个建议&#xff0c;希望对你有所帮助&#xff01; &#x1f31f;了解市场需求 在创业之前&#xff0c;了解市场需求非常重要。你需要研…

【Rust日报】2023-07-24 使用 Rust 重写的InfluxDB 3.0

使用 Rust 重写的InfluxDB 3.0 InfluxDB 是一个开源的、分布式的时序数据库&#xff0c;用于存储和分析时间序列数据, 于 2013 年由 Brian Bondy 和 Nicholas Zakhariev 创立。 InfluxDB 最初是用 Go 语言编写的。 2018 年&#xff0c;InfluxData 决定将 InfluxDB 重写为 Rust …

kotlin 编写一个简单的天气预报app(一)

使用Android Studio开发天气预报APP 今天我来分享一下如何使用Android Studio开发一个天气预报APP。在文中&#xff0c;我们将使用第三方接口获取实时天气数据&#xff0c;并显示在APP界面上。 步骤一&#xff1a;创建新项目 首先&#xff0c;打开Android Studio并创建一个新…

Flutter 最佳实践和编码准则

Flutter 最佳实践和编码准则 视频 前言 最佳实践是一套既定的准则&#xff0c;可以提高代码质量、可读性和可靠性。它们确保遵循行业标准&#xff0c;鼓励一致性&#xff0c;并促进开发人员之间的合作。通过遵循最佳实践&#xff0c;代码变得更容易理解、修改和调试&#xff…

【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码(一)

系列文章 【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…