#apache #redirect #reverse-proxy #http-status-code-302
Вопрос:
Моя команда пытается настроить обратный прокси-сервер Apache с сайта клиента в одно из наших веб-приложений.
http://www.example.com/app1/some-path карты на http://internal1.example.com/some-path
Внутри нашего приложения мы используем распорки и установили redirect = true для определенных действий, чтобы обеспечить определенную функциональность. 302 сообщения о состоянии от этих перенаправлений приводят к выходу пользователя из прокси-сервера, что приводит к появлению страницы с ошибкой для конечного пользователя.
HTTP/1.1 302 Найдено местоположение: http://internal.example.com/some-path/redirect
Есть ли какой-либо способ настроить обратный прокси-сервер в apache, чтобы перенаправления работали правильно?
Ответ №1:
Существует статья под названием Запуск обратного прокси-сервера в Apache, которая, по-видимому, решает вашу проблему. Он даже использует то же самое example.com и /app1, который у вас есть в вашем примере. Перейдите в раздел «Настройка прокси» для получения примеров использования 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 / http://internal1.example.com/some-path
ProxyPassReverse / http://internal2.example.com/some-path
Я упоминаю об этом только потому, что другое стороннее приложение, которое мы проксировали, отправляло перенаправления, которые не включали их внутреннее имя хоста, просто другой порт.
В качестве заключительного замечания имейте в виду, что Firebug чрезвычайно полезен при отладке перенаправлений.
Ответ №3:
В принципе, ProxyPassReverse
следует позаботиться о переписывании заголовка местоположения для вас, как указал Кевин Хакансон.
Одна из ловушек, с которой я столкнулся, заключается в отсутствии завершающей косой черты в аргументе url. Обязательно используйте:
ProxyPassReverse / http://internal1.example.com/some-path/
(обратите внимание на косую черту!)
Ответ №4:
Попробуйте использовать соединитель AJP вместо обратного прокси-сервера. Конечно, это не тривиальное изменение, но я обнаружил, что многие кошмары с URL-адресами исчезают при использовании AJP вместо обратного прокси-сервера.
Комментарии:
1. Я потратил 3 часа, пытаясь найти надежный способ предотвращения перенаправления http для передачи https-прокси без AJP. В итоге я решил эту проблему, используя ajp вместо http в директивах ProxyPass и ProxyPassReverse.