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

Как настроить apache mod_proxy_html для работы в качестве прокси-сервера ajax?

Я пытаюсь создать веб-сайт, который позволит вам просматривать и управлять данными с любой страницы любого другого веб-сайта. Для этого мне нужно обойти 'Allow Origin'проблемы: я загружаю контент другого домена в iframe и мне нужно манипулировать его содержимым с помощью javascript, загруженного из моего домена.

Моя первая попытка состояла в том, чтобы написать простой прокси-сервер сам, запрашивая страницу других доменов через прокси-сервер, кодированный на Java, который не только обслуживает контент, но и перестраивает ссылки (src и href) в контенте, чтобы контент, на который ссылаются эти ссылки, также получал скачал через мой ручной прокси. Результат неплохой, но есть проблемы с url'ами в css и скриптах.

Тогда я понял, что mod_proxy_html должен делать именно всю эту работу. Проблема в том, что я не могу понять, как заставить его работать должным образом.

Предположим, что мой сервер работает на my-domain.com, и для прокси и преобразования контента из другого домена я бы сделал такой запрос:

my-domain.com/proxy?url=http://another-domain.com/some/content

Я бы хотел mod_proxy_html для обслуживания контента и перезаписи следующих URL-адресов в http://another-domain.com/some/content следующими способами:

  1. Абсолютные URL-адреса не из another-domain.com: без перезаписи
  2. Относительно корневых URL:/other/content -> /proxy?url=http://another-domain.com/other/content
  3. Относительные URL: other/content -> /proxy?url=http://another-domain.com/some/content/other/content
  4. Относительно родительских URL: ../other/content -> /proxy?url=http://another-domain.com/some/other/content

URL-адрес должен быть указан во время выполнения, а не во время конфигурации.

Можно ли этого добиться с помощью mod_proxy_html? Может ли кто-нибудь предоставить простую рабочую конфигурацию для начала?

ИЗМЕНИТЬ 1-Первый подход

Следующая конфигурация сайта будет работать с сайтами, которые везде используют абсолютные URL, например http://www.huffingtonpost.es/. Вы можете попробовать эту конфигурацию на localhost: http://localhost/asset/http://www.huffingtonpost.es/

<VirtualHost *:80>
    ServerName localhost

    LogLevel debug

    ProxyRequests off
    RewriteEngine On
    RewriteRule ^/asset/(.*) $1 [P]
    ProxyHTMLURLMap $1 /asset/


    <Location /asset/>
            ProxyPassReverse /
        ProxyHTMLURLMap / /asset/
    </Location>
</VirtualHost>

Но как объясняется в документация, если я попал на сайт, использующий относительные URL-адреса, я бы хотел, чтобы они были переписаны в html через mod_proxy_html. Поэтому я должен изменить Location блокировать следующим образом:

    <Location /asset/>
            ProxyPassReverse /

            #Depending on your system use one line or the other
            #Ubuntu:
            #SetOutputFilter proxy-html
            #any other system:
            ProxyHTMLEnable On 

        ProxyHTMLURLMap / /asset/
    </Location>

... что, похоже, не работает. Комментарии, подсказки и идеи приветствуются!

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

Основная проблема заключается в том, что если вы только что настроили ProxyPassReverse, вам также необходимо указать, к каким серверам вы подключаетесь. Поскольку вы хотите иметь возможность использовать это на нескольких серверах, это, мягко говоря, было бы немного больно. Итак, вот двухэтапный подход, чтобы аккуратно обойти эту проблему.

Во-первых, настройте отдельный экземпляр apache для прослушивания только 127.0.0.1 и определенного порта - в моем примере я выбрал 2323. Этот экземпляр должен быть настроен как простой прокси-сервер и не требует перезаписи. Пример:

<Proxy *>
   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1
</Proxy> 

На основном сервере настройте обратный прокси, примерно так:

<Location /proxy/>
    ProxyPass http://127.0.0.1:2323
    ProxyPreserveHost On
    ProxyHtmlEnable ON
    ProxyHtmlMap / /proxy/
</Location> 

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