nginx location正则表达式+案例解析

1、nginx常用的正则表达式

  • ^ :匹配输入字符串的起始位置
  • $ :匹配输入字符串的结束位置
  • *:匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
  • + :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
  • ? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
  • . :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
  • \ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$”
  • \d :匹配纯数字[0-9] \s :空白符 \w :任意单词字符包括下划线[A-Za-z0-9_]
  • {n} :重复 n 次
  • {n,} :重复 n 次或更多次
  • {n,m} :重复 n 到 m 次
  • [] :定义匹配的字符范围
  • [c] :匹配单个字符 c
  • [a-z] :匹配 a-z 小写字母的任意一个
  • [a-zA-Z0-9] :匹配所有大小写字母或数字
  • () :表达式的开始和结束位置
  • | :或运算符

2、location

1、location匹配的分类:

1)、精准匹配:location = /test {…}
*完整的路径(必须有test ),一个字都不能少,也不能错
2)、一般匹配:location / {…}
*location = / {…}–所有
*location = /test {…}–包含test
3)、正则匹配:location ~ / {…}
*location ^~:前缀匹配,以什么为开头
*location ~:区分大小写进行匹配
*location ~:不区分大小写
*location !~:区分大小写,取反匹配
*location !~
:不区分大小写,取反匹配

location 常用的匹配规则

  • = :进行普通字符精确匹配,也就是完全匹配。
  • ^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 正则匹配location。
  • ~ :区分大小写的匹配。
  • ~* :不区分大小写的匹配。
  • !~ :区分大小写的匹配取非。
  • !~* :不区分大小写的匹配取非。

location匹配一旦匹配成功不再向下继续匹配

优先级:
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 *
然后匹配不带任何修饰符的一般前缀匹配
最后是交给 / 通用匹配

精确匹配——正则匹配——一般匹配

完整的优先级:面试题

(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location /部分前缀路径) > (location /)

首先看 优先级:精确= > 前缀^~ > 正则,* > 一般 > 通用/

在没有精确匹配的时候,先看所有前缀的长度,取最长匹配的location;
如果最长的前缀匹配是带有~~的,则匹配,直接使用^~的location匹配用户的访问路径并跳转页面;如果最长的前缀匹配是不带^~的,则会继续看其它的正则匹配
前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序,根据配置文件的配置由上往下依次匹配,匹配到即停止

2、案例

案例1
1)location = / {}

  • =为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
    再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

2)location / {}

  • 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
    但后面前缀路径会和最长字符串优先匹配(最长匹配)

3)location /documents/ {}

  • 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
    只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

4)location /documents/abc {}

  • 匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
    只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

5)location ^~ /images/ {}

  • 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

6)location ~* .(gif|jpg|jpeg)$ {}
**重要**

  • 匹配所有以 gif、jpg或jpeg 结尾的请求
    然而,所有请求 /images/ (资源文件路径,项目打包后index.html文件内查看 关联路径,可修改React:修改package.json 文件内的homepage:可更改路径))下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

7)location /images/abc {}

  • 最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

8)location ~ /images/abc {}

  • 匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

9)location /images/abc/1.html {}

  • 匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

案例2,有如下匹配规则:

location = / {  #规则A  (访问网站根目录才会走这比如http://localhost/)  =开头表示精确匹配
}  
location = /login {  #规则B(http://localhost/login)  
}  
location ^~ /static/ {  #规则C (http://localhost/static/a.html) ^~开头表示以常规字符串开头的url路径
}  
location ~ \.(gif|jpg|png|js|css)$ {  #规则D (访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C) ~开头表示区分大小写的匹配
}  
location ~* \.png$ {  #规则E (访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写) ~*开头表示不区分大小写的正则匹配
}  
location !~ \.xhtml$ {  #规则F   !~开头表示区分大小写的不匹配
}  
location !~* \.xhtml$ {  #规则G  !~*开头表示不区分大小写的不匹配
}  
location / {  #规则H (http://localhost/register) 
}  

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

那么产生的效果如下:

访问根目录/, 比如http://localhost/ 将匹配规则A

访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C

访问http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

访问http://localhost/category/id/1111则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

所以实际使用中,通常至少有三个匹配规则定义,如下:


#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。  
#这里是直接转发给后端应用服务器了,也可以是一个静态首页  
# 第一个必选规则  
location = / {  proxy_pass http://tomcat:8080/index  
}  # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项  
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用  
location ^~ /static/ {  root /webroot/static/;  
}  
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {  root /webroot/res/;  
}  #第三个规则就是通用规则,用来转发动态请求到后端应用服务器  
#非静态文件请求就默认是动态请求,自己根据实际把握  
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了  
location / {  proxy_pass http://tomcat:8080/  

3、(nginx的重定向) ReWrite语法

案例文件的最下面

案例1
案例2
案例3

重要

1、项目地址匹配了(资源文件需要查看,能否匹配)
方法:
对应不同的应用–(nginx:一个端口对应不同应用判断
location ^~ /images/ {}
location ~* .(gif|jpg|jpeg)$ {}

  • 匹配所有以 gif、jpg或jpeg 结尾的请求
    然而,所有请求 /images/ (资源文件路径,项目打包后index.html文件内查看 关联路径,可修改React:修改package.json 文件内的homepage:可更改路径))下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

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

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

相关文章

Ubuntu server 24.04 (Linux) 搭建DNS服务器 通过Nginx实现UDP/TCP负载均衡 轻量级dnsmasq服务器

一 系统运行环境 testtest:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubuntu ID_LIKEdebian HOME_URL"https://www.…

全域外卖项目能不能做?可行性分析来了!

作为新的网络热词,全域外卖的传播范围随着时间的推移而不断扩大,从最初的行业内部逐步扩散到多个创业者社区,让许多创业者都有了做全域外卖项目的想法。但是,由于全域外卖赛道刚兴起不久,因此,目前大多数人…

硬件高效的线性注意力机制Gated Linear Attention论文阅读

0x0. 前言 上篇文章 flash-linear-attention中的Chunkwise并行算法的理解 根据GLA Transformer Paper(https://arxiv.org/pdf/2312.06635 作者是这位大佬 sonta)通过对Linear Attention的完全并行和RNN以及Chunkwise形式的介绍理解了Linear Attention的…

Chrome浏览器打开无痕模式的方法

快捷键:同时按住CtrlshiftN 如图,系统会新开一个无痕标签页,不需要了点右上角关闭就可以了。

Linux系统TCP连接性能

一、测试环境 debian11 64bit 设置系统网络限制 sudo vi /etc/sysctl.conffs.file-max10485760net.ipv4.ip_local_port_range1024 65535#net.ipv4.tcp_tw_recycle1net.ipv4.tcp_tw_reuse1net.ipv4.tcp_timestamps1net.core.rmem_default209715200net.core.wmem_default2097152…

Linux用户和用户组的操作

用户管理 以Tom做为用户名 以dev做为用户组 增加用户 sudo adduser Tom #不建议使用useradd/userdel系列的命令删除用户 sudo deluser Tom --remove-home # 删除Tom用户及home目录 重置密码 sudo passwd Tom加入用户组 sudo usermod -a -G dev Tom # sudo usermod -aG …

STM32自己从零开始实操04:显示电路原理图

一、TFT-LCD 屏接口 1.1指路 以下是该部分的设计出来后的实物图,我觉得看到实物图可能更方便理解这部分的设计。 图1 实物图 这部分设计的是一个屏幕的接口,很简单。使用的屏幕是:2.8inch 16BIT Module MRB2801。 1.2数据手册 &#xff0…

Python汉化安装全攻略:深度解析与实战挑战

Python汉化安装全攻略:深度解析与实战挑战 在编程的世界里,Python以其简洁易懂的语法和强大的功能库赢得了众多开发者的青睐。然而,对于非英语母语的初学者来说,语言障碍可能成为一个不小的挑战。因此,Python的汉化安…

uinty游戏界面模糊的解决方法

1.把低分辨率关掉 2.调缩放,不要调长宽高 3.调整画布的分辨率 4.调整图片的像素点

如何恢复永久删除的照片?

“嗨,我永久删除了电脑上的很多照片。回收站被清空,照片会永久丢失吗?有什么方法可以恢复这些已删除的照片吗? 我们所有人都经历过同样的事情:我们的硬盘上存储了文件、视频或照片,但不小心删除了它。这个…

短信API接口相比邮件API接口的优缺点对比?

API接口怎么做开发集成?如何保障API接口的安全性? 短信API接口和邮件API接口作为两种主要的通信方式,各有其独特的优缺点。接下来,Aok将对这两种接口进行详细的对比分析,并特别提及AokSend邮件API的优点。 短信API接…

css实现不同设备适配

CSS可以通过媒体查询(Media Queries)来实现不同设备的适配。媒体查询可以根据设备的特性,如屏幕尺寸、分辨率等,来应用不同的样式规则。 以下是一些常见的方法来实现不同设备的适配: 1. **使用媒体查询** - 通过在CSS中…

最大堆,最小堆,优先队列,堆排序 LC例题-找第K大元素

LC215 数组中的第K个最大元素 class Solution {static Comparator<Integer> cmp new Comparator<Integer>(){Overridepublic int compare(Integer i1, Integer i2){return i1 - i2;//升序排列// return i2 - i1&#xff1b;//降序}}; public static int findKthL…

湖南(品牌定位)源点咨询 企业如何选择品牌定位差异化调研

湖南源点认为&#xff1a;精准且占据消费者认知&#xff0c;探寻与消费者共鸣的常态化品牌定位调研是企业品牌长远健康发展的基石。 品牌定位里要强调品牌的差异。英文是point of difference. 这个差异点就是强调品牌能带来的利益&#xff08;benefit&#xff09;。 这个“利…

【NoSQL数据库】Redis命令、持久化、主从复制

Redis命令、持久化、主从复制 redis配置 Redis命令、持久化、主从复制Redis数据类型redis数据库常用命令redis多数据库常用命令1、多数据库间切换2、多数据库间移动数据3、清除数据库内数据 key命令1、keys 命令2、判断键值是否存在exists3、删除当前数据库的指定key del4、获取…

记录layui-table中操作列的宽度随着权限变化而变化

最近做一个项目&#xff0c;某个页面因为角色不同&#xff0c;所以显示的的按钮有所不同。 管理员权限 普通人员权限 layui引入的table宽度是写死的&#xff0c;不能随着自动变化&#xff0c;查了一些资料&#xff0c;让写入css的方法 .layui-table th, .layui-table td { whi…

[MYSQL]销售分析III

表&#xff1a; Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是该表的主键&#xff08;具有唯一值的列&am…

【JavaScript脚本宇宙】深入JavaScript文件上传库: 功能与应用一网打尽

模块化轻量级的文件上传&#xff1a;未来的趋势 前言 在这个时代&#xff0c;我们的生活和工作都离不开文件上传。为了解决文件上传问题&#xff0c;许多优秀的JavaScript库被创造出来。本文将详细介绍六个不同的JavaScript文件上传库&#xff0c;包括它们的概述、主要特性、…

LabVIEW的大气环境实时监测

LabVIEW的大气环境实时监测 设计并实现了一个基于LabVIEW的大气环境实时监测系统。通过使用高精度环境传感器采集温度、湿度、PM2.5、CO2等环境数据&#xff0c;利用LabVIEW进行数据处理、显示和存储。该系统能够实时监控环境参数&#xff0c;并通过阈值报警功能提示异常&…

Linux中,ll 命令 列出目录的内容

文章目录 1、2、3、4、5、 1、 在Linux中&#xff0c;ll 通常是一个别名&#xff08;alias&#xff09;用于 ls -l 命令。ls 命令用于列出目录的内容&#xff0c;而 -l 选项会以长格式&#xff08;long format&#xff09;显示信息&#xff0c;包括文件或目录的权限、所有者、…