Nginx中正则匹配靠location的~(区分大小写)或~*(不区分大小写)前缀,按配置顺序首个匹配即生效;优先级低于精确匹配和最长前缀匹配,推荐用双引号包裹表达式并谨慎锚定。

Nginx 中使用标准正则表达式匹配请求路径,靠的是 location 指令的 波浪线 ~(区分大小写)或 波浪线加星号 ~*(不区分大小写)前缀。这类匹配在普通前缀匹配(location /path)和精确匹配(location = /path)之后进行,且一旦匹配成功就立即生效,不再检查后续 location 块。
语法与基本写法
正则 location 必须以 ~ 或 ~* 开头,后面紧跟一个用双引号或单引号包裹的 PCRE 兼容正则表达式:
-
location ~ "^/api/v\d+/users/\d+$" { ... }—— 匹配如/api/v1/users/123 -
location ~* "\.(jpg|png|gif)$" { ... }—— 不区分大小写匹配图片后缀 - 注意:正则中若含空格、
{、;等特殊字符,必须加引号;推荐统一用双引号
匹配优先级与执行逻辑
Nginx 的 location 匹配不是“从上到下”,而是按**类型优先级 + 最长匹配**规则决定:
- 精确匹配(
=)最高优先级 - 普通前缀匹配(
location /prefix)找最长前缀,但不终止,仅记录为“最佳前缀匹配” - 正则匹配(
~和~*)按配置文件中出现的顺序依次尝试,遇到第一个匹配即停止,不继续往后查 - 若无正则匹配,则使用之前记录的“最佳前缀匹配”结果
常用技巧与注意事项
正则 location 灵活但易出错,实用建议如下:
- 用
$request_uri或$uri在日志中调试匹配效果,例如:log_format debug "$uri ~ $request_uri"; - 捕获组(如
(\d+))可在后续指令中通过$1、$2引用,用于重写或变量传递 - 避免过度依赖复杂正则,简单路径尽量用前缀匹配(更高效);正则适合动态路径、版本路由、文件类型分发等场景
-
location ~ \.php$类写法要小心——未加锚定可能误匹配/static/php.js,应写成location ~ \.php$($结尾很关键)或更稳妥的location ~ ^/.+\.php$
示例:API 版本路由 + 静态资源分离
一个典型组合用法:
location ~ ^/api/v(?<version>\d+)/products/(?<id>\d+)$ { rewrite ^ /api/products?id=$id&version=$version break; }location ~* \.(css|js|woff2?)$ { expires 1y; add_header Cache-Control "public, immutable"; }location ~* ^/(images|assets)/ { root /var/www/static; }


















