没有端口的 HTTP X-Forwarded-Host 行为

HTTP X-Forwarded-Host Behavior Without Port

我发现 X-Forwarded-Host HTTP header 在端口的情况下没有很好地定义。也许这就是为什么不同的实现在涉及到这个 header 时表现不同的原因。通常,这个 header 可以包含一个端口,例如b.com:123 这很简单。但是,如果 NOT 包含端口并且服务器在 non-default 端口上 运行 怎么办?经过我的研究,我发现一些实现引入了 "non-official" X-Forwarded-Port header。

现在,我正在考虑在服务器上实现,我的想法是如果 X-Forwarded-Host header 没有端口存在,那么输出 URL 应该 而不是 也包含一个端口,即使服务器 运行 与默认端口不同(如果 X-Forwarded-Port header 不存在)。

X-Forwarded-Proto header 存在时,情况会变得更糟。

我创建了一个简单的 table 来描述我希望服务器如何运行,我的问题是:

你会同样实施吗? 声明的行为对您来说是直观的吗?提前致谢。

| # |       Request        | X-F...-Proto | X-F...-Host | X-F...-Port |      Output URL      |
|:-:|:---------------------|:------------:|:-----------:|:-----------:|:---------------------|
| 1 | http://a.com:8080/x  |     -no-     |     -no-    |    -no-     | http://a.com:8080/x  |
| 2 | http://a.com:8080/x  |    https     |     -no-    |    -no-     | https://a.com:8080/x |
| 3 | http://a.com:8080/x  |     -no-     |    b.com    |    -no-     | http://b.com/x       |
| 4 | http://a.com:8080/x  |     -no-     |  b.com:123  |    -no-     | http://b.com:123/x   |
| 5 | http://a.com:8080/x  |     -no-     |     -no-    |     123     | http://a.com:123/x   |
| 6 | http://a.com:8080/x  |     -no-     |    b.com    |     123     | http://b.com:123/x   |
| 7 | http://a.com:8080/x  |     -no-     |  b.com:123  |    -no-     | http://b.com:123/x   |
| 8 | http://a.com:8080/x  |     -no-     |  b.com:123  |     456     | http://b.com:456/x   |
| 9 | http://a.com:8080/x  |    https     |    b.com    |    -no-     | https://b.com/x      |
|10 | http://a.com:8080/x  |    https     |    b.com    |     123     | https://b.com:123/x  |
|11 | xyzz://a.com:8080/x  |     -no-     |    b.com    |    -no-     | xyzz://b.com:8080/x  |

注意#3和#9,我认为这是最棘手的。

由于到目前为止还没有答案,我问了我们公司的几个负责基础设施和网络服务器的人,他们一致认为所提出的解决方案 (table) 是正确的。这样:

  • X-Forwarded-Host 没有端口意味着 使用协议默认值 (80, 443)

如果有人对代码感兴趣 (Java) = 这里是一个 pull request (PR) to Gravitee.io API 管理平台,它修复了从使用应用程序默认端口 (8083) 到协议的行为默认端口 (80, 443) 并添加了对 X-Forwarded-Port.

的支持