Как настроить mod_proxy_html в apache для работы в качестве 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>

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

1 ответ

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

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

Другие вопросы по тегам