首页 > 系统相关 >Nginx系列-3 servername优先级和location优先级和常用正则表达式

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

时间:2024-07-20 22:56:23浏览次数:14  
标签:优先级 url servername server Nginx location test 匹配 group

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

标签:优先级,url,servername,server,Nginx,location,test,匹配,group
From: https://blog.csdn.net/Sheng_Q/article/details/140570442

相关文章

  • NGINX的日常使用之负载均衡
    负载均衡在nginx中的使用文章目录目录负载均衡在nginx中的使用前言一、负载均衡是什么?二、负载均衡的类型和应用1.硬件负载均衡器:2.软件负载均衡器三、负载均衡的好处四、负载均衡在nginx中的使用1、基本的nginx负载均衡配置示例2、Nginx负载均衡的关键特性(1)N......
  • Nginx(详解以及如何使用)
    目录1.什么是Nginx?2.为什么使用nginx?3.安装nginx3.1 安装nginx的依赖插件3.2下载nginx 3.3 创建一个目录作为nginx的安装路径 3.4 解压 3.5 进入解压后的目录3.6 指定nginx的安装路径 3.7 编译和安装nginx3.8启动nginx 3.9 访问nginx 4. ngin......
  • [C++]优先级队列
    1.了解优先级队列优先级队列是一种容器适配器,根据一些严格的弱排序标准,专门设计使其第一个元素始终是它所包含的元素中最大的元素。此上下文类似于堆,其中可以随时插入元素,并且只能检索最大堆元素(优先级队列中顶部的元素)。优先级队列是作为容器适配器实现的,容器适配器是使......
  • nginx学习记录
    目录监听端口nginx缓冲和缓存缓冲优点与作用缓存优点与作用nginx负载均衡权重健康检查监听端口假设代码中,我监听8003端口,意味着我可以通过访问8003端口来获得数据将所有请求进行转发,即访问8003端口,nginx会将“访问8003端口”这一请求,转发到设定的地址这就实现了,访问的是8003......
  • 线程组和线程优先级
    线程组每个Thread必然存在于一个ThreadGroup中,Thread不能独立于ThreadGroup存在。执行main()方法的线程名字是main,如果在newThread时没有显式指定,那么默认将父线程的线程组设置为自己的线程组。publicstaticvoidmain(String[]args){Threadthread=newT......
  • nginx出现499错误码的原因以及proxy_ignore_client_abort配置 及 nginx日志配置变量大
    一、nginx出现499错误码的原因以及proxy_ignore_client_abort配置1. nginx出现499错误码的原因    最近发现服务器上出现很多499的错误,出现499错误的原因是客户端关闭了连接,在我这篇文章:服务端在执行时中途关闭浏览器退出之后php还会继续执行吗?个人实践实验得到结果( h......
  • 用Nginx反向代理之后,swagger出现no response from server错误的解决办法
    问题描述:本地运行项目打开swaager可以用,但是上传到服务器用nginx做反向代理的时候返回"error":"noresponsefromserver",且网址有端口,swaager的请求url端口丢失,使用了默认80端口  问题原因:因为在配置nginx反向代理的时候,没注意到配置代理的端口,导致端口丢失!解决方案:使......
  • Nginx 获取/传递真实IP、追踪请求包转发链 及 防范源IP伪造
    (转载)获取/传递真实IP环境模拟:客户端-->Nginx1/CDN/DDOS高防-->Nginx2-->后端ServerrequestHeader部分请求头字段:X-Real-IP用来保存客户端真实IP,默认为空X-Forwarded-For用来保存请求包的转发地址链,默认为空对应变量:$remote_addr此变量保存的是http请求的发起方IP,......
  • njs最详细的入门手册:Nginx JavaScript Engine
    原文链接:https://hi.imzlh.top/2024/07/08.cgi关于njs首先,njs似乎在国内外都不受关注,资料什么的只有官网参考手册,出了个问题只能看到GithubIssue所以,这篇文章将我的探索过程展示给大家,njs对于可用存储空间较小的设备真的很友好,相比较于NodeJS、Deno这种80M起步的运行环境真的......
  • LDAP应用篇(3)Nginx接入
    实验环境:OracleLinuxR8在搞Nginx比较错愕的是,居然Nginx并未内置对LDAP的支持,需要单独编译。然而yum安装的nginx并不支持导入模块,不得不再次温习一下编译安装Nginx的路数了。下载组件从github中下载组件的源代码:cd~&&gitclonehttps://github.com/kvspb/nginx-......