我可以强制apache的mod_proxy通过主机名而不是IP连接到远程服务器吗?

我将Apache2设置为远程站点的反向代理。 假设远程站点是http://app.remotesite.com 。 这是我的虚拟主机configuration的一个片段:

ProxyPass /pxy/ http://app.remotesite.com/ 

所以这应该像http://app.mysite.com/pxy/search?q=abc这样的请求,并通过http://app.remotesite.com/search?q=abc传递。

当我尝试这个时,我收到了一个“不好的请求”。 根据/var/log/apache2/error.log中的输出,它正在正确地执行代理,但是看起来好像当它连接到远程站点时,它使用其IP地址。 如果我把这个IP地址(在error.log中打印出来)做了一个请求,比如http:// [IP地址] / search?q = abc,我得到了同样的“Bad request”错误。 我的假设是远程站点正在依靠主机名正确地提供请求,但mod_proxy不会发送它。 我知道ProxyPreserveHost设置,但这是为了保留代理请求(在这种情况下,app.mysite.com),这是不是我想要的原始主机名。

任何人都可以提出一个方法来强制mod_proxy在其请求中使用远程站点的主机名? 或者,如果我的假设没有道理,请指出还有什么可能出错?

你的假设可能是不正确的。 mod_proxy使用您在代理URL中提供的主机名进行连接。

如果您使用curl在命令行上请求http://app.remotesite.com/search?q=abc ,您是否收到您期望的回复? 如果是这样,那么一个好的开始就是查看curl产生的请求和mod_proxy发送的请求之间的区别。

要查看curl在做什么,可以使用--trace-ascii <file>选项,如下所示:

 curl --trace-ascii trace.out http://app.remotesite.com/search?q=abc 

这将在trace.out中产生输出,如下所示:

 == Info: About to connect() to google.com port 80 (#0) == Info: Trying 74.125.228.8... == Info: connected == Info: Connected to google.com (74.125.228.8) port 80 (#0) => Send header, 165 bytes (0xa5) 0000: GET / HTTP/1.1 0010: User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 0050: NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2 0084: Host: google.com 0096: Accept: */* 00a3: 

从Apache获取相同的信息有点棘手, 我会使用tcpdump ,这是一个数据包捕获工具。 开始捕获像这样的数据包:

 tcpdump -w packets -s 1500 port 80 and host app.remotesite.com 

当tcpdump正在运行时,从浏览器(或curl或其他)发出请求,用^C停止tcpdump ,然后像这样检查文件:

 strings packets 

这会得到你像这样的东西:

 {GET / HTTP/1.1 User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2 Host: google.com Accept: */* 

这将显示请求的URL, Host:标题和其他有用的信息。 看看它是怎么样的,如果你没有发现明显的东西,就回到这里。