nginx中 location正则的理解
文章转载自: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正则的理解的更多相关文章
- nginx 中location和root
nginx 中location和root,你确定真的明白他们关系? 2016-01-17 14:48 3774人阅读 评论(1) 收藏 举报 分类: linux(17) 版权声明:本文为博主原创文 ...
- Nginx 中 location 的匹配顺序
nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ...
- nginx中location匹配顺序
一.location语法 语法: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: - ...
- 对nginx中location的认识
关于一些对location认识的误区 1.location的匹配顺序是“先匹配正则,在匹配普通”. location的匹配顺序其实是“先匹配普通,在匹配正则”.造成误解的原因是:正则匹配会覆盖普通匹配 ...
- nginx中location、rewrite用法总结
一.location用法总结 location可以把不同方式的请求,定位到不同的处理方式上. 1.location的用法 location ~* /js/.*/\.js 以 = 开头,表示精确匹配:如 ...
- nginx中location的顺序(优先级)及rewrite规则写法
一.location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所 ...
- 测试Nginx中location的优先级!(重点)
location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ~ 开头表示区分大小写的正则匹配 ~* 开头表示不区分大小写的正则匹配 ^~ 开头表示uri以某个常规字符串开头 ...
- nginx中location详解
Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...
- Nginx中location匹配及rewrite重写
目录 一.常用的Nginx正则表达式 二.location 2.1.location三类匹配类型 2.2.常用的匹配规则 2.3.location优先级 2.3.1.举例说明 2.4.实际网站使用中, ...
随机推荐
- 一文聊透 Netty IO 事件的编排利器 pipeline | 详解所有 IO 事件的触发时机以及传播路径
欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 1. 前文回顾 在前边的系列文章中,笔者为大家详细剖析了 Re ...
- python sock5代理
安装 pysocks:pip install pysocks # coding:utf-8 ''' @version: python3.6 @author: 'eric' @license: Apac ...
- NOI-Online一日游(小炒肉心态爆炸记)
提高组 早上起来赶来机房,逃掉数竟,耶!(光凯:?? T1 It takes me a long time想T1 努力了一个小时的成果 成功码出暴力代码,时间复杂度\(O(n^2)\) 㵘到15分 刑 ...
- 五分钟给你的 gRPC服务 加上 HTTP 接口
gRPC 服务要加 HTTP 接口? go-zero 给大家带来极简的 RESTful 和 gRPC 服务开发体验的同时,社区又给我们提出了新的期望: 我想只写一次代码 既要 gRPC 接口 也要 H ...
- mybatis-plus时间字段自动填充
时间代码自动填充的2种方式 数据库方式 将数据库字段create_time和update_time设置CURRENT_TIMESTAMP,create_time字段后面不需要勾选更新,update_t ...
- ROS机械臂 Movelt 学习笔记3 | kinect360相机(v1)相关配置
目标是做一个机械臂视觉抓取的demo,在基地里翻箱倒柜,没有找到学长所说的 d435,倒是找到了一个老古董 kinect 360. 前几天就已经在旧电脑上配置好了,现在记录在新电脑上的配置过程. 1. ...
- 发布自己的npm组件库
发布自己的npm组件库 前期准备 **git上建立自己的仓库,这样子是为了在本地初始化时,可以直接生成对应的 package.json ** 克隆仓库 创建仓库成功后,gitbush本地,执行 git ...
- 《ABP Framework 极速开发》教程首发
写在发布之前 有没有小伙伴跟我刚开始接触 ABP Framework 的感觉一样"一看文档深似海",看完文档之后,想要上手却找不着头绪. 本套教程写作的目的之一是为初学者提供一条相 ...
- 用JavaScript写输入框的校验
//Script function cheack(){ var kong = ''//获取值不能放外面,不然一直为空 kong = document.getElementById('name').va ...
- 一文带你掌握Spring Web异常处理方式
一.前言 大家好,我是 去哪里吃鱼 ,也叫小张. 最近从单位离职了,离开了五年多来朝朝夕夕皆灯火辉煌的某网,激情也好悲凉也罢,觥筹场上屡屡物是人非,调转过事业部以为能换种情绪,岂料和下了周五的班的前同 ...