Назад | Перейти на главную страницу

Проблема с перенаправлением Tomcat - лишний «/» после имени хоста - помогите, пожалуйста

Все,

Мы сталкиваемся со специфической проблемой.

У нас есть 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 должен быть оценен внутренним сервером.

В нашем случае мы делаем массовый виртуальный хостинг на основе имен, и эта директива отсутствует.