nginx location 知识知多少
写在之前 众所周知 nginx location 路由转发规则多种多样,尤其是 [ = | ~ | ~* | ^~ ] 这些前缀是什么意思、root 与 alias 是否可以区分开,nginx 作为反向代理服务器时,location 中proxy_pass 中配置的上游服务,服务器后面是否带/与不带/是否有区别,带URI与不带URI是否有区别等,本文从实践的角度进行分析总结。 location 中 URI 前缀实践 匹配语法 nginx 的 uri 匹配模式很强大、并且使用也非常灵活,下面就是nginx的location 相关的所有语法;
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
是的,语法就这一点,是不是感觉很简单呢?
location [指令模式] uri {
...
}
指令模式说明 指令模式有[ = | ~ | ~* | ^~ ], 根据不同的指令模式可分为: 精确匹配:= uri { ... } 前缀匹配:^~ uri { ... } 正则匹配:~ uri { ... } 和 ~* uri { ... } 正常匹配:uri { ... } 全匹配:/ { ... } 指令模式匹配顺序 精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配 实验说明 测试时,最好不要使用浏览器,因为浏览器有缓存,如果要使用请先清除缓存,或者使用curl或者Postman工具等。 精确匹配
# 第1段
location /k8svip/ {
root /data/nginx/html4/;
index index.html;
} # 第2段
location = /k8svip/ {
root /data/nginx/html3/;
index index.html;
}
浏览器访问:http://127.0.0.1/k8svip/ 根据上面的匹配顺序,这里应该显示什么呢?大家都会认为是第2段代码中的 = /jdb/ 你可以实验下,不是的,是第1段,为什么? 精确匹配中 '/k8svip/'中优先匹配到第2段,再访问'/k8svip/index.html',此次内部跳转uri已经是'/k8svip/index.html',而非 =的;最终访问结果是第1段中的index.html。
# 第3段
location /k8svip/ {
rewrite ^/k8svip/$ https://www.baidu.com/ break;
} # 第4段
location = /k8svip/ {
rewrite ^/k8svip/$ https://www.sina.com.cn/ break;
}
浏览器访问:http://127.0.0.1/k8svip/ 看下效果,是不是匹配到第4段了呢?答案:是的;访问http://127.0.0.1/k8sVIP/ ,http://127.0.0.1/k8svip/abc 再看下效果,答案:都无法正常访问。这里可结合之前的一篇:看了这篇!再不会 Nginx rewrite 算我输! 结论:精确匹配区分大小写,不能使用正则,访问的URI必须完全与=后面的一致,多一个"/"或者少一个"/",都是不可以的 前缀匹配
location ^~ /k8svip/ {
rewrite ^ https://www.163.com break;
} location ^~ /k8svip/bcd/ {
rewrite ^ https://www.qq.com break;
} location ^~ /Abc/ {
rewrite ^ https://www.sina.com.cn break;
}
访问:http://127.0.0.1/k8svip/ 成功,跳转到163首页; 访问:http://127.0.0.1/k8svip/abcd/成功,只匹配前缀,跳转到163首页; 访问:http://127.0.0.1/K8svip/ 不成功,区分大小写,出错; 访问:http://127.0.0.1/k8sVip/123 不成功,区分大小写,出错; 访问:http://127.0.0.1/Abc/ 成功,区分大小写,跳转到新浪首页; 访问:http://127.0.0.1/Abc/abc 成功,只匹配前缀,跳转到新浪首页; 结论:前缀匹配不能使用正则,区分大小写,只要前缀相同,都可以匹配成功,不管后面有没有字符,保证前缀相同即可。 正则匹配
location ~ /[a-z]k8svip/ {
rewrite ^ https://www.sina.com.cn break;
} location ~* /[a-z]k8svip/ {
rewrite ^ https://www.google.com break;
}
访问:http://127.0.0.1/ak8svip/ 成功,正则匹配,会跳转到新浪首页; 访问:http://127.0.0.1/ak8svip/bbb 成功,正则+前缀匹配,会跳转到新浪首页; 访问:http://127.0.0.1/zk8svip/ 成功,会跳转到新浪首页; 访问:http://127.0.0.1/Ak8svip/aaa 成功,这个会跳转到google.com首页; 结论:正则匹配 ~ 区分大小写,~* 不区分大小写, 并且与前缀匹配比较类似,只需要匹配模式开头部分,这两种同时存在时,优先匹配区分大小写的。 正常匹配(指令模式为空的匹配规则叫正常匹配)
# 第1段
location /k8svip/ {
rewrite ^ https://www.google.com break;
} # 第2段
location /[0-9]k8svip/ {
rewrite ^ https://www.qq.com break;
}
访问:http://127.0.0.1/k8svip/ 成功,跳转google首页; 访问:http://127.0.0.1/k8svip/2 成功,类似前缀匹配,跳转google首页; 访问:http://127.0.0.1/k8sVIP/ 不成功,区分大小写,出错; 访问:http://127.0.0.1/0k8svip/ 不成功,不支持正则; 结论:有些文档中说正常匹配支持正则,不区分大小写,个人测试了下,不支持正则,但在uri后面继续跟字符,区分大小写(相信实验结果
nginx location 知识知多少的更多相关文章
- Nginx location 匹配顺序整理
Nginx location模块整理 具体的Nginx安装就不在这里描述了,这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /etc/redhat-release [r ...
- Nginx Location配置总结
Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...
- nginx location配置
nginx location配置 location在nginx中起着重要作用,对nginx接收到的请求字符串进行处理,如地址定向.数据缓存.应答控制.代理转发等location语法location ...
- nginx location的配置
文章转自:http://www.ttlsa.com/nginx/nginx-location-configure/ location的语法配置规则: 语法规则: location [=|~|~*|^~ ...
- nginx location配置(URL)
语法规则: location [=|~|~*|^~] /uri/ { … }= 表示精确匹配,这个优先级也是最高的^~ 表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url ...
- Nginx location配置详细解释
nginx location配置详细解释 语法规则: location [=|~|~*|^~] /uri/ { - } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 ur ...
- nginx location匹配顺序及CI框架的nginx配置
Nginx location匹配顺序如下: 用前缀字符串定义的location规则对URI进行匹配测试. =号定义了精确的前缀字符串匹配,如果发现精确匹配则使用当前规则.否则继续下一步匹配. 匹配其它 ...
- nginx Location 语法基础知识
URL地址匹配是Nginx配置中最灵活的部分 Location 支持正则表达式匹配,也支持条件匹配,用户可以通过location指令实现Nginx对动丶静态网页的过滤处理. Nginx locatio ...
- nginx location 正则匹配
nginx 统计语句1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l2.统计访问URL统计PV awk '{print $7 ...
随机推荐
- Java实现 LeetCode 472 连接词
472. 连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat& ...
- Java实现 蓝桥杯VIP 算法训练 麦森数
算法训练 麦森数 时间限制:1.0s 内存限制:256.0MB 问题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底, ...
- Java实现 洛谷 P1508 Likecloud-吃、吃、吃
import java.util.Arrays; import java.util.Scanner; public class Main { static int n, m; static int[] ...
- java实现风险度量
X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网. 两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如果能找到一个站 ...
- java实现第六届蓝桥杯切开字符串
切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两段都必 ...
- 彻底搞懂 etcd 系列文章(一):初识 etcd
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- Hbase的基本架构以及对应的读写流程
一.HBase简介 1,定义: HBase 是一种分布式.可扩展.支持海量数据存储的 NoSQL 数据库. 2,HBase的架构图: 架构角色: 1)Master Master是所有Region Se ...
- 超强教程!在树莓派上构建多节点K8S集群!
在很长一段时间里,我对于在树莓派上搭建Kubernetes集群极为感兴趣.在网络上找到一些教程并且跟着实操,我已经能够将Kubernetes安装在树莓派上,并在三个Pi集群中工作.然而,在master ...
- MYSQL SQL 语句修改字段默认值
alter table tablename alter column drop default; (若本身存在默认值,则先删除) alter table tablename alter column ...
- 数值格式化 NumberFormat、 DecimalFormat、 RoundingMode
NumberFormat [简介] java.text.NumberFormat extends java.text.Format extends java.lang.Object 实现的接口:Ser ...