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

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

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

我会测试一下,再次感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1120024

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX