Nginx系列-3 servername优先级和location优先级和常用正则表达式

1.正则表达式和分组

由于Nginx配置文件中经常出现正则表达式,因此本章节专门对常见的正则表达式进行简单介绍。
[1] 开始与结束

^表示匹配输入字符串的开始   
$表示匹配输入字符串的结束

[2] 匹配次数

?表示匹配0次或者1次
+表示匹配1次或多次
*表示匹配0从或多次
{n}匹配n次,{n,}至少匹配n次,{n,m} 匹配n至m次

[3] 匹配字符

\符号用于转义.匹配除\n之外的任意字符[xyz]表示匹配xyz中任意一个字符[a-z]表示匹配任意小写字母;[^a-z]取反,表示匹配除小写字母之外的任意字符;
[A-Z]表示匹配任意大写字母;[a-zA-Z]匹配任意字母;[0-9]表示匹配任意数字, 等价于\d;  [^0-9]表示匹配任意数字, 等价于\D
\s匹配任何空白字符;\S匹配任何非空白字符;x|y 表示匹配x或y

[4] 分组

rewrite ^/group/(.*)$   /index.php?param=$1;

rewrite表示地址重写,将匹配正则表达式^/group/(.*)$的url地址重写为/index.php?param=$1.
如 url为/group/abc123将修改为/index.php?param=abc123.
基于前述正则表达式的介绍,对^/group/(.*)$进行解析:
^/group/表示匹配以/group/开头的url; (.*)是一个捕获组,表示捕获任意字符;整体看来,表示匹配任意以/group/开头的url,且将/group/后面的部分捕获,后续可以使用$1对其进行提取。

再给出一个案例:

rewrite ^/group/(\d{4})/(\d{2})/?$ /index.php?year=$1&month=$2;  

当url地址为/group/2024/03/或者/group/2024/03时,地址重写为/index.php?year=2024&month=03.
对这段表达式进行解析:
^/group/表示匹配以/group/开头的url; (\d{4})和(\d{2})是捕获组,分别捕获4位数字和2位数字;/? 表示/可以匹配0次或者1次,即url是否以/结尾都可以; 整体来看,正则表达式匹配以/group/开头,紧跟4位数字,然后是分隔符,然后紧跟2位数字,可以以/结尾或者不带/. 并且将4位数字\d{4}提取为$1, 将2位数字\d{2}提取为$2.

2.servername优先级

2.1 servername介绍

servername配置在server块中。当客户端向Nginx服务器发送请求时,Nginx会根据请求的Host头字段与server_name进行匹配,以确定将请求转发到哪个server块进行处理。
servername可以使用ip或者域名方式进行,一般配置为域名,如:

server_name localhost;server_name 127.0.0.1;

也可以配置多个域名:

server_name localhost transgpt env124;

2.2 servername配置方式

servername配置方式有以下4种:
[1] 完全匹配

server_name  env124;

[2] 左通配符匹配
以*开头的匹配方式

server_name  *124;

[3] 右通配符匹配
以*结尾的匹配方式

server_name  env*;

[4] 正则表达式匹配

server_name  ~^env\d{3}$;

优先级顺序为:完全匹配>左通配符匹配>右通配符匹配>正则表达式匹配.

3.3 默认匹配

当Nginx收到来自客户端的请求时,会根据端口缩小候选的server块范围,然后根据server_name进行匹配:
[1] 当存在多个匹配server块时,会根据1.2中提到的优先级进行匹配,选择优先级最高的第一个server块处理;
[2] 当仅存在一个匹配的server块时,由该server块处理;
[3] 当没有匹配的server块时,如果有默认块,使用默认块处理;如果没有默认块,则使用候选中的第一个server块。

3.url类型和优先级

location块的语法格式为:

location [ = | ^~ | ~ | ~* || / ] uri { #匹配后的处理逻辑,proxy_pass,root/alias/index等;
}

location关键字和url之间有6种类型的匹配规则, 按优先级排序依次为:
[1] = 完全匹配
请求路径必须与location的url完全匹配(大小写一致、斜线一致)

server {listen  8888;server_name  localhost;location = /test.html {return 200 "--Your are enter [http://localhost:8888/test.html]";}
}

配置为/test.html时,只能以/test.html去请求,如下所示:

[root@host44 conf]# curl http://localhost:8888/test.html
--Your are enter [http://localhost:8888/test.html]--

其他(如下所示场景)则不能匹配:

http://localhost:8888/test.html/
http://localhost:8888/test.htmla
http://localhost:8888/Test.html
http://localhost:8888/

[2] ^~ 前缀匹配

说明:为理解方便,以下介绍匹配规则时,省去域名和端口。

location ~ /test {
}

匹配以/test开头的所有url, 如下所示:

/test
/test/
/test/abc
/testabc

注意:前缀匹配区分大小写。

当有多个前缀匹配满足时,有一个最大字符串匹配规则,即匹配字符串长度大的优先。

[3] ~ 正则表达式匹配, 区分大小写

正则表达式语法可以参考"正则表达式"章节内容。

location ~ ^/query/.*$  {return 200  "query success";
}

此时,正则表达式^/query/.*$表示所有以/query/开头的url.

[4] ~ 正则表达式匹配, 不区分大小写*

与[3]相似,区别在于不区分大小写。

#只能匹配/query/开头的url
location ~ ^/query/.*$  {return 200  "query success";
}#可以匹配/QUerY/开头的url
location ~* ^/query/.*$  {return 200  "query success";
}

[5] 空

与^~类似属于前缀匹配,但优先级低于正则表达式,最大字符串匹配规则仍然适应。

location ~ /test {
}

匹配以/test开头的所有url, 如下所示:

/test
/test/
/test/abc
/testabc

[6] / 通用匹配

匹配所有请求,一般作为默认访问-访问网站首页,放在配置的最后。

location / {root /usr/local/nginx/conf/html/;index index.html;
}

除此之外,还有一种定义方式,使用@开头命名的location。该类型的location块不会参与url匹配, 仅用于nginx内部使用, 如try_files、errorpage, 案例如下所示:

server {server_name localhost;listen 8001;location /query {try_files index.htm index.html @custom_404;}location /set {error_page 404 @index_error;}location @custom_404{return 200 "Custom 404 page not found";}
}

测试结果如下所示:

[root@124 conf]# curl http://localhost:8001/queryxxx
Custom 404 page not found[root@124 conf]# curl http://localhost:8001/setxxx
Custom 404 page not found

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

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

相关文章

Netty HTTPS服务端高并发宕机案例

读李林峰《netty进阶指南》于第18章有感。特此记录一下问题的现象,以及他是如何排障的,以此加深理解 目录标题 事件梳理排查事后分析如何解决总结 事件梳理 某系统内部两个模块之间采用 HTTPS 通信。 某天: 客户端某时间吞吐量为0&#xf…

数据集成的魔法工坊:SQL Server Integration Services使用指南

数据集成的魔法工坊:SQL Server Integration Services使用指南 在当今的数据驱动世界中,数据集成是企业获取洞察力和竞争优势的关键。SQL Server Integration Services(SSIS)是Microsoft提供的一套强大的数据集成工具&#xff0c…

海思arm-hisiv400-linux-gcc 交叉编译rsyslog 记录心得

需要编译rsyslog,参考海思3536平台上rsyslog交叉编译、使用-CSDN博客和rsyslog移植(亲测成功)_rsyslog交叉编译-CSDN博客 首先下载了要用到的一些库的源码,先交叉编译这些库 原来是在centos6上交叉编译的,结果编译时报缺少软件要…

MySQL练习02

题目 步骤 创建数据库 create database mydb8_worker; #创建数据库 use mydb8_worker; #使用数据库 创建表 create table t_worker( department_id int(11) not null comment 部门号, worker_id int(11) primary key not null comment 职工号, worker_date date not …

数据结构 - 栈(精简介绍)

文章目录 普通栈Stack用法Q 最长有效括号 单调栈Q 接雨水 普通栈 栈就是一个先进后出的结构 想象一个容器,往里面一层一层放东西,最早放进去的东西被压在下面(所以放元素也叫压栈),要拿到这个最低层的东西需要先把上面…

【系统架构设计师】十三、软件可靠性(基本概念|软件可靠性建模)

目录 一、基本概念 1.1 定义 1.2 软件可靠性的定量描述 1.3 可靠性测试的意义 1.4 广义的软件可靠性测试和狭义的软件可靠性测试 二、软件可靠性建模 2.1 可靠性模型的组成 2.2 可靠性模型的共同假设 2.3 可靠性模型的重要特性 2.4 可靠性建模方法 往期推荐 历年真…

大型网站核心架构要素

文章目录 1 性能1.1 性能优化1.2 性能度量 2 可用性2.1 可用性指标2.2 可用性目标2.3 可用性方案2.4 可用性度量 3 伸缩性3.1 伸缩性度量3.2 伸缩性方案3.2.1 应用服务器集群3.2.2 缓存服务器集群3.2.3 关系数据库集群3.2.4 NoSQL数据库产品 4 扩展性4.1 扩展性度量4.2 扩展性方…

当Excel处理神器EasyExcel遇上Apache POI:一场关于依赖的趣味‘撞车’冒险

目录 前言 报错 解决思想 解决方案 结尾 前言 🎈🎈🎈"Hey there, 大家好!我是Blue,今天可不是一般的‘代码奇遇记’!我在与EasyExcel这位数据处理界的魔术师共舞时,突然遭遇了前所未…

Linux C++ 066-设计模式之访问者模式

Linux C 066-设计模式之访问者模式 本节关键字:Linux、C、设计模式、访问者模式 相关库函数: 概念 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式&a…

Unity-URP-SSAO记录

勾选After Opacity Unity-URP管线,本来又一个“bug”, 网上查不到很多关于ssao的资料 以为会不会又是一个极度少人用的东西 而且几乎都是要第三方替代 也完全没有SSAO大概的消耗是多少,完全是黑盒(因为用的人少,研究的人少,优…

解决GoLand添加GOROOT提示The selected directory is not a valid home for Go Sdk的问题

现象 解决 在Go安装路径下找到zversion.go文件,我的在D:\Program Files\Go1.21.1\src\runtime\internal\sys下面 打开文件,添加如下内容: const TheVersion go1.21.1保存后再重新添加GOROOT即可

Python莫兰生死抑制放大进化图

🎯要点 🎯种群离散时间莫兰生死动态图解 | 🎯良好混合种群的固定概率 | 🎯数值求解生成埃尔多斯-雷尼图 | 🎯计算马尔可夫链的转移矩阵概率 | 🎯出生死亡动态和死亡出生动态概率无向随机图和有向随机图&am…

深度选择器探秘:/deep/、>>>、::v-deep 与 v-deep() 的区别与用法

在Vue.js项目中&#xff0c;尤其是在使用组件化开发时&#xff0c;我们时常需要修改组件内部的样式&#xff0c;但Vue的样式封装特性&#xff08;如<style scoped>&#xff09;会阻止外部样式直接作用于组件内部。为了应对这一挑战&#xff0c;Vue社区引入了深度选择器&a…

react Jsx基础概念和本质

什么是jsx jsx是JavaScript和XML(HTML)的缩写&#xff0c;表示在js代码中编写HTML模板结构&#xff0c;它是react中编写UI模板的方式 const message this is message function App(){return (<div><h1>this is title</h1>{message}</div>) } jsx优…

现代物理学概论

现代物理学概论 一、量子纠缠 1、量子力学的基础 波粒二象性&#xff1a;比原子还小的粒子&#xff0c;同时具有两种状态。这些粒子不仅像粒子&#xff0c;也像波。 叠加态&#xff1a;波粒二象性就是一种叠加态、还有自旋、偏振、位置和动量等其他物理性质的叠加态&#x…

Mike she中常出现的error及解决办法

前言&#xff1a; 最近用了下MIKE SHE坡面流模块&#xff0c;感觉一场雨降下来和MIKESHE和MIKE21模块算出来还是有不一样的地方&#xff0c;这个先不聊&#xff0c;聊点直接的&#xff0c;到底一个玩个模块遇到了哪些错误&#xff0c;我们来说说解决方法。 Error1&#xff1a;…

嵌入式人工智能(16-基于树莓派4B的电机控制-步进电机28BYJ-48)

1、步进电机 步进电机是一种旋转电机&#xff0c;通过在特定的步进角度内进行转动来实现精确的定位控制。步进电机通常由电磁线圈和磁轴组成&#xff0c;线圈通过电流激励产生磁场&#xff0c;而磁轴则受到线圈所产生的磁场的作用而转动。 步进电机的运动是离散的&#xff0c;…

el-select选择器修改背景颜色

<!--* FilePath: topSearch.vue* Author: 是十九呐* Date: 2024-07-18 09:46:03* LastEditTime: 2024-07-18 10:42:03 --> <template><div class"topSearch-container"><div class"search-item"><div class"item-name&quo…

野兔在线工具箱系统全新升级改版,基于TP8和yetuadmin后台实现

野兔在线工具箱系统全新升级改版&#xff0c;基于TP8和yetuadmin后台实现 系统名称&#xff1a;野兔在线工具系统 系统语言&#xff1a;支持多语言&#xff0c;大概有20种 系统源码&#xff1a;不加密&#xff0c;开源 系统开发&#xff1a;PHPMySQL (基于thinkphp8&#x…

linux内核中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…