coverPiccoverPic

Nginx 反向代理中变量拼接会失去 URL 后缀

遇到的问题

假设我们需要将前端请求 /back/ 开头的路径代理到后端服务 https://my.site.expample.io/

静态路径

nginx
  1. location /back/ {
  2. proxy_pass https://my.site.expample.io/;
  3. }

结果:一切正常。当用户访问 https://your-domain.com/back/api/user?id=1 时,Nginx 会正确地将请求转发为 https://my.site.expample.io/api/user?id=1

变量配置

nginx
  1. location /back/ {
  2. set $host "my.site.expample.io";
  3. proxy_pass https://$host/;
  4. }

结果:路径丢失。当用户访问 https://your-domain.com/back/anything 时,请求被转发到了 https://my.site.expample.io/。

正确写法

我们必须显式地告诉 Nginx 如何处理剩余的路径。

nginx
  1. location ~* /back/(.*) {
  2. set $host "my.site.expample.io";
  3. # $1 就是 (.*); $is_args 是 "?"; $args 是全部 query
  4. proxy_pass https://$host/$1$is_args$args;
  5. }

关键代码解析:

  • location ~* /back/(.*) 中,(.*): 这是一个捕获组。它会匹配 /back/ 之后的所有内容(例如 api/user),并将其存储在变量 $1 中。
  • $1 代表正则捕获到的路径部分。
  • $is_args 这是一个内置变量。如果原始请求包含查询参数(即 URL 中有 ?),它的值是 ?;如果没有,它的值是空字符串。
  • $args 代表原始请求中的所有查询参数字符串(例如 id=1&name=test)。

避坑与总结

用变量拼接的路径不会自动拼接后续部分。

警惕 AI 生成的配置:在处理此类涉及 Nginx 内部匹配机制的细节问题时,许多通用大模型容易忽略这一问题,(例如 DeepSeek),从而给出看似语法正确但逻辑错误的配置。生产环境配置前,务必在测试环境中验证路径透传是否符合预期。

References

https://segmentfault.com/q/1010000039798761?utm_source=sf-similar-question

0 条评论未登录用户
Ctrl or + Enter 评论
© 2023-2025 LittleRangiferTarandus, All rights reserved.
🌸 Run