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