遇到的问题
假设我们需要将前端请求 /back/ 开头的路径代理到后端服务 https://my.site.expample.io/ 。
静态路径
nginx- location /back/ {
- proxy_pass https://my.site.expample.io/;
- }
结果:一切正常。当用户访问 https://your-domain.com/back/api/user?id=1 时,Nginx 会正确地将请求转发为 https://my.site.expample.io/api/user?id=1 。
变量配置
nginx- location /back/ {
- set $host "my.site.expample.io";
- proxy_pass https://$host/;
- }
结果:路径丢失。当用户访问 https://your-domain.com/back/anything 时,请求被转发到了 https://my.site.expample.io/。
正确写法
我们必须显式地告诉 Nginx 如何处理剩余的路径。
nginx- location ~* /back/(.*) {
- set $host "my.site.expample.io";
- # $1 就是 (.*); $is_args 是 "?"; $args 是全部 query
- proxy_pass https://$host/$1$is_args$args;
- }
关键代码解析:
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 评论