网站上用nginx非常广泛, 但是它的配置文件比较复杂, 这里讨论下nginx的location匹配规则.

约定熟成: []表示里面的参数能省略, <>表示里面的参数不能省略.

location的两种语法

第一种语法分为3个部分, 分别是: location关键字+@name别名(name是自己取的名字)+如何处理, 这个语法很简单, 就是做内部跳转, 这里不讨论了.

location @name { ... }

第二种语法分为4个部分, 分别是: location关键字 + 匹配方式符号(可省略)+匹配规则+如何处理, 这个最复杂也是最常用, 我们只讨论这个.

location [ = | ~ | ~* | ^~ ] uri { ... }

普通匹配和正则匹配

这个语法的难点全部集中在[ = | ~ | ~* | ^~ ]这里, 只要搞懂这个就能正确使用location.

[ = | ~ | ~* | ^~ ]分为两种匹配模式, 分别是普通匹配和正则匹配.

普通匹配概述

= : 这代表精准匹配全路径, 命中它后直接返回, 不再进行后续匹配, 优先级最高. ^~ : 这代表精准匹配开头, 命中开头后直接返回, 不再进行后续匹配, 优先级第二. 无匹配方式符号 : 这代表通用性匹配, 命中后还会继续后续匹配, 最后选取路径最长的匹配, 并储存起来, 优先级第四.

普通匹配举例

#这是精准匹配, 只有请求路径完全匹配`/index.html`才会命中它
location = /index.html {
  ...
}
#这是精准匹配开头, 只要请求路径的开头是`/image/`, 就会命中并立即返回
location ^~ /image/ {
  ...
}
#这是无匹配方式符号的普通匹配, 如果请求路径开头是`/image/`, 则会命中, 但是不会立即返回还会接着进行普通匹配
location /image/ {
  ...
}
#这是无匹配方式符号的普通匹配, 如果请求路径开头是`/image/meinv`, 则会命中, 但是不会立即返回还会接着进行普通匹配, 同时会舍弃掉上面那个匹配
location /image/meinv {
  ...
}

正则匹配概述

~: 这是区分大小写的正则匹配, 命中后则不进行后续匹配, 立即返回, 优先级第三. *~: 不区分大小写的正则匹配, 命中后则不进行后续匹配, 立即返回, 优先级第三.

这里有个很重要点点, 也就是正则匹配中~*~优先级一样, 它们按照从上到下的顺序进行匹配, 最先命中的立即返回, 后续的不会进行匹配, 所以精细的正则匹配规则往前放, 通用的正则匹配规则往后放.

正则匹配举例

#区分大小写的正则匹配, 如果路径包含 /image/ 则立即返回, 注意这里并不需要开头命中, 因为这是正则表达式
location ~ /image/ {
  ...
}

#区分大小写的正则匹配, 如果路径包含 /image(不分大小写)/ 则立即返回, 注意这里并不需要开头命中, 因为这是正则表达式, 但由于上面一个正则匹配规则在前面, 所以如果路径包含 /image/ 则会被挡下来, 匹配不到这里.
location *~ /IMAGE/ {
  ... 
}

location如何匹配?

  1. 先进行普通匹配中的精准匹配, 如果命中了立马返回.

  2. 然后进行普通匹配中的精准开头匹配, 如果命中则立马返回.

  3. 进行普通匹配中的 无匹配符号 匹配, 如果命中继续匹配, 知道普通匹配全部完成, 并保存路径最长的匹配.

  4. 由上自下进行正则匹配, 如果命中立即返回.

  5. 如果正则匹配全部失败, 则返回普通匹配中存放的匹配.

1-2022-01-20-10-07-28

参考资料

快速掌握Nginx(二) —— Nginx的Location和Rewrite

nginx配置location总结及rewrite规则写法

一文弄懂Nginx的location匹配 这篇很好

开启精彩搜索

历史搜索

用户名或邮箱
密码
用户名
密码
重复密码
邮箱
注册
找回密码
注册 登录
邮箱
邮箱验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

新增

新增

新增

新增

新增

新增

新增

新增