IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> nginx location匹配顺序 -> 正文阅读

[系统运维]nginx location匹配顺序

先查阅资料

很多网页都有说明。一遍没有看懂,还是找官网,比较权威。
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
一下是根据网站的意思整理成初步顺序。

regular expression – Regular expressions are specified with the preceding “~*” modifier (for case-insensitive matching), or the “~” modifier (for case-sensitive matching)

  1. first checks locations defined using the prefix strings;
  2. location with the longest matching prefix is selected and remembered;
  3. If the longest matching prefix location has the “^~” modifier then
    regular expressions are not checked.
  4. regular expressions are checked
  5. in the order of their appearance in the configuration file;
  6. The search of regular expressions terminates on the first match
  7. If no match with a regular expression is found then the
    configuration of the prefix location remembered earlier is used

只看到正则表达是 ~ ~*,也没有搞懂prefix string是什么意思。

我们一起来看看nginx plus的介绍:
There are two types of parameter to the location directive: prefix strings (pathnames) and regular expressions

  1. Test the URI against all prefix strings.
  2. The = (equals sign) modifier defines an exact match of the URI and a
    prefix string. If the exact match is found, the search stops.
  3. If the ^~ (caret-tilde) modifier prepends the longest matching
    prefix string, the regular expressions are not checked.
  4. Store the longest matching prefix string.
  5. Test the URI against regular expressions(~ or ~*).
  6. Stop processing when the first matching regular expression is found
    and use the corresponding location.
  7. If no regular expression matches, use the location corresponding to
    the stored prefix string.

nginx plus 第4条和 nginx http module中的第2条意思一样。

按照语法,这四个表达式可以省略。
location [ = | ~ | ~* | ^~ ] uri { … }

猜测prefix strings (pathnames),应该是直接使用uri,省略语法中四个表达式。

在网站中测试下

https://detailyang.github.io/nginx-location-match-visible/

location /a {}
location = /a {}
location ^~ /a {}
location ~* /A {}
location ~ /a {}
location /abc {}
访问/ab 匹配到 ^~ /a
访问/abc 还是匹配到 ^~ /a 根据第三条

删掉 ^~ /a,变成:
location /a {}
location = /a {}
location ~* /A {}
location ~ /a {}
location /abc {}
访问 /abc ,匹配到 ~ /a 根据第五条

删掉 ~ /a,变成:
location /a {}
location = /a {}
location ~* /A {}
location /abc {}
访问 /abc 匹配到 /abc ,,,不知道为什么没有匹配~* /A,一会测试下。

找台机器测试下

server {
    listen 192.168.200.241:80;
    server_name www.a.com;
    location /a { return 200 "matched /a\n"; }
    location = /a { return 200 "matched = /a\n"; }
    location ^~ /ab { return 200 "matched ^~ /ab\n"; }
    location ~* /a { return 200 "matched ~* /a\n"; }
    location ~ /a { return 200 "matched ~ /a\n"; }
    location /abc { return 200 "matched /abc\n"; }  
}

star@STAR-LEE:~$ curl http://192.168.200.241/abc
matched ~* /a
star@STAR-LEE:~$ curl http://192.168.200.241/Abc
matched ~* /a
貌似那个网站有些内容不是很准确。
接下来继续测试:
把~* /a移动到~ /a后面

server {
    listen 192.168.200.241:80;
    server_name www.a.com;
    location /a { return 200 "matched /a\n"; }
    location = /a { return 200 "matched = /a\n"; }
    location ^~ /ab { return 200 "matched ^~ /ab\n"; }
    location ~ /a { return 200 "matched ~ /a\n"; }
    location ~* /a { return 200 "matched ~* /a\n"; }
    location /abc { return 200 "matched /abc\n"; }  
}

节约下篇幅。。。

star@STAR-LEE:~$ curl http://192.168.200.241/Abc
matched ~* /a
star@STAR-LEE:~$ curl http://192.168.200.241/abc
matched ~ /a
说明 ~ 和 ~* 优先级相等。

突发奇想,在= ,prefix string,^~后面使用perl正则表达式会怎么样。

server {
    listen 192.168.200.241:80;
    server_name www.a.com;
    location /a { return 200 "matched /a\n"; }
    location = /a { return 200 "matched = /a\n"; }
    location ^~ /ab* { return 200 "matched ^~ /ab\n"; }
    location ~* /a { return 200 "matched ~* /a\n"; }
    location ~ /a { return 200 "matched ~ /a\n"; }
    location /abc { return 200 "matched /abc\n"; }  
}

star@STAR-LEE:~$ curl http://192.168.200.241/abc
matched ~* /a
star@STAR-LEE:~$ curl http://192.168.200.241/ab*
matched ^~ /ab

貌似不是按照正则表达式来的。说明:
只有在~,~*后面可以使用perl的正则表达式。
prefix string , = , ^~ 后面跟正则表达式都无效。

总结下

这样匹配顺序就理清楚了:
1.首先用prefix strings走一遍,记录最长匹配;
2.如果被 = 精确匹配,则不再查找;
3.如果 ^~ 匹配的是prefix strings中最长匹配,则不使用正则表达式查找;
4.使用 ~ 或 ~* 匹配到第一个,则不再查找;
5.如果4没有匹配到,使用1中记录的最长匹配;

来验证一下:
先不使用正则表达式

server {
    listen 192.168.200.241:80;
    server_name www.a.com;
    location /a { return 200 "matched /a\n"; }
    location = /a { return 200 "matched = /a\n"; }
    location ^~ /ab { return 200 "matched ^~ /ab\n"; }
    # location ~* /a { return 200 "matched ~* /a\n"; }
    # location ~ /a { return 200 "matched ~ /a\n"; }
    location /abc { return 200 "matched /abc\n"; }  
}

star@STAR-LEE:~$ curl http://192.168.200.241/a
matched = /a
star@STAR-LEE:~$ curl http://192.168.200.241/ab
matched ^~ /ab
star@STAR-LEE:~$ curl http://192.168.200.241/abc
matched /abc
star@STAR-LEE:~$ curl http://192.168.200.241/abcd
matched /abc
star@STAR-LEE:~$ curl http://192.168.200.241/abd
matched ^~ /ab

测试下正则表达式的影响:

server {
    listen 192.168.200.241:80;
    server_name www.a.com;
    location /a { return 200 "matched /a\n"; }
    location = /a { return 200 "matched = /a\n"; }
    location ~* /a { return 200 "matched ~* /a\n"; }
    location ~ /a { return 200 "matched ~ /a\n"; }
    location ^~ /ab { return 200 "matched ^~ /ab\n"; }
    location /abc { return 200 "matched /abc\n"; }  
}

star@STAR-LEE:~$ curl http://192.168.200.241/abc
matched ~* /a
location /abc虽然是prefix string中的最长匹配,使用顺序4;

star@STAR-LEE:~$ curl http://192.168.200.241/abcd
matched ~* /a
location /abc虽然是prefix string中的最长匹配,使用顺序4;

star@STAR-LEE:~$ curl http://192.168.200.241/abd
matched ^~ /ab
使用顺序3,并且不受位置影响,即使在正则表达式后面也无所谓。

想起nginx plus location中的一句话:
For a request URI to match a prefix string, it must start with the prefix string.
不知何意,如有好心人知道,还请指点迷经。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:55:01  更:2021-12-24 18:56:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:55:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码