反向代理服务器将请求转发给内部应用程序服务器。代理服务器的HTTP_HOST
值设置为用于访问网站的主机名,例如:www.example.com
或www.alias2.com
或www.alias3.com
。
内部服务器接收对其内部IP地址的请求,因此其HTTP_HOST
值设置为:192.168.64.2
。
内部应用程序服务器如何确定原始http请求中Host:
使用了哪个域名?
可以将SERVER_NAME
配置为应用程序使用的主机名,但如果有许多不同的主机名别名可以访问该网站,我们怎么知道使用了哪一个?
查看应用程序服务器上Apache可用的所有环境变量,没有一个指示除HTTP_REFERER
之外的请求主机名(显然不能依赖它):
[HTTP_HOST] => 192.168.64.2:80
[SERVER_NAME] => 192.168.64.2
[REMOTE_ADDR] => 192.168.64.1
[SERVER_ADDR] => 172.19.0.3
[SCRIPT_URI] => http://192.168.64.2:80/index.php
[HTTP_REFERER] => http://www.example.com/prev/
我知道可以配置一些反向代理来转发原始请求中使用的主机名。我是一般性地问这个问题,因为我想知道是否有一个非特定于代理的解决方案。目前我在开发过程中使用BrowserSync作为反向代理,似乎没有办法转发http主机,无论如何,我希望能够设计我的应用程序以便它不会不依赖提供此信息的反向代理。
答案 0 :(得分:0)
过去常常通过设置非标准X-Forwarded-For
标头来解决您所寻找的问题。这已被RFC 7239中定义的Forwarded
标头取代。与您相关的部分是section 5.3。
X-Forwarded-For
已经the de-facto standard了很长时间了,对它的工具支持通常会更好。例如。 nginx通过$proxy_add_x_forwarded_for
支持它,可以方便地设置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Apache通过mod_proxy提供了类似的功能。在撰写本文时,对Forwarded
的mod_proxy_http重新归档支持an open ticket:
在接收方,apache有mod_rpaf,它会根据X-Forwarded-For
标题设置各种环境变量。
至于Browsersync:我认为你可以通过proxy.reqHeaders
指令设置所需的标题。