没有端口的 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
.
的支持
我发现 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
.