X-Forwarded-Host标头的实际使用情况?

时间:2013-09-29 23:10:36

标签: http proxy http-headers

我在X-Forwarded-*标题上找到了一些有趣的读物,包括Apache文档中的Reverse Proxy Request Headers部分以及Wikipedia article on X-Forwarded-For

我理解:

  • X-Forwarded-For提供连接到代理的客户端的地址
  • X-Forwarded-Port提供客户端在代理上连接的端口(例如80443
  • X-Forwarded-Proto提供客户端用于连接代理的协议(httphttps
  • X-Forwarded-Host提供客户端发送给代理的Host标头的内容。

这些都是有道理的。

但是,我仍然无法弄清X-Forwarded-Host的真实用例。我理解需要在不同的端口上重复连接或使用不同的方案,但为什么代理服务器在重复请求到目标服务器时会更改Host标头? < / p>

7 个答案:

答案 0 :(得分:22)

如果您使用Apigee之类的前端服务作为API的前端,则需要使用X-FORWARDED-HOST之类的东西来了解用于连接API的主机名,因为Apigee配置了你的后端DNS,nginx和你的应用程序堆栈只看到主机头作为你的后端DNS名称,而不是首先调用的主机名。

答案 1 :(得分:9)

我可以告诉你一个真实的生活问题,我在使用IBM门户时遇到了问题。

在我的情况下,问题是IBM门户网站有一个休息服务,它检索资源的URL,如: { “URL”: “http://internal.host.name/path”}

发生什么事了? 很简单,当您从Intranet进入时,一切正常,因为internalHostName存在但是...当用户从Internet进入时,代理无法解析主机名并且门户网站崩溃。

IBM门户的修复是读取X-FORWARDED-HOST标头,然后将响应更改为: { “URL”: “http://internet.host.name/path”}

看到我在第二个回复中放入了互联网,而不是内部。

答案 2 :(得分:8)

这是我今天工作的场景: 用户使用&#34; https://neaturl.company.com&#34;访问某些应用程序服务器指向反向代理的URL。代理然后终止SSL并重定向用户&#39;请求实际的应用程序服务器,其URL为&#34; http://192.168.1.1:5555&#34;。问题是 - 当应用服务器需要使用绝对路径将用户重定向到同一服务器上的其他页面时,它使用的是后一个URL,用户无法访问此页面。使用X-Forwarded-Host(+ X-Forwarded-Proto和X-Forwarded-Port)允许我们的代理告诉应用服务器最初使用的URL用户,因此服务器开始在其响应中生成正确的绝对路径。

在这种情况下,没有选项可以阻止应用服务器生成绝对URL,也无法为&#34; public url&#34;手动

答案 3 :(得分:3)

一个示例可能是阻止某些主机并将其重定向到外部阻止页面的代理。事实上,我几乎可以肯定我的学校过滤器会这样做......

(他们可能不会将原始Host作为Host传递的原因是因为某些服务器[Nginx?]拒绝任何错误Host的流量。)

答案 4 :(得分:3)

对于'x-forwarded-host'的需求,我可以想到一个虚拟主机场景,其中有几个内部主机(内部网络)和一个位于这些主机和互联网之间的反向代理。如果请求的主机是内部网络的一部分,则请求的主机解析为反向代理IP,Web浏览器将请求发送到反向代理。此反向代理查找相应的内部主机,并将客户端发送的请求转发给此主机。执行此操作时,反向代理会更改主机字段以匹配内部主机,并将x-forward-host设置为客户端请求的实际主机。有关反向代理的更多详细信息,请参阅此维基百科页面http://en.wikipedia.org/wiki/Reverse_proxy

查看这篇文章,了解有关x-forwarded-for标头和简单演示python脚本的详细信息,该脚本显示了Web服务器如何检测代理服务器的使用:x-forwarded-for explained

答案 5 :(得分:2)

X-Forwarded-Host刚刚救了我的命。 CDN(或反向代理,如果您想要转到&#34;树&#34;)确定用户使用的主机头使用哪个来源。因此,CDN不能使用相同的主机头来联系原点 - 否则,CDN将在循环中而不是转到原点。因此,CDN使用IP地址或一些虚拟FQDN作为主机头从源接收内容。现在,原点可能希望知道要求内容的主机头(即网站名称)是什么。就我而言,一个来源提供了2个网站。

答案 6 :(得分:0)

另一种情况是,您将应用程序许可为主机网址,然后您希望在n&gt;之间进行负载均衡。 1台服务器。