PAYATHON 2026

网站迁移并设置重定向后,如何使用 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。对于依赖脚本动态生成的链接或运行时请求的数据,这条命令不能保证完整镜像。

备注:内容仅供参考。