Tomcat 重定向问题 - 主机名后有多余的“/” - 请帮忙

Tomcat 重定向问题 - 主机名后有多余的“/” - 请帮忙

全部,

我们遇到了一个奇怪的问题。

我们有 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 行中指定的主机名。

此选项通常应关闭。它最适用于特殊配置,如基于代理批量名称的虚拟主机,其中原始主机标头需要由后端服务器评估。

在我们的案例中,我们正在进行基于名称的大规模虚拟托管,但缺少这个指令。

相关内容