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

Как настроить 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, чтобы она соответствовала всем вышеперечисленным соображениям?

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

Самая большая проблема с вашей идеей заключается в том, что если вы ожидаете, что обратный прокси-сервер будет отправлять файлы 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