目录

nginx匹配规则

nginx匹配规则

在 Nginx 中,一个请求的匹配规则遵循 “最佳匹配优先” 原则,即 匹配度最高的规则生效 ,匹配顺序如下:


1. 关键匹配类型

Nginx 配置中, location 有不同的匹配方式,匹配优先级如下(从高到低):

优先级匹配类型例子说明
1= 精确匹配location = /login {}完全匹配 ,如果匹配成功,则立即使用该规则,不再继续匹配。
2^~ 前缀匹配(优先)location ^~ /static/ {}如果匹配,直接使用,不再检查正则匹配 。适用于静态资源。
3~ 正则匹配(区分大小写)`location ~ .(pngjpg)$ {}`
4~* 正则匹配(不区分大小写)`location ~* .(pngjpg)$ {}`
5/ 前缀匹配(默认)location / {}最普通的前缀匹配 ,如果没有更高优先级的规则匹配,就使用这个。

2. 匹配规则的执行流程

当一个请求进来时,Nginx 按如下顺序匹配 location

  1. 先检查 = 精确匹配 ,如果匹配,立即使用该规则,停止搜索。
  2. 然后检查 ^~ ,如果匹配,立即使用该规则,停止搜索。
  3. 接着检查所有 ~~* 的正则匹配 ,如果多个正则匹配上了,选择 最长的匹配规则
  4. 最后检查普通的 / 前缀匹配 ,如果没有其他匹配,就使用 最长的前缀匹配
  5. 如果都没有匹配,则使用默认的 location / 规则

3. 具体示例

假设有以下 location 规则:

server {
    listen 80;

    location = /exact {
        return 200 "精确匹配 /exact\n";
    }

    location ^~ /static/ {
        return 200 "匹配 /static/ 及其子路径\n";
    }

    location ~ (jpg|png|gif)$ {
        return 200 "匹配图片后缀\n";
    }

    location /blog {
        return 200 "匹配 /blog 及其子路径\n";
    }

    location / {
        return 200 "默认匹配\n";
    }
}

4. 请求匹配示例

请求 URL匹配的 location解释
/exactlocation = /exact精确匹配 ,直接使用此规则。
/static/js/app.jslocation ^~ /static/^~ 优先级高,匹配后直接使用,不再检查正则规则。
/images/photo.jpg`location ~ .(jpgpng
/blog/articlelocation /blog前缀匹配 /blog ,最长匹配优先。
/somethingelselocation /默认匹配 ,因为没有其他匹配规则适用。

5. 重点总结

  1. 精确匹配 ( = ) 优先级最高 ,匹配成功就直接使用,不再检查其他规则。
  2. ^~ 规则比正则高 ,如果匹配 ^~ ,直接使用,不再检查正则。
  3. 多个正则 ( ~~* ) 匹配时,选择最长的匹配规则
  4. 普通前缀匹配 ( /blog 这种) 选择最长匹配的路径
  5. 如果都匹配不上,默认使用 location /

🚀 这个机制可以帮助你优化 Nginx 规则,减少不必要的匹配计算,提高性能!