Как настроить Apache как обратный прокси-сервер с удаленным сервером, указанным в параметре строки запроса

Как настроить Apache как обратный прокси-сервер с удаленным сервером, указанным в параметре строки запроса

Проблема:
Я пытаюсь настроить Apache как обратный прокси-сервер, где сервер удаления указывается в параметре строки запроса.

Допустим, я обслуживаю сайт mywebapp.com. Если вы перешли наhttp://mywebapp.com/proxy?url=http://www.someothersite.com, то Apache должен действовать как обратный прокси-сервер дляhttp://www.someothersite.com. Аналогично, если вы перешли наhttp://mywebapp.com/proxy?url=https://login.notmysite.com, то Apache должен действовать как обратный прокси-сервер дляhttps://login.notmysite.com.

Соображения:
1. Перепишите относительные URL в html ответа, чтобы они проходили через прокси
2. Перепишите ответы перенаправления с удаленного сервера. Например, если пользователь запрашивает mywebapp.com/proxy?url=https://login.notmysite.comи удаленный сервер отвечает перенаправлением наhttps://login.notmysite.com/, то браузер пользователя должен увидеть перенаправление на mywebapp.com/proxy?url=https://login.notmysite.com/.
3. Поддержка http и https
4. Поддержка cookie-файлов
5. Разумная безопасность. Я не хочу открывать прокси-сервер для использования кем-либо в мире — его следует использовать только в iframe на сайте, размещенном на mywebapp.com.

Среда:
Я использую Apache 2.2.24, но могу обновиться, если это упростит решение проблемы.

Текущая конфигурация:

<VirtualHost 127.0.0.1:8081>
    ServerName www.mywebapp.com
    SSLProxyEngine On

    RewriteEngine on
    RewriteCond %{QUERY_STRING} ^url=(.*)$
    RewriteRule ^/proxy - [E=url:%1]

    RewriteCond %{QUERY_STRING} ^url=(https?://[^:/]+)/?
    RewriteRule ^/proxy - [E=url_host:%1]

    RewriteCond %{QUERY_STRING} ^url=(.*)$
    RewriteRule ^/proxy                %1   [P]

    ProxyPassInterpolateEnv On
    ProxyPassReverse /proxy/ ${url_host} interpolate

    <Location /proxy>
        ProxyHTMLEnable On
        ProxyHTMLInterp On
        ProxyHTMLURLMap /   ${url_host}/ V
        RequestHeader   unset   Accept-Encoding
    </Location>
</VirtualHost>

Эта конфигурация, похоже, работает правильно для соображения № 1, но я столкнулся с препятствием с соображением № 2. Я знаю, что вы обычно обрабатываете перенаправления с помощью команды ProxyPassReverse, но я не уверен, как заставить ее переписать параметр строки запроса.

Вопросы:
Учитывая вышеизложенное, является ли Apache подходящим инструментом для решения этой проблемы?
Если да, то как настроить конфигурацию для apache, чтобы она соответствовала всем вышеизложенным соображениям?

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

решение1

mod_headers, возможно, справится с этой задачей.

Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"

Для этой exprчасти требуется Apache 2.4.

Примечание: я это не проверял.

Использованная литература:

http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html

решение2

Может быть, решить это с помощьюФунтбыло бы проще и безопаснее. Но тогда это не перенаправление, а обратный прокси.

Также небольшой PHP-скрипт тоже мог бы справиться с этой задачей...

решение3

Самая большая проблема с вашей идеей заключается в том, что если вы ожидаете, что обратный прокси-сервер будет отправлять файлы cookie на бэкэнд, но клиент не будет отправлять файлы cookie на фронтэнд (если только домен файлов cookie бэкэнда не ниже домена файлов cookie фронтэнда).

Я бы предположил, что mod_proxy, скорее всего, будет слишком сложен в использовании, и в этом случае вы быстрее достигнете своей цели с помощью mod_rewrite.

... но я думаю, что вы, вероятно, пытаетесь решить проблему с вероятно-неисправным дизайном. Возможно, если вы сможете подробнее объяснить проблему, которую вы пытаетесь решить этим решением, мы сможем предложить что-то более чистое.

Связанный контент