网站迁移并设置重定向后,如何使用 wget 创建本地镜像?
GNU Wget 默认会跟随 HTTP 重定向。这个场景还需要开启跨主机递归抓取:用 --span-hosts 允许访问其他主机,用 --domains 将抓取范围限制在新旧域名,再加上 --no-host-directories,让文件保存到同一棵本地目录树中。
以下方案适用于旧地址通过 HTTP 重定向跳转到新地址,且迁移前后 /subdirectory/ 路径结构保持一致的情况。
为什么原命令可能漏掉页面?
从 home.example.com 开始递归下载时,Wget 默认不会继续抓取页面中指向 www.example.com 的普通链接。因此,即使旧地址会重定向到新地址,Wget 也可能在请求旧地址之前就跳过该链接。
--span-hosts 允许递归访问其他主机,--domains 则限制允许抓取的域名。只设置 --domains 不会开启跨主机递归。GNU Wget 跨主机抓取说明
使用完整命令下载
在希望保存镜像的位置执行:
wget \
--mirror \
--convert-links \
--adjust-extension \
--page-requisites \
--no-parent \
--span-hosts \
--domains=home.example.com,www.example.com \
--no-host-directories \
--directory-prefix=mirror \
'https://home.example.com/subdirectory/'
新增参数的作用如下:
--span-hosts:允许跟随页面中指向旧主机的链接,随后由 Wget 处理服务器返回的重定向。--domains=home.example.com,www.example.com:将递归抓取限制在这两个域名内,避免沿外部链接继续下载。--no-host-directories:去掉本地路径中的主机名目录,让两个主机下的文件共用一棵目录树。--directory-prefix=mirror:将镜像保存到当前目录下的mirror/中。
页面路径保持不变时,预期的本地目录结构如下:
mirror/
└── subdirectory/
├── index.html
├── about.html
└── images/
└── logo.png
如果希望直接得到 mirror/index.html,可以再加上 --cut-dirs=1,去掉远程路径中的第一层 subdirectory。该参数只影响本地保存路径,不改变请求 URL 或抓取范围。GNU Wget 目录选项说明
重定向改变路径时怎么办?
如果旧地址和新地址的路径也不同,例如:
https://www.example.com/subdirectory/old-page
→ https://home.example.com/subdirectory/new-page.html
可以在上述命令中加入:
--trust-server-names
默认情况下,Wget 根据原始 URL 确定本地文件名;加入这个参数后,会改用重定向后的 URL。若迁移只更换主机名,路径完全相同,通常无需添加这一项。GNU Wget HTTP 选项说明
下载后需要检查什么?
保留起始 URL 末尾的 /。Wget 依靠它将 subdirectory/ 识别为目录,这会影响 --no-parent 的边界判断。
--convert-links 会把指向已下载目标的链接改为本地链接,未下载的目标仍可能指向线上地址。下载完成后,打开本地首页,检查旧域名链接以及图片、样式是否可离线使用。GNU Wget 手册
还需留意以下情况:
- 如果资源来自其他 CDN 域名,需要将相应域名加入
--domains。 --no-host-directories适合新旧主机表示同一站点的情况。如果两个主机的相同路径返回不同文件,可能产生本地文件名冲突;这个参数不会按内容自动去重。- 保留站内子目录即可,无需使用
--no-directories将文件全部铺平,否则不同目录中的同名文件会发生命名冲突。 - Wget 不执行 JavaScript。对于依赖脚本动态生成的链接或运行时请求的数据,这条命令不能保证完整镜像。
备注:内容仅供参考。
