写在之前 众所周知 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 知识知多少的更多相关文章

  1. Nginx location 匹配顺序整理

    Nginx location模块整理 具体的Nginx安装就不在这里描述了,这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /etc/redhat-release [r ...

  2. Nginx Location配置总结

    Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...

  3. nginx location配置

    nginx location配置   location在nginx中起着重要作用,对nginx接收到的请求字符串进行处理,如地址定向.数据缓存.应答控制.代理转发等location语法location ...

  4. nginx location的配置

    文章转自:http://www.ttlsa.com/nginx/nginx-location-configure/ location的语法配置规则: 语法规则: location [=|~|~*|^~ ...

  5. nginx location配置(URL)

    语法规则: location [=|~|~*|^~] /uri/ { … }= 表示精确匹配,这个优先级也是最高的^~ 表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url ...

  6. Nginx location配置详细解释

    nginx location配置详细解释 语法规则: location [=|~|~*|^~] /uri/ { - } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 ur ...

  7. nginx location匹配顺序及CI框架的nginx配置

    Nginx location匹配顺序如下: 用前缀字符串定义的location规则对URI进行匹配测试. =号定义了精确的前缀字符串匹配,如果发现精确匹配则使用当前规则.否则继续下一步匹配. 匹配其它 ...

  8. nginx Location 语法基础知识

    URL地址匹配是Nginx配置中最灵活的部分 Location 支持正则表达式匹配,也支持条件匹配,用户可以通过location指令实现Nginx对动丶静态网页的过滤处理. Nginx locatio ...

  9. nginx location 正则匹配

    nginx 统计语句1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l2.统计访问URL统计PV awk '{print $7 ...

随机推荐

  1. Java实现 LeetCode 347 前 K 个高频元素

    347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...

  2. Java实现 LeetCode 94 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...

  3. Java实现 LeetCode70 爬楼梯

    70. 爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: ...

  4. Java实现荷兰国旗问题

    问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后 ...

  5. java实现第三届蓝桥杯数量周期

    数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简单的原理.科学的目标之一就是发现纷繁复杂的自然现象背后的简单法则.爱因斯坦的相对论是这方面的典范例证. 很早的时候,生物学家观察某 ...

  6. 浅谈js运行机制

    前言 因为js的运行机制十分重要,理解起来也十分抽象,仍还是在这里做个记录,加深自己的记忆. 总之,希望本文的内容能够对您的学习或者工作有所帮助.另,如果有任何的错误或者不足请指正! 如何理解js单线 ...

  7. 什么?你还不会获取地址栏(url)的值

    function getUrlParam(name) {//封装方法 var reg = new RegExp("(^|&)" + name + "=([^&am ...

  8. python—面向对象设计

    一:三大编程范式 1.面向过程编程 2.函数式编程 3.面向对象编程 (类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念) (对象:就是基于类而创建的一个具体的事物 [具体存在的] ...

  9. App接口设计之token的php实现

    为了保证移动端和服务端数据传输相对安全,需要对接口进行加密传输. 一.ttoken的设计目的:  因为APP端没有和PC端一样的session机制,所以无法判断用户是否登陆,以及无法保持用户状态,所以 ...

  10. Unit1-窝窝初体验

    全文共3179字,推荐阅读时间10~15分钟. 文章共分四个部分: 作业分析 评测相关 重构策略 初体验感受 作业分析 第一次作业 第一次作业要求我们实现一个简单的幂函数求导工具,没有乘积和复合的情况 ...