全部,
我们遇到了一个奇怪的问题。
我们有 Tomcat 6.0.24,前端是 Apache2.2.3。我们有一个 VirtualHost 服务端口 80 和一个 ServerAlias。Apache 只是将“/”交给 Tomcat 的负载均衡器。
---------httpd.conf 片段:--------
<VirtualHost *:80>
ServerName wwwprod.lsa.umich.edu
ServerAlias wwwprod www www.lsa.umich.edu
Redirect / balancer://dsmdelivery/
ProxyPass / balancer://dsmdelivery/
ProxyPassReverse / balancer://dsmdelivery/
TraceEnable Off
</VirtualHost>
------------httpd.conf 代码片段结束----
当 URI 没有尾随“/”时,Tomcat 会添加一个额外的“/”,因为它会为其中一个服务器别名创建 302 响应,而不会为另一个服务器别名创建 302 响应(如下面的 curl 输出所示),
因此你会注意到:
http://www.lsa.umich.edu/polisci <== 在 302 重定向响应消息的 Location Header 中返回“//”
http://wwwprod.lsa.umich.edu/polisci <== 302 的 Location 标头中没有“//”
-------------- 两个虚拟主机的 Curl 输出:-------------
$ curl -v http://wwwprod.lsa.umich.edu/polisci
* About to connect() to wwwprod.lsa.umich.edu port 80 (#0)
* Trying 141.211.177.191... connected
* Connected to wwwprod.lsa.umich.edu (141.211.177.191) port 80 (#0)
GET /polisci HTTP/1.1
User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
Host: wwwprod.lsa.umich.edu
Accept: */*
< HTTP/1.1 302 Moved Temporarily < Server: Apache-Coyote/1.1
< Location: http://wwwprod.lsa.umich.edu/polisci/
< Transfer-Encoding: chunked
< Date: Tue, 13 Sep 2011 20:28:29 GMT
<
* Connection #0 to host wwwprod.lsa.umich.edu left intact
* Closing connection #0
$
$
$ curl -v http://www.lsa.umich.edu/polisci
* About to connect() to www.lsa.umich.edu port 80 (#0)
* Trying 141.211.177.203... connected
* Connected to www.lsa.umich.edu (141.211.177.203) port 80 (#0)
GET /polisci HTTP/1.1
User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
Host: www.lsa.umich.edu
Accept: */*
< HTTP/1.1 302 Moved Temporarily < Date: Tue, 13 Sep 2011 20:28:47 GMT
< Server: Apache-Coyote/1.1
< Location: http://www.lsa.umich.edu//polisci/
< Content-Length: 0
< X-Cnection: close
< Content-Type: text/plain; charset=UTF-8
< Set-Cookie: BIGipServerlsa-cmsproddlv_pool=3232879501.20480.0000; path=/
<
* Connection #0 to host www.lsa.umich.edu left intact
* Closing connection #0
请注意上面第二个输出中的“//”。这导致链接中断。
(两个虚拟主机都在 F5 上定义了一个虚拟服务器。“www.lsa.umich.edu”虚拟服务器附加了 iRules。这些最近没有改变。)
欢迎提出任何想法。
谢谢!
答案1
我追踪到问题出在 LSA 和 II VirtualHosts 上缺少“ProxyPreserveHost On”指令。我添加了缺少的指令,一切正常。
Apache 文档说:
启用后,此选项将把传入请求的 Host: 行传递到代理主机,而不是 proxypass 行中指定的主机名。
此选项通常应关闭。它最适用于特殊配置,如基于代理批量名称的虚拟主机,其中原始主机标头需要由后端服务器评估。
在我们的案例中,我们正在进行基于名称的大规模虚拟托管,但缺少这个指令。