代理时如何转发HTTP端口的值?

Eri*_*ich 7 proxy nginx

所以,我有一个nginx反向代理到rails服务器.rails服务器具有oauth登录,并且执行它的lib使用"X-Forwarded-Host"构建回调URL.问题是,当nginx正在侦听80以外的端口时,回调URL未正确格式化.查看配置我意识到这是因为它从'X-Forwarded-Host'构建了URL,而我使用的配置中没有包含端口.我已将配置修改为以下内容以使其工作:

server {
  listen 8081;
  server_name app;

  location / {
    proxy_pass http://app;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host:8081;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,'X-Forwarded-Host'实际定义为什么?Nginx将'Http-Host'视为主机+端口,但我发现网络周围有时X-Forwarded-Host仅被视为主机,并且似乎有一个名为'X-Forwarded-Port'的变量有时使用但我在nginx文档中找不到任何关于它的东西,除了在日志中有一个可用于打印的变量称为'proxy-port',但这是转发到的端口,而不是端口它接受了连接(对我来说没什么,因为我使用的是unix套接字).什么是正确的解决方案?Nginx不允许我手动使用X-Forwarded-Port标头,我甚至不确定是否应该这样做.看看网络,似乎其他http服务器以不同的方式处理这种情况,例如:

一些相关链接:

Tan*_*Tat -3

服务器“app”的 nginx 端口为 8081,rails 端口为 80。

这会将所有请求映射到http://app:80,并将响应标头“Location”从 更改http://app:80http://app:8081

server {
    listen 8081;
    server_name app;

    location / {
        proxy_pass http://app:80;
        proxy_redirect http://app/ http://app:8081/;
        proxy_redirect http://app:80/ http://app:8081/;
    }
}
Run Code Online (Sandbox Code Playgroud)