Мне нужно отразить веб-сайт и развернуть копию под другим доменным именем. Процедура зеркалирования должна быть полностью автоматической, чтобы я мог регулярно обновлять копию с помощью cron
.
Зеркало НЕ ДОЛЖНО быть настоящим зеркалом, но оно ДОЛЖНО быть статической копией, например снимок сайта в определенное время, поэтому я думаю wget
может подойти.
На данный момент я придумал следующий скрипт для получения копии исходного сайта:
#!/bin/bash
DOMAIN="example.com"
cd /srv/mirrors
TMPDIR=$(mktemp -p . -d)
cd "${TMPDIR}"
wget -m -p -E --tries=10 --convert-links --retry-connrefused "${DOMAIN}"
cd ..
rm -rf oldcopy
mv "${DOMAIN}" oldcopy
mv "${TMPDIR}/${DOMAIN}" "${DOMAIN}"
rmdir "${TMPDIR}"
Полученная копия затем предоставляется вам Nginx под новым доменным именем с простой конфигурацией для локального статического сайта, и, похоже, она работает.
Проблема в том, что исходный сервер создает веб-страницы с абсолютными ссылками на них, даже если ссылки указывают на внутренние ресурсы. Например. страница на https://example.com/page1
содержит
<link rel="stylesheet" href="https://example.com/style.css">
<script src="https://example.com/ui.js"/>
и так далее (это WordPress). Я никак не могу изменить это поведение. wget
then не преобразует эти ссылки для локального просмотра, потому что они абсолютны (или, по крайней мере, я думаю, что это причина).
РЕДАКТИРОВАТЬ: настоящее доменное имя - assodigitale.it, хотя мне нужен скрипт, который работает независимо от конкретного домена, потому что он мне понадобится и для нескольких других доменов.
Могу я сделать wget
преобразовать эти ссылки в новое доменное имя?
Есть еще одно решение вашей проблемы.
Вместо того, чтобы заставлять wget преобразовывать эти ссылки в новое доменное имя, вы можете заставить свой веб-сервер перезаписывать ссылки на лету.
с apache вы можете использовать mod_sed для перезаписи ссылок.
например:
AddOutputFilter Sed html OutputSed "s / example.com / newdomain.com / g"
Может ли это быть проблемой смешанного содержания или иным образом связано с использованием протоколов HTTP и HTTPS?
Возможно, вы делаете зеркало с помощью HTTP
DOMAIN="example.com"
wget -m -p -E --tries=10 --convert-links --retry-connrefused "${DOMAIN}"
в то время как указанные URL-адреса для преобразования являются абсолютными URL-адресами HTTPS:
<link rel="stylesheet" href="https://example.com/style.css">
<script src="https://example.com/ui.js"/>
Преобразование ссылки - это последний этап вашей команды, и он должен показать вам строки, дающие подробную информацию о процессе преобразования. Это всего лишь пример зеркального отображения одной страницы с помощью вашей команды:
Downloaded: 177 files, 12M in 0.2s (51.0 MB/s)
Converting links in example.com/index.html... 45-2
...
Converted links in 15 files in 0.008 seconds.
Только в конце wget узнает, что было загружено, и преобразует все известные ему ссылки (из этой истории загрузок) в относительные пути к существующим файлам. Возможно, что хотя wget может получать контент с помощью HTTP, он не работает с HTTPS.
Попробуй это:
DOMAIN="example.com"
wget -m -p -E --tries=10 --convert-links --retry-connrefused https://"${DOMAIN}"
Это может либо сработать, либо выдать ошибку, которая поможет вам в решении реальной проблемы.