
Проблема:
Я пытаюсь настроить 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.
... но я думаю, что вы, вероятно, пытаетесь решить проблему с вероятно-неисправным дизайном. Возможно, если вы сможете подробнее объяснить проблему, которую вы пытаетесь решить этим решением, мы сможем предложить что-то более чистое.