源本科技 | 码上会

Nginx 路由匹配规则

2026/05/19
2
0

引言

在 Nginx 中,location 是实现请求路由分发的核心指令,它会根据客户端请求的 URI 匹配对应的配置规则,决定请求的处理方式(静态资源访问、反向代理、访问控制等)。Nginx 提供了精确匹配、前缀匹配、正则匹配等多种模式,匹配遵循固定的优先级与流程

路由匹配优先级

Nginx 的 location 匹配分为两个阶段:先匹配非正则规则(精确 / 前缀),再匹配正则规则;匹配成功后会根据规则类型决定是否终止匹配。
正确优先级顺序(从高到低)

  1. 精确匹配=):优先级最高,完全匹配则立即终止所有匹配

  2. 前缀匹配^~):匹配成功后,不再检查任何正则规则

  3. 正则表达式匹配~ / ~*):按配置文件顺序匹配,匹配即终止

  4. 普通前缀匹配(无修饰符):遵循最长前缀优先原则

  5. 通用匹配/):优先级最低,匹配所有未命中的请求


修饰符说明

修饰符

类型

作用说明

=

精确匹配

要求 URI 完全一致,匹配后直接终止匹配

^~

前缀匹配

匹配 URI 前缀,命中后跳过所有正则规则

~

正则匹配

区分大小写的正则表达式匹配

~*

正则匹配

不区分大小写的正则表达式匹配

无修饰符

普通前缀匹配

匹配 URI 前缀,遵循最长前缀优先

/

通用匹配

匹配所有请求,默认兜底规则


精确匹配

使用 = 修饰符,请求 URI 必须与配置路径完全一致才会匹配,优先级最高,匹配成功后立即生效,不继续匹配其他规则。

配置示例

# 仅匹配根路径 /
location = / {
    root /usr/share/nginx/html;
    index index.html;
}

# 仅匹配 /api/login 这一个路径
location = /api/login {
    return 200 '登录接口';
}

匹配结果

  • http://domain.com/ → 匹配成功

  • http://domain.com/api/login → 匹配成功

  • http://domain.com/api → 匹配失败


前缀匹配(^~)

用于匹配 URI 前缀,核心作用是屏蔽后续正则匹配,适合静态资源、固定前缀的接口路由,避免正则规则干扰。

配置示例

# 匹配所有以 /static/ 开头的请求
location ^~ /static/ {
    alias /data/static/;
    expires 7d;
}

核心特性

  • 匹配成功后,不再执行任何正则匹配

  • 遵循最长前缀优先原则

  • 适合静态资源、无需正则的固定前缀路由


正则表达式匹配

使用 ~(区分大小写)、~*(不区分大小写)修饰符,支持正则语法编写复杂匹配规则,按配置文件的书写顺序匹配,命中即终止

配置示例

# 区分大小写:匹配 /api/v1 /api/v2 等路径
location ~ ^/api/v[1-9]/ {
    proxy_pass http://backend_api;
}

# 不区分大小写:匹配所有图片、样式、脚本文件
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
    root /data/images;
    expires 30d;
}

匹配结果

  • /api/v1/user → 匹配第一条规则

  • /test.PNG → 匹配第二条规则(不区分大小写)

  • 正则规则顺序决定优先级,写在前面的规则优先匹配


普通前缀匹配

最基础的匹配方式,无任何修饰符,仅匹配 URI 前缀,遵循最长前缀优先原则,匹配后不会终止正则检查。

配置示例

# 匹配所有以 /api 开头的请求
location /api {
    proxy_pass http://backend_server;
}

# 匹配所有以 /api/user 开头的请求(更长前缀,优先级更高)
location /api/user {
    proxy_pass http://user_server;
}

核心特性

  • 最长前缀优先:/api/user 优先级高于 /api

  • 匹配成功后,仍会继续检查正则规则

  • 适合无特殊需求的通用前缀路由


通用匹配

使用 location /,匹配所有请求,作为兜底规则,处理所有未被其他规则匹配的请求,优先级最低。

配置示例

# 兜底匹配所有未命中的请求
location / {
    root /var/www/default;
    index index.html index.htm;
}

核心规则

  • 最长前缀优先
    普通前缀匹配、^~ 前缀匹配,都会优先选择路径更长的规则(如 /api/user 优于 /api)。

  • 正则顺序优先
    正则匹配不看路径长度,只看配置文件中的书写顺序,先写的规则优先匹配。

  • ^~ 的核心作用
    不是优先级最高,而是屏蔽正则匹配,这是静态资源配置的关键。

  • 匹配终止逻辑

    • =:匹配 → 终止

    • ^~:匹配 → 终止正则

    • 正则:匹配 → 终止

    • 普通前缀:匹配 → 继续检查正则


综合配置示例

server {
    listen 80;
    server_name localhost;

    # 1. 精确匹配:根目录
    location = / {
        root /usr/share/nginx/html;
        index index.html;
    }

    # 2. ^~ 前缀匹配:静态资源,跳过正则
    location ^~ /static/ {
        alias /data/static/;
        expires 7d;
    }

    # 3. 正则匹配:图片文件
    location ~* \.(jpg|png|gif)$ {
        root /data/images;
    }

    # 4. 普通前缀匹配:接口
    location /api {
        proxy_pass http://backend_api;
    }

    # 5. 通用匹配:兜底
    location / {
        return 404 '页面不存在';
    }
}