19人参与 • 2025-07-18 • Mysql
你有没有遇到过这些“坑”:
这就是 nginx的location匹配规则 的“魔法”!它让你的请求处理像“高速公路”一样高效,像“瑞士军刀”一样灵活。
本文将带你从 “迷路小菜鸟” 到 “火箭工程师”,手把手教你写出“神级配置”!
问题:只有完全相同的路径才能触发配置?
解决方案:用 =
实现精确匹配!
# 精确匹配 /favicon.ico location = /favicon.ico { root /var/www/static; # 指定静态文件路径 expires 30d; # 浏览器缓存30天 } # 请求示例: # ✅ 匹配:http://example.com/favicon.ico # ❌ 不匹配:http://example.com/favicon.ico?version=1
注释:
= /path
:必须完全匹配,连查询参数(?
后的内容)都不行!root
vs alias
:root
:路径拼接(如 /favicon.ico
→ /var/www/static/favicon.ico
)。alias
:路径替换(如 /static/images/logo.png
→ /var/www/images/logo.png
)。问题:想匹配所有以 /api
开头的请求?
解决方案:用 普通前缀匹配!
# 匹配所有以 /api 开头的路径 location /api { proxy_pass http://backend_api; # 反向代理到后端api } # 请求示例: # ✅ 匹配:/api/user、/api/v1/login # ❌ 不匹配:/apicheck(因为开头不是/api)
注释:
/api
和 /apic
),nginx会选最长的。location /api/
:必须以 /api/
开头(如 /api/123
)。location /api
:会匹配 /api
和 /apic
!问题:想区分 .jpg
和 .jpg
?
解决方案:用 ~
实现区分大小写的正则匹配!
# 匹配以 .jpg 结尾的图片(区分大小写) location ~ \.jpg$ { root /var/www/images; expires 30d; } # 请求示例: # ✅ 匹配:/photo.jpg # ❌ 不匹配:/photo.jpg
注释:
\.
表示匹配点号,$
表示结尾。问题:想同时匹配 .jpg
、.jpg
、.png
?
解决方案:用 ~*
实现不区分大小写的正则匹配!
# 匹配所有图片格式(不区分大小写) location ~* \.(jpg|png|gif)$ { root /var/www/images; expires 30d; } # 请求示例: # ✅ 匹配:/logo.png、/banner.gif
注释:
|
分隔多个后缀(如 jpg|png|gif
)。问题:为什么我的正则匹配被前缀匹配覆盖了?
解决方案:牢记 优先级顺序!
# 精确匹配(皇帝级) location = / { root /var/www/html; } # 最长前缀匹配(王侯级) location ^~ /static/ { root /var/www/static; } # 正则匹配(士大夫级) location ~ \.php$ { proxy_pass http://php_backend; } # 普通前缀匹配(平民级) location / { root /var/www/html; }
注释:
=
精确匹配^~
最长前缀匹配(停止后续匹配)~
或 ~*
正则匹配(按配置顺序)^~
比正则更优先!需求:
.css
、.js
)直接返回,缓存30天。/api/*
)反向代理到后端服务。index.html
。解决方案:
# 静态资源:不区分大小写的正则匹配 location ~* \.(css|js|png|jpg|gif)$ { root /var/www/static; expires 30d; } # api请求:最长前缀匹配(优先于正则) location ^~ /api/ { proxy_pass http://backend_api; } # 默认请求:普通前缀匹配 location / { root /var/www/html; index index.html; }
注释:
~*
匹配图片和样式表,避免被 /api
覆盖。^~
确保 /api
不被正则匹配干扰。问题:为什么 /api
和 /api/
会匹配不同的配置?
解决方案:统一路径结尾的斜杠!
# 坑点示例 location /api { proxy_pass http://backend_api; # 匹配 /api 和 /apic } location /api/ { proxy_pass http://backend_api_v2; # 仅匹配 /api/ } # 建议:统一用 ^~ 避免歧义 location ^~ /api { proxy_pass http://backend_api; }
注释:
/api
会匹配 /api/123
,但 /api/
只匹配 /api/
!^~
替代普通前缀匹配,避免斜杠陷阱!问题:为什么第一个正则匹配的配置总是生效?
解决方案:按优先级排序!
# 错误示例:正则顺序颠倒 location ~ \.jpg$ { ... } # 会被后面的覆盖! location ~ \.png$ { ... } # 实际生效 # 正确示例:按重要性排序 location ~ \.png$ { ... } # 更重要的匹配放前面 location ~ \.jpg$ { ... }
注释:
curl -i http://example.com/test.png
查看实际匹配的配置。问题:想根据路径动态选择后端服务器?
解决方案:用 map
指令!
# 定义变量 $backend,根据路径动态选择后端 map $uri $backend { default http://default-backend; "~^/xianyang/" http://xianyang-backend; "~^/api/" http://api-backend; } server { listen 80; location / { proxy_pass $backend; # 动态选择后端 } }
注释:
map
的魔法:根据 $uri
动态设置 $backend
,适合复杂路由场景。map
是预处理指令,比 if
更高效!问题:想先检查静态文件是否存在,否则返回404?
解决方案:用 try_files
!
location / { try_files $uri $uri/ /index.html; # 先找文件,再找目录,最后返回首页 }
注释:
try_files
的流程:
$uri
是否存在(如 /about.html
)。$uri/
是否存在(如 /about/
目录)。/index.html
(适合spa应用)。q:为什么我的 /api
路径匹配了 /apic
?
a:
/api
会匹配 /apic
!^~ /api
替代普通前缀匹配。q:如何强制重定向到带斜杠的路径?
a:
location /api { return 301 /api/; }
。q:正则匹配为什么比前缀匹配优先级低?
a:
通过本文的七个步骤,你已经掌握了:
=
的“人脸识别”能力。^~
的“地址模糊搜索”。~
和 ~*
的“魔法滤镜”。map
和 try_files
的“黑科技”。最后的小彩蛋:
如果你在开发一个“多租户系统”,记得用 map 根据子域名动态选择配置,用 ^~ 隔离公共资源路径!
以上就是nginx路径匹配的配置指南的详细内容,更多关于nginx路径匹配的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论