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