Skip to content

🎯 Location 匹配规则

匹配优先级(重要!)

当一个 URL 请求来了,Nginx 会按优先级查找匹配的 location。就像在图书馆找书——先精确查找书号,再按分类找,最后看推荐区。

语法含义优先级示例
=精确匹配🥇 最高= /api/v1/users
^~前缀匹配(匹配后不再查正则)🥈 次高^~ /static/
~正则匹配(区分大小写)🥉 普通~ .php$
~*正则匹配(不区分大小写)🥉 普通~* .(jpg|png|gif)$
无修饰前缀匹配最低/api/

实战演示

nginx
server {
    listen 80;
    server_name example.com;

    # 精确匹配首页
    location = / {
        return 200 "这是首页";       # 🥇 优先级最高
    }

    # 精确匹配 favicon
    location = /favicon.ico {
        access_log off;
        return 204;
    }

    # 前缀匹配静态文件(^~ 匹配后不查正则)
    location ^~ /static/ {
        root /var/www;                # 🥈 优先级次高
    }

    # 正则匹配图片文件(不区分大小写)
    location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
        root /var/www/images;         # 🥉 正则匹配
        expires 30d;
    }

    # 正则匹配 PHP 文件
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 默认匹配(优先级最低)
    location / {
        try_files $uri $uri/ /index.html;
    }
}

匹配流程图解

一个请求来到 Nginx,匹配过程是这样的:

  1. 先检查所有=精确匹配,命中就直接用
  2. 再检查所有^~前缀匹配,命中就直接用
  3. 然后按顺序检查~和~*正则匹配,第一个命中就用
  4. 最后用最长前缀匹配的无修饰 location

💡 提示: 💡 调试技巧:如果不确定哪个 location 被匹配了,在每个 location 里加一个独特的响应头,然后用curl -I http://example.com/path查看。