Apache — Обратный прокси-сервер и сообщение о состоянии HTTP 302

#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, чтобы перенаправления работали правильно?

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

Ответ №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.