Назад | Перейти на главную страницу

Какая польза от директивы ProxyPassReverse

В определении от apache.org говорится:

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

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

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

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

Если сервер фактически обрабатывает запрос, выполняет перенаправление на другой 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.

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

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

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

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

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

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

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

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