在 nginx 中编写 location 正则表达式需使用 ~(区分大小写)或 ~*(不区分大小写)修饰符,并严格遵循 pcre 语法规则。测试时推荐使用 nginx -t 验证语法合法性,并通过 curl 模拟请求观察匹配结果。

如何正确书写 location 正则表达式?
Nginx 的 location 块支持多种匹配模式,其中正则表达式用于处理复杂的 URL 路径匹配需求。使用 ~ 表示区分大小写的正则匹配,而 ~* 表示不区分大小写。正则表达式必须用斜杠 / 包裹,例如 location ~ ^/api/v[0-9]+/users$ { ... }。Nginx 按照精确匹配、前缀匹配、正则匹配的优先级顺序进行匹配,一旦找到第一个匹配的正则表达式,将立即停止搜索并执行该 block 中的配置。

server {
listen 80;
server_name example.com;
# 精确匹配
location = /exact {
return 200 "Exact match";
}
# 前缀匹配
location /prefix {
root /var/www/html;
}
# 正则匹配:区分大小写
location ~ ^/api/v[0-9]+/users$ {
return 200 "API Users Endpoint";
}
# 正则匹配:不区分大小写
location ~* \.(jpg|jpeg|png|gif)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
如何测试 location 正则表达式的匹配行为?
测试 Nginx 正则表达式的关键在于验证其是否符合预期匹配逻辑。首先使用 nginx -t 检查配置文件语法是否正确,任何语法错误都会导致 Nginx 启动失败。接着通过 curl 发送不同路径的请求,观察返回状态码和响应内容。例如,访问 /api/v1/users 应匹配第三个 location 块,而访问 /API/V1/USERS 则不会匹配(因为使用了 ~ 而非 ~*)。对于图片资源,访问 /image.JPG 会匹配第四个 location 块(因为使用了 ~*),从而设置缓存头。

# 测试命令示例 curl -I http://example.com/exact curl -I http://example.com/prefix/test curl -I http://example.com/api/v1/users curl -I http://example.com/image.JPG curl -I http://example.com/API/V1/USERS
当多个 location 规则冲突时,Nginx 如何选择?
当多个 location 规则可能匹配同一 URL 时,Nginx 遵循严格的优先级顺序:精确匹配(=)最高,其次是普通前缀匹配(无修饰符),最后是正则匹配(~ 或 ~*)。如果存在多个前缀匹配,选择最长前缀的那个。如果存在多个正则匹配,选择第一个出现在配置文件中的那个。这种设计确保了配置的确定性,但也要求开发者仔细规划 location 块的顺序和内容,避免意外匹配。例如,若同时存在 location /api 和 location ~ ^/api/.*$,访问 /api/test 将优先匹配前缀匹配块,因为前缀匹配优先级高于正则匹配。


















