Сообщение об ошибке Apache - Reverse Proxy и HTTP 302

Моя команда пытается настроить обратный прокси Apache с сайта клиента в одно из наших веб-приложений.

http://www.example.com/app1/some-path соответствует http://internal1.example.com/some-path

В нашем приложении мы используем struts и имеем redirect = true для определенных действий, чтобы обеспечить определенную функциональность. Сообщения о состоянии 302 из этих переадресаций приводят к выходу пользователя из прокси-сервера, что приводит к ошибке страницы для конечного пользователя.

HTTP/1.1 302 Найдено  Местоположение: http://internal.example.com/some-path/redirect

Есть ли способ настроить обратный прокси-сервер в apache, чтобы перенаправления работали правильно?

http://www.example.com/app1/some-path/redirect

Ответ 1

Существует статья под названием Запуск обратного прокси-сервера в Apache, который, похоже, решает вашу проблему. Он даже использует тот же example.com и /app 1, что и в вашем примере. Перейдите к разделу "Настройка прокси" для примеров использования ProxyPassReverse.

Ответ 2

статья AskApache весьма полезен, но на практике я нашел комбинацию правил перезаписи и ProxyPassReverse, чтобы быть более гибкими. Поэтому в вашем случае я бы сделал что-то вроде этого:

    <VirtualHost example>
       ServerName www.example.com

       ProxyPassReverse /app1/some-path/ http://internal1.example.com/some-path/
       RewriteEngine On
       RewriteRule /app1/(.*)   http://internal1.example.com/some-path$1 [P]

       ...
    </VirtualHost>

Мне нравится это лучше, потому что он дает вам более тонкий контроль над путями, которые вы проксимируете для внутреннего сервера. В нашем случае мы хотели разоблачить только часть стороннего приложения. Обратите внимание, что это не относится к жестко закодированным ссылкам в HTML, к которым относится статья AskApache.

Также обратите внимание, что вы можете иметь несколько строк ProxyPassReverse:

    ProxyPassReverse / http://internal1.example.com/some-path
    ProxyPassReverse / http://internal2.example.com/some-path

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

В качестве заключительной заметки имейте в виду, что

Ответ 3

Попробуйте использовать AJP-коннектор вместо обратного прокси-сервера. Конечно, это не тривиальное изменение, но я обнаружил, что многие кошмары URL уходят при использовании AJP вместо обратного прокси.