Nginx 的路径拼接规则
|
admin
2026年5月8日 11:21
本文热度 50
|
和 location 匹配一样,Nginx 的路径拼接也是杂乱且隐晦,本文只会介绍最常见最简单的方式。
基础路径拼接规则
- proxy_pass 的目标地址,如果不是斜杠/结尾,则代理到目标服务器,会把请求的 url 拼接到 proxy_pass 目标地址之后。
- 如果 proxy_pass 目标地址以/结尾,则表示把请求的 url 中 location 匹配成功的部分剪切掉之后,再拼接到 proxy_pass 目标地址之后(够隐晦吧)。
location /a { proxy_pass http://server/path;}
location /a/ { proxy_pass http://server/path/;}
如上两个匹配成功后,实际代理的目标 url 分别是:
http://server/path/a/b.html
(把 /a/b.html 拼接到 http://server/path 之后)
http://server/path/b.html
(由于 proxy_pass 以/结尾,所以把 /a/b.html 的 /a/ 去掉之后,拼接到http://server/path/ 之后)
正则表达式的拼接
- 对于 location 为正则表达式的匹配,proxy_pass 如果不带路径,结果就和普通 location 一样拼接,如下配置,请求会直接拼接到域名之后。
location ~ /abc(.*) { proxy_pass http://127.0.0.1;}
- 对于 location 为正则表达式的匹配,proxy_pass 能通过末尾的/来实现路径替换吗?答案是否定的。比如,如下配置会报错:
location ~ /abc(.*) { proxy_pass http://127.0.0.1/;}
为什么不能带路径?我个人认为就是 Nginx 做得不够好!
- 如果是正则表达式,想要实现 proxy_pass 的路径替换,Nginx 的要求是通过正则表达式的()来捕获分组,可以使用如下方式:
location ~ /abc(.*) { proxy_pass http://127.0.0.1/x$1;}
如上可以把(.*)所匹配的内容拼接到 http://127.0.0.1/x 之后,关于$1的使用,可以参考各种编程语言的正则表达式。
- 另一种方法是拼接内部变量,比如 $request_uri:
location ~ /abc { proxy_pass http://127.0.0.1/x$request_uri;}
这种情况下,Nginx 认为可以找到准确的代理目标地址,实际效果是 http://127.0.0.1/x 后拼接完整请求路径 + 参数。
作者简介:从事 Web 前后端开发多年。一直相信“技术应该被说人话”,坚持输出实用易懂的干货内容。闲暇写些随笔,记录行业观察与生活感悟。
阅读原文:https://mp.weixin.qq.com/s/trhih4j8ZcjvKNAfZEUg9A
该文章在 2026/5/8 11:21:13 编辑过