我需要镜像一个网站,并将副本部署到不同的域名下。镜像过程应该全部自动完成,这样我就可以定期更新副本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
然后不会将这些链接转换为本地浏览,因为它们是绝对的(或者,至少,我认为这是原因)。
编辑:真正的域名是 assodigitale.it,但我需要一个无论特定域名如何都能工作的脚本,因为我也需要它用于其他几个域名。
我可以将wget
这些链接转换为新域名吗?
答案1
您的问题还有另一种解决方案。
您不需要让 wget 将这些链接转换为新域名,而是可以让您的网络服务器动态重写链接。
使用 apache,您可以使用 mod_sed 来重写链接。
例如:
添加输出过滤器 Sed html OutputSed "s/example.com/newdomain.com/g"
答案2
这可能是混合内容问题还是与使用 HTTP 和 HTTPS 协议有关?
你可能使用 HTTP 进行镜像
DOMAIN="example.com"
wget -m -p -E --tries=10 --convert-links --retry-connrefused "${DOMAIN}"
而上述要转换的 URL 都是绝对 HTTPS URL:
<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}"
它可能会起作用,或者给你一个错误,以帮助你解决实际问题。