Все,
Мы сталкиваемся со специфической проблемой.
У нас есть Tomcat 6.0.24 с интерфейсом Apache2.2.3. У нас есть порт 80 обслуживания VirtualHost и 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 ----
Tomcat добавляет дополнительный "/", поскольку он создает ответ 302 для одного из псевдонимов сервера, а не для другого, как в выводе curl ниже, когда URI не имеет завершающего "/".
Итак, вы заметите, что:
http://www.lsa.umich.edu/polisci <== возвращается с "//" в заголовке местоположения в ответном сообщении о перенаправлении 302
http://wwwprod.lsa.umich.edu/polisci <== не имеет "//" в заголовке Location 302
-------------- Вывод 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. В последнее время они не менялись.)
Цените любые мысли.
Спасибо!
Я проследил проблему до отсутствующей директивы «ProxyPreserveHost On» в LSA и II VirtualHosts. Я добавил недостающую директиву, и все работает нормально.
В документации Apache говорится:
Когда этот параметр включен, эта опция будет передавать строку Host: из входящего запроса на проксируемый хост вместо имени хоста, указанного в строке proxypass.
Обычно этот параметр должен быть отключен. Это в основном полезно в специальных конфигурациях, таких как виртуальный хостинг на основе прокси-сервера с массовым именем, где исходный заголовок Host должен быть оценен внутренним сервером.
В нашем случае мы делаем массовый виртуальный хостинг на основе имен, и эта директива отсутствует.