Проблема:
Я пытаюсь настроить 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, чтобы она соответствовала всем вышеперечисленным соображениям?
Я знаю, что это большой вопрос - если вы можете дать ответ, который поможет мне учесть только одно из соображений, я обновлю приведенную выше конфигурацию, чтобы ее увидело сообщество.
Самая большая проблема с вашей идеей заключается в том, что если вы ожидаете, что обратный прокси-сервер будет отправлять файлы cookie на бэкэнд, но клиент не будет отправлять файлы cookie во внешний интерфейс (если только домен cookie внутреннего сервера не уступает внешнему интерфейсу).
Я бы предположил, что mod_proxy, вероятно, будет слишком сложно использовать, и в этом случае вы быстрее добьетесь своей цели с помощью mod_rewrite.
... но я думаю, что вы, вероятно, пытаетесь решить проблему с помощью неисправной конструкции. Возможно, если вы сможете подробнее прояснить проблему, которую пытаетесь решить с помощью этого решения, мы могли бы предложить что-то более понятное.
Возможно, решив это с помощью Фунт было бы проще и безопаснее. Но тогда это не перенаправление, а обратный прокси.
Также с этой задачей может справиться небольшой php-скрипт ...
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