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实现) 有重复元素排列问题
有重复元素的排列问题 [问题描述] 设R={ r1, r2 , -, rn}是要进行排列的n个元素.其中元素r1, r2 , -, rn可能相同.试设计一个算法,列出R的所有不同排列. [编程任务] ...
- Java实现 蓝桥杯VIP 算法提高 栅格打印问题
算法提高 栅格打印问题 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入两个整数,作为栅格的高度和宽度,然后用"+"."-"和&quo ...
- Java GUI 窗体事件
import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; publi ...
- System.PlatformNotSupportedException:“Operation is not supported on this platform.”
vs2019创建.net core3.1 的控制台应用程序 执行以下代码: using System; using System.Diagnostics; using System.Threading ...
- 6.keras-基于CNN网络的Mnist数据集分类
keras-基于CNN网络的Mnist数据集分类 1.数据的载入和预处理 import numpy as np from keras.datasets import mnist from keras. ...
- 对SSH框架的理解
首先是对struts的理解.struts是把servlet.jsp以及众多标签库整合在一起的开源web框架,他实现了mvc设计模式.Struts实际上就是对MVC的各部件提供了现成的实现组件.Stru ...
- protobuf安装流程
protobuf安装流程 环境 平台 Ubuntu16.04 依赖 autoconf automake libtool curl make g++ 安装流程 在Ubuntu / Debian上,您 ...
- vuex登录验证及保持登录状态
不知道vuex的可以先看一下 vuex官方文档,这里就不赘述了. 实现思路:假设我们现在想要访问自己在博客园里写的博客,这时候服务器需要知道当前用户是谁,才能确定我们是否有访问权限并正确地返回我们需要 ...
- CenterOS7 修改 SSH 端口
首先修改 /etc/ssh/sshd_config 文件中的 Port.修改前一定要备份 可以同时启用多个Port所以最好先追加一个端口,新端口校验没问题之后再把原端口删除 防火墙设置 # 永久开放端 ...
- easypoi 读取 Excel 简单应用
背景 在做接口测试的时候,经常会使用 Excel 来存储对应的接口信息和用例信息,为了方便程序的读取,引入easypoi 工具来读取 Excel 内容.easypoi 比起 poi 使用更加的方便,代 ...