a33291
V2EX  ›  NGINX

nginx 如何获取/打印完整代理路径?

By a33291 at 2025 年 3 月 21 日 · 4035 次点击
以这个配置为例
location /test {
proxy_pass http://localhost/
}
当请求 /test/api?a=1 时 实际向上游发起的地址为 http://localhost/api?a=1
这由 nginx 的内置机制自动完成

现在,是否有 nginx 变量或者其他方案可以获取到这个 http://localhost/api?a=1 (目前是人工算的)

如果自己利用 $uri $request_uri 之类的拼接很麻烦
9 条回复    2025-03-21 14:20:38 +08:00
JohnZorn
   1
JohnZorn  
   2025 年 3 月 21 日   ❤️ 1
```conf
location /test/ {
proxy_pass http://localhost/;
proxy_set_header Host $proxy_host;
}
```
a33291
   2
a33291  
OP
   2025 年 3 月 21 日
@choice4 这个不行的,$proxy_host 不是全部路径,并且不支持规范化后的 path 输出
66z
   3
66z  
   2025 年 3 月 21 日   ❤️ 1
add herader 的功能,加上内置变量拼接应该可以,写法问下 AI
a33291
   4
a33291  
OP
   2025 年 3 月 21 日
@66z 不好弄,自带的指令能力非常有限,同时比如 proxy_pass 尾部带/和不带/区别也很明显,这些细节在自己拼接 URL 非常难受,所以想要直接拿到 nginx 完全处置完成之后的结果 path
Hanada
   5
Hanada  
   2025 年 3 月 21 日   ❤️ 1
Hanada
   6
Hanada  
   2025 年 3 月 21 日   ❤️ 1
这个靠配置是无法实现的,如果你要准确的上游 uri 的话,其他很多上游变量都需要单独导出。我主要是为了给我自己开发的上游日志模块做变量支撑才实现的: https://github.com/HanadaLee/ngx_http_upstream_log_module
a33291
   7
a33291  
OP
   2025 年 3 月 21 日
@Hanada #6 感谢大佬,请教一下 $upstream_uri 就是已经规范化之后的最终上游地址了吗?

另外这个变量貌似 openresty 还是 nginx 官方自己的 upstream 模块也输出这个变量,如果同时用的话感觉会冲突(主要是他默认版本就包含了 upstream 模块)
Hanada
   8
Hanada  
   2025 年 3 月 21 日   ❤️ 1
@a33291 $upstream_uri 是回上层的原始 URI ,也就是实际发给后端的 URI ,至于是否规范那就看你 nginx 配置了。nginx upstream 模块和 openresty 都没有这个变量,是我这个模块追加的,这个模块还包括一大堆其他变量(部分变量要配合补丁才能生效,我用 NGX_HTTP_EXT 宏注释了,没打补丁的话用不了这些模块),你可以单独抽出来做成一个独立模块。
a33291
   9
a33291  
OP
   2025 年 3 月 21 日
@Hanada #8 确实,不好意思我记错了,upstream 模块提供的是 upstream_addr 变量

我会测试一下,再次感谢
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
© 2026 V2EX · 34ms · 3.9.8.5