文章转载自:https://blog.csdn.net/wzj_110/article/details/110142902

正则表达式在线测试工具:https://tool.lu/regex

location中的正则表达式

location的作用

location指令的作用是根据'用户请求的URI'来执行'不同的应用',也就是根据用户请求的网站URL'进行匹配',匹配'成功-->success'即进行'相关的操作'

针对 URL 中'不同的路径'分别可以配置'不同的处理路径'

location的语法

location [=|~|~*|^~] /uri/ {
......
}

location的正则

~      区分大小写'大小写敏感'匹配成功
~* '不区分大小'写匹配成功
!~ 区分大小写匹配'失败-->!(取反)'
!~* 不区分大小写匹配失败
^ 以'什么开头'的匹配
$ 以'什么结尾的匹配'
* 代表'任意字符'
=    '精准匹配'-->如location=/,只会匹配url为/的请求
/    '通用匹配',如果没有其它匹配,任何请求都会被匹配到 ++++++++++++++++++++++'分割线'++++++++++++++++++++++ ^~   标识符匹配后面跟'一个字符串',匹配字符串后将'停止-->stop'对后续的正则表达式进行匹配,如'location ^~ /images/',在匹配了/images/这个字符串后就'停止'对后续的正则匹配 备注: '~'开头的都是'正则匹配',例如'^~'不是正则匹配

案例讲解

    (1) location = /

    特点: 匹配'任何查询',因为所有请求'都以 / 开头'

    (2) location ^~ /images/ {

    特点: 匹配任何以'/images/'开头的任何查询并且停止搜索,任何正则表达式将不会被测试。

    (3) location ~* .(gif|jpg|jpeg)$ {

    特点: 匹配任何以'.gif、.jpg 或 .jpeg 结尾'的请求

转义

~^ /prefix/.*\.html$ 

解释:~ 表示后面跟的是'正则',而且是区分大小写的( "~ "区分大小写,"~* "不区分大小写)

^/prefix/.*\.html$  就是'正则表达式了'

1) ^在正则里表示,以什么'开始'

2) /prefix/ 表示符合这个'文件夹路径的'

3) ".*" 表示匹配'单个字符多次'

4) "\." 表示转义 "."  采用 "." 本身,而非他在'正则里'的意思(非\r\n的单个字符)。

5) $ 表示以什么'结尾'

细节测试

三个规则

root和alias的区别

root与alias'主要区别': 在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上

root的处理结果是:  root路径'+'location路径

alias的处理结果是: 使用alias路径'替换'location路径 --> 特点:'浏览器请求的url路径在后端不一定是真实存在'

alias是一个'目录别名的定义',root则是'最上层目录'的定义

还有一个'重要的区别'是alias后面必须要用'/'结束,否则会'404-->找不到文件'的
    (1) 测试1-->请求以'/hello'开头

    location /hello {
alias '/usr/share/nginx/html/ceshi'; -->'alias就是目录别名,所以alias后面加"/"与否没有意义'
} '请求': http://nginx.wzj.com/hello/404.html '实际访问': /usr/share/nginx/html/ceshi/404.html +++++++'分割线'+++++++ (2) 测试2 location /ceshi1 { root '/usr/share/nginx/html';
} '请求': http://nginx.wzj.com/ceshi1/ '实际访问': /usr/share/nginx/html/ceshi1/index.html

补充

注意事项:

(1) 使用正则那么 location '定义的顺序'很重要,第一个匹配的正则,之后就立即执行了

(2) 使用精确匹配可以'提高查询速度',比如经常请求的路径可以精确匹配 =

++++++++++++++'分割线'+++++++++++++++

思考: 一个具体的请求 path 过来之后,Nginx 的'具体匹配过程'可以分为这么几步:

1) 检查'前缀字符-->前缀匹配'定义的 location,记录'最长'的匹配项-->'record'

2) 如果找到了'精确匹配 = '的 location,结束查找'只用该配置'

3) 按'顺序查找正则'定义的 location,如果匹配则停止查找

4) 如果'没有匹配的正则',则使用之前'记录的最长'匹配 location

location中的url

测试

nginx配置proxy_pass中url末尾带/与不带/的区别

在使用proxy_pass指令时,如果'不想改变原地址'中的URI,就'不要在'URL变量中'配置URI'

(1)配置proxy_pass时,当在'后面的url加上了/',相当于是'绝对根路径',则nginx'不会'把location中匹配的路径部分'代理走';如果没有/,则会把'匹配的路径'部分也给'代理'走

(2)proxy_pass配置中'url末尾带/'时,nginx转发时,会将'原uri去除'location'匹配'表达式后的内容'拼接'在proxy_pass中url之后
### 末尾带/ 

测试地址:http://192.168.171.129/test/tes.jsp

'场景一':
location ^~ /test/ {
proxy_pass http://192.168.171.129:8080/server/;
}
代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp -->'test由于匹配,所以会去除,然后拼接未匹配的' '场景二':
location ^~ /test {
proxy_pass http://192.168.171.129:8080/server/;
}
代理后实际访问地址:http://192.168.171.129:8080/server//tes.jsp '场景三':
location ^~ /test/ {
proxy_pass http://192.168.171.129:8080/;
}
代理后实际访问地址:http://192.168.171.129:8080/tes.jsp '场景四':
location ^~ /test {
proxy_pass http://192.168.171.129:8080/;
}
代理后实际访问地址:http://192.168.171.129:8080//tes.jsp
### 末尾不带/

proxy_pass配置中'url末尾不带/时',如url中'不包含path',则直接将'原uri拼接'在proxy_pass中url之后;如url中'包含path',则将原uri'去除location匹配表达式后的内容'拼接在proxy_pass中的url之后

 测试地址:http://192.168.171.129/test/tes.jsp
'场景一':
location ^~ /test/{
proxy_pass http://192.168.171.129:8080/server;
}
代理后实际访问地址:http://192.168.171.129:8080/'servertes.jsp' -->'去除"/test/",然后拼接'
'场景二':
location ^~ /test {
proxy_pass http://192.168.171.129:8080/server;
}
代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp -->'去除"/test",然后拼接"/tes.jsp"-->场景一和场景二的区别' '场景三':
location ^~ /test/ {
proxy_pass http://192.168.171.129:8080;
}
代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp -->'场景三和场景四常用' '场景四':
location ^~ /test {
proxy_pass http://192.168.171.129:8080;
}
代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp

小结

    (1) location的配置有两种形式,'前缀字符'和'正则',查找匹配的时候,'先'查找'前缀'字符,选择'最长'匹配项,'再查找'正则,正则的优先级高于'前缀字符-->普通匹配'

    (2) 正则的查找是按照在'配置文件中的顺序'进行的,因此正则的顺序很重要,建议'越精细'的放的'越靠前'

    (3) 使用=精准匹配可以加快查找的顺序,如果根域名经常被访问的话建议使用=

nginx中 location正则的理解的更多相关文章

  1. nginx 中location和root

    nginx 中location和root,你确定真的明白他们关系? 2016-01-17 14:48 3774人阅读 评论(1) 收藏 举报  分类: linux(17)  版权声明:本文为博主原创文 ...

  2. Nginx 中 location 的匹配顺序

    nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ...

  3. nginx中location匹配顺序

    一.location语法 语法: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: - ...

  4. 对nginx中location的认识

    关于一些对location认识的误区 1.location的匹配顺序是“先匹配正则,在匹配普通”. location的匹配顺序其实是“先匹配普通,在匹配正则”.造成误解的原因是:正则匹配会覆盖普通匹配 ...

  5. nginx中location、rewrite用法总结

    一.location用法总结 location可以把不同方式的请求,定位到不同的处理方式上. 1.location的用法 location ~* /js/.*/\.js 以 = 开头,表示精确匹配:如 ...

  6. nginx中location的顺序(优先级)及rewrite规则写法

    一.location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所 ...

  7. 测试Nginx中location的优先级!(重点)

    location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ~ 开头表示区分大小写的正则匹配 ~* 开头表示不区分大小写的正则匹配 ^~ 开头表示uri以某个常规字符串开头 ...

  8. nginx中location详解

    Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...

  9. Nginx中location匹配及rewrite重写

    目录 一.常用的Nginx正则表达式 二.location 2.1.location三类匹配类型 2.2.常用的匹配规则 2.3.location优先级 2.3.1.举例说明 2.4.实际网站使用中, ...

随机推荐

  1. Spring 核心概念

    Spring 核心概念 引言 本文主要介绍 Spring 源码中使用到的一些核心类 1. BeanDefinition BeanDefinition表示Bean定义,BeanDefinition 中存 ...

  2. 谷歌的SRE和开发是如何合作的

    本文是一篇比较有价值的.介绍SRE的文章.国内的所谓SRE职责其实并不明确,大部分其实还是干普通运维的事.但文中介绍的谷歌的运作方式起点还是相对比较高的,无论对SRE.对开发,甚至对公司都有很高的要求 ...

  3. Flink Window&Time 原理

    Flink 中可以使用一套 API 完成对有界数据集以及无界数据的统一处理,而无界数据集的处理一般会伴随着对某些固定时间间隔的数据聚合处理.比如:每五分钟统计一次系统活跃用户.每十秒更新热搜榜单等等 ...

  4. Rust 从入门到精通03-helloworld

    安装完成 Rust 之后,我们可以编写 Rust 的 Hello Word.这里介绍两种方式,一种是rust原生方式,一种是利用 cargo 工具(重要) 1.rustc 方式 1.1 创建项目目录 ...

  5. ABP vNext系列文章03---依赖注入

    一.依赖注入的类型注册 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的 ...

  6. 在Mac上利用压测工具Jmeter-Suite进行一次压测实践的保姆级详细步骤(参考腾讯云文章)

    参考的文章 压测工具Jmeter-Suite详细操作步骤 写此文的目的 由于我是刚开始接触kubernetes和jmeter,所以在学习过程中遇到了很多很多问题,同时我很烦恼为什么网上没有文章是从真正 ...

  7. Iterator与Generator

    Iterator Iterator 概念 Iterator 提供了一种统一的接口机制,为各种不同数据结构提供统一的访问机制.定义 Iterator 就是提供一个具有 next() 方法的对象,每次调用 ...

  8. 聊天机器人框架Rasa资源整理

      Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性.参考文献收集了一些Rasa相关的开源项目和优质文章. 一.Rasa介绍 1.R ...

  9. [HNOI2011]卡农 (数论计数,DP)

    题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...

  10. QQ高级功能

    本篇文章为微信公众号:酿俗 教学内容请跟着小编一起探索吧! 第一步解锁微信豆影藏内容 随后下载需要的材料,注意!手机可能会提示有病毒!这里使用这些功能报病毒很正常 其实并没有病毒只是手机厂商的安全系统 ...