前缀匹配是nginx最常用的位置匹配方式,依据uri开头是否一致判断,优先选择最长匹配项;普通前缀如location /static/,^~修饰符则在匹配后终止正则检查。

前缀匹配是 Nginx 中最常用、最直观的 location 匹配方式,它不依赖正则,靠 URI 开头是否一致来判断,适合静态资源、API 分组、目录路由等场景。
普通前缀匹配(无修饰符)
写法如 location /static/ { ... },表示匹配所有以 /static/ 开头的请求路径。Nginx 会找出所有能匹配的前缀规则,然后选**最长的那个**生效。
-
location /static/ { root /var/www/static; }→ 匹配/static/logo.png、/static/css/app.css -
location /static/js/ { root /var/www/assets; }→ 更长,优先于上一条,匹配/static/js/main.js - 注意末尾斜杠:
/static可匹配/static?arg=1或/static123,而/static/不会匹配后者,更安全
精确前缀匹配(^~ 修饰符)
加上 ^~ 表示:一旦这个前缀匹配成功,就立即使用,**不再检查后续的正则 location 块**。适用于明确要跳过正则开销的静态路径。
location ^~ /api/v1/ { proxy_pass http://backend1; }- 请求
/api/v1/users匹配成功,直接转发,哪怕后面还写了location ~ \.php$也不会再评估 - 比普通前缀匹配多一层“终止正则检查”的语义,性能更可控
什么时候该用前缀匹配
适合结构清晰、路径有层级关系的场景,比如:
- 静态文件托管:
location /images/ { root /data/img; } - 前端单页应用的 fallback:
location / { try_files $uri $uri/ /index.html; } - 子系统入口隔离:
location /admin/ { auth_basic "Admin Area"; ... } - 避免误匹配:用
/blog/而不是/blog,防止把/blogging也卷进来
常见误区提醒
前缀匹配不看查询参数,也不做通配或截断,只比对 URI 的开头字符串:
-
location /test会匹配/test?foo=bar和/testme(因为开头确实是/test) - 想严格限定结尾,得加斜杠:
location /test/或改用= /test精确匹配 - 多个前缀都能匹配时,Nginx 不按配置顺序选,而是按**实际匹配长度**选,和书写顺序无关











