Обратный прокси-сервер Apache с использованием AJP с перенаправлением Tomcat 302

У меня совершенно нет идей по этому поводу, и я думаю, что мне нужно заручиться помощью кого-то, кто хорошо разбирается в Apache HTTPD (2.4) и Tomcat (8.5).

У меня есть веб-приложение Spring MVC 4, которое отлично работает, когда я обхожу прокси-сервер для доступа к нему, однако оно не работает, когда я перехожу через прокси-сервер и посещаю ссылку, которая приводит к перенаправлению 302.

Переходя напрямую, меня перенаправляют на правильный путь, поэтому я знаю, что это не веб-приложение, возвращающее клиенту неправильный URL-адрес. Но, проходя через прокси-сервер, я перенаправляюсь в место, которое, кажется, содержит префикс URL-адреса с путем контекста, который уже присутствует! Таким образом, он появляется дважды, и, следовательно, есть запрос на несуществующий URL!

Когда я смотрю журналы доступа Tomcat, я могу указать в качестве префикса пути 302 редиректа путь контекста - дублирующийся путь контекста!

80.229.100.100 - - [04/Mar/2017:08:07:54 +0000] "GET /ctxPath/redirect HTTP/1.1" 302 -
80.229.100.100 - - [04/Mar/2017:08:07:54 +0000] "GET /ctxPath/ctxPath/testUrl HTTP/1.1" 404 986

Это должен быть ответ Tomcat на HTTPD, который использует коннектор AJP. При прямом доступе к странице он проходит через HTTP-коннектор и работает нормально. Я обновил свою конфигурацию HTTPD, чтобы использовать HTTP-коннектор и получить тот же результат для перенаправления 302.

Как видите, каждое перенаправление приводит к ошибке 404. Нужно ли каким-то образом изменять конфигурацию Tomcat?

В настоящее время моя конфигурация HTTPD выглядит так (порт 9009 правильный, поскольку у меня несколько установок Tomcat):

ProxyPass / ajp://localhost:9009/ctxPath/
ProxyPassReverse / ajp://localhost:9009/ctxPath/
ProxyPassReverseCookiePath /ctxPath /

Что мне не хватает?


person Paul    schedule 04.03.2017    source источник


Ответы (1)


Я знаю, что это очень старый сейчас, но я решил это некоторое время назад, поэтому подумал, что стоит опубликовать свое исправление - не уверен, что это «правильный» способ, но, похоже, он выполнил свою работу за последний год!

# HTTP 302 redirects are not modified by the reverse proxy when using the AJP protocol.
# https://tomcat.apache.org/connectors-doc/common_howto/proxy.html
# Or perhaps Tomcat needs further configuration to support a proxy (See Connector config)
# When sending a redirect, the redirect URL is placed in the 'Location' HTTP response header.
# When the browser requests the page using the path in the Location header,
# the proxy will dutifully proxy the request to the backend - which prefixes the context path.
# This will cause the context path to appear twice and result in a 404.
# ProxyPassReverse would usually modify the Location HTTP header, but using AJP it
# appears no to, so take care of this ourselves by removing the context path from the
# URL in the Location header before passing it back to the client.
# Spring Security uses redirects during authentication
Header edit Location /ctxPath/(.*)$ /$1
person Paul    schedule 07.03.2018