首页 > 解决方案 > 如何将 nginx X-Forwarded-Port 配置为原始请求端口

问题描述

我在标准反向代理场景中使用 nginx,将所有请求传递/auth到另一台主机,但是我正在尝试使用非标准端口。

我的最终目标是将X-Forwarded-Port标头设置为请求进入的端口。

这是我在 nginx.conf 中的位置块:

location /auth/ {
    proxy_pass       http://otherhost:8090;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port <VAR>;
}

这个 nginx 运行在一个 docker 容器中,该容器被配置为将请求从 8085 转发到容器中的 80,这样 nginx 进程正在监听 80:

0.0.0.0:8085->80/tcp

当我点击网址时:

http://localhost:8085/auth/

我被正确重定向到http://otherhost:8090,但X-Forwarded-Port标题丢失或错误。

<VAR>原始块中,我尝试了以下方法:

可以在部署时更改我的配置以硬编码到传入请求的已知端口,但理想情况下,我可以在不更改 nginx 配置的情况下更改前端端口。

我已经搜索了 nginx 变量列表,但找不到类似$request_port. 有什么方法可以实现我的意图吗?

标签: dockernginxreverse-proxynginx-reverse-proxyx-forwarded-for

解决方案


我发现的唯一解决方法是使用map规则从http_host变量中获取端口,例如

    map $http_host $port {
      default 80;
      "~^[^\:]+:(?<p>\d+)$" $p;
    }

推荐阅读