Как настроить 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 следующими способами:
- Абсолютные URL не из 
another-domain.com: не переписывать - Относительно корневых URL:
/other/content->/proxy?url=http://another-domain.com/other/content - Относительные URL: 
other/content->/proxy?url=http://another-domain.com/some/content/other/content - Относительно родительских 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, где выполняется скрипт. Опять же, обратите внимание, что это не проверено, но я думаю, что это правильное направление, чтобы начать искать.