我发现在端口的情况下X-Forwarded-Host
HTTP标头的定义不是很好。也许这就是为什么各种实现在此标头方面表现不同的原因。通常,此标头可以包含一个端口,例如b.com:123
很简单。但是,如果NOT包含端口并且服务器在非默认端口上运行该怎么办?经过少量研究,我发现某些实现引入了“非官方的” X-Forwarded-Port
标头。
现在,我正在考虑在服务器上实施,我的想法是,如果X-Forwarded-Host
标头不带端口,则即使服务器正在运行,输出URL也应not也包含一个端口。与默认端口不同(如果X-Forwarded-Port
标头不存在)。
X-Forwarded-Proto
标头存在时情况变得更糟。
我创建了一个简单的表来描述我希望服务器如何运行,我的问题是:
您会实施相同的方法吗?宣告的行为对您而言直观吗?预先感谢。
| # | 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。
由于到目前为止还没有答案,我请公司的一些人负责基础架构和Web服务器,他们同意提议的解决方案(表)是正确的。这样:
X-Forwarded-Host
,不带端口,表示使用协议默认设置((80,443)] >>我还将实现X-Forwarded-Port
,因此即使它不是标准标头,该解决方案也是完整的-不会伤害任何人。