Что такое директива ProxyPassReverse?

8

Определение от apache.org гласит:

Эта директива позволяет Apache httpd настраивать URL в заголовках Location, Content-Location и URI в ответах HTTP-перенаправления. Это важно, когда Apache httpd используется в качестве обратного прокси-сервера (или шлюза), чтобы избежать обхода обратного прокси-сервера из-за перенаправлений HTTP на внутренних серверах, которые остаются за обратным прокси-сервером.

Будут переписаны только заголовки ответа HTTP, специально упомянутые выше. Apache httpd не будет перезаписывать другие заголовки ответа, а также по умолчанию не будет перезаписывать URL-ссылки внутри HTML-страниц. Это означает, что если прокси-контент содержит абсолютные URL-ссылки, они будут обходить прокси. Чтобы перезаписать содержимое HTML в соответствии с прокси-сервером, необходимо загрузить и включить mod_proxy_html.

путь - это имя локального виртуального пути; URL является частичным URL для удаленного сервера. Эти параметры используются так же, как и для директивы ProxyPass.

Может кто-нибудь, пожалуйста, объясните мне, как это работает. В целом, что делает эта директива?

SnowmanOnFire
источник

Ответы:

8

Если сервер, фактически обрабатывающий запрос, выполняет перенаправление на другой URL-адрес на этом сервере, ProxyPassReverseдиректива перезаписывает URL-адрес в терминах обратного прокси-сервера. Например, как отмечено в документации Apache , если:

 http://reverseproxy.com/mirror/foo/bar

отправлено (обратный прокси)

 http://backend.example.com/bar

для обработки, но на внутреннем сервере определяется, что должен быть правильный URL quux, то есть, что запрос должен быть перенаправлен на

 http://backend.example.com/quux

ProxyPassReverseдиректива переписывает URL (на обратный прокси - сервер) для

 http://reverseproxy.com/mirror/foo/quux

перед пересылкой ответа HTTP перенаправления клиенту. Таким образом, клиент знает только об обратном прокси-сервере, но, тем не менее, может сделать требуемый запрос на правильный URL-адрес, http://reverseproxy.com/mirror/foo/quuxкоторый затем будет перенаправлен обратным прокси-сервером на внутренний сервер и обработан как обычно. Короче говоря, он просто позволяет обратному прокси-серверу возвращать правильные заголовки URI в ответах HTTP-перенаправления.

жеребенок
источник
Непонятно, что на does a redirectсамом деле значит. Он отвечает ответом перенаправления HTTP (301/302)?
Крис Стрычински
Он ответит кодом 3xx, так как «класс кода статуса 3xx (Redirection) указывает, что пользовательский агент должен предпринять дальнейшие действия для выполнения запроса». См. RFC 7231, где обсуждается перенаправление . ProxyPassReverseДиректива просто гарантирует , что 3xx HTTP ответ содержит правильный URI в терминах обратного прокси - сервера.
Кольт
0

Из руководства обратного прокси-сервера Apache 2.4 :

Чтобы убедиться, что заголовки и Location: сгенерированные из серверной части изменены, чтобы они указывали на обратный прокси-сервер, а не обратно на себя, чаще всего требуется директива ProxyPassReverse:

ProxyPass "/" " http://www.example.com/ "

ProxyPassReverse "/" " http://www.example.com/ "

Если у вас есть клиент и 2 сервера, Proxy и Origin, где Origin выполняет реальную работу (генерирует ответ), а Proxy просто запрашивает прокси для Origin, хорошая серверная архитектура - это когда

  1. Происхождение не знает о прокси
  2. и каждый запрос проходит через прокси.

Если Origin не знает о Proxy, может случиться так, что Origin возвращает клиенту HTTP Redirect (HTTP 301 или 302) через Proxy, который указывает непосредственно на себя, Origin. И это проблема, потому что браузер напрямую свяжется с Origin в следующем раунде, что нарушит пункт 2.

Поскольку ответы HTTP-перенаправления возвращаются на Прокси-сервер к Клиенту, Прокси-сервер может / должен изменить эти Перенаправления так, чтобы Расположение все еще указывало на Прокси. Таким образом, автономное приложение, работающее на Origin, не осведомленное о прокси-сервере, может генерировать любой URL-адрес перенаправления, если прокси-сервер правильно настроен.

karatedog
источник