使用 `wget` 命令在不同的域名上对网站进行“本地”浏览

使用 `wget` 命令在不同的域名上对网站进行“本地”浏览

我需要镜像一个网站,并将副本部署到不同的域名下。镜像过程应该全部自动完成,这样我就可以定期更新副本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"

https://httpd.apache.org/docs/trunk/mod/mod_sed.html

答案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}"

它可能会起作用,或者给你一个错误,以帮助你解决实际问题。

相关内容