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 327 区间和的个数
327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...
- Java实现 LeetCode 263 丑数
263. 丑数 编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 输 ...
- Java实现 蓝桥杯VIP 算法提高 密码锁
算法提高 题目 2 密码锁 时间限制:1.0s 内存限制:1.0GB 问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子 ...
- Java实现 LeetCode 92 反转链表 II
92. 反转链表 II 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-> ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- Java中List,Set,Map的区别以及API的使用
1.面试题:你说说collection里面有什么子类. (其实面试的时候听到这个问题的时候,你要知道,面试官是想考察List,Set) 正如图一,list和set是实现了collection接口的. ...
- Java实现 蓝桥杯 算法提高 最长滑雪道
试题 算法提高 最长滑雪道 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小袁非常喜欢滑雪, 因为滑雪很刺激.为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上 ...
- Windows下mysql的基础操作
1.数据库表操作: - 首先启动mysql服务器,在安装mysql的目录下打开cmd窗口,运行mysql:'mysql.exe -hlocalhost -p3306 -uroot -p123456'; ...
- 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载
利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...
- AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
pyqt5信号要定义为类属性 #!/usr/bin/python3 # -*- coding: utf-8 -*- from PyQt5.Qt import * import sys class Wi ...