写在之前 众所周知 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 718 最长重复子数组(动态规划)

    718. 最长重复子数组 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释 ...

  2. 疫情期间我是如何拿到20k的offer,2020年php面试题汇总

    推荐视频:面试10家公司,收获9个offer,2020年PHP 面试问题 第一阶段1-2年 我认为1-2年对于PHP程序员来说是第一个门槛,这一阶段菜鸟正式从理论迈向企业级开发.我们知道如何使用工具. ...

  3. 纯正中文版本pi-star系统下载

    基于3.4.17修改(稳定,发热量少) 不支持RPI 4 a/b+ 完美支持树莓派0,1,2,3 默认刷好卡,启动已经设置好所有参数(选好TFT屏幕,调制解调器类型GPIO,打开了DMR服务器(460 ...

  4. Cordova+ionic+angular 项目从 UIWebView 更换为 WKWebView ,通过IOS审核

    当前 cordova-ios 最新版本 5.1.1 新版本 cordova-ios 将删除 UIWebView 代码中的所有引用.WKWebView 将是 Cordova 的默认 Web 视图.   ...

  5. ubuntu18启动zabbix-agent失败/故障记录

    故障现象 ubuntu 16 升级18 之后 安装了zabbix agent 今天突然agent掉了 上去的时候发现 报错: 后来打算-c 启动然后发现 /usr/sbin/zabbix_agentd ...

  6. zabbix 大流量断图

    一. 环境介绍 系统版本:Centos7.4 zabbix-agent 版本:zabbix-agent 3.4.7   二. 问题现象 在使用zabbix的snmp方式的监控端口流量时,某一个图总是断 ...

  7. const修饰this指针的用法

    #include <iostream> #include <string> using namespace std; class Base { }; class Excepti ...

  8. mysql8.0 Mac下的安装

    一.下载及安装 首先去官网下载mac对应版本的Mysql,尾缀为.dmg的程序包 下载地址:https://dev.mysql.com/downloads/mysql/ 二.启动 在 Setting ...

  9. wget介绍和命令总结

    参考资料: https://www.cnblogs.com/ftl1012/p/9265699.html https://www.cnblogs.com/lsdb/p/7171779.html cur ...

  10. java并发编程 --并发问题的根源及主要解决方法

    目录 并发问题的根源在哪 缓存导致的可见性 线程切换带来的原子性 编译器优化带来的有序性 主要解决办法 避免共享 Immutability(不变性) 管程及其他工具 并发问题的根源在哪 首先,我们要知 ...