手上有一批十几年的纯静态老站:页面是手写的 HTML,目录里还躺着早已失联的 Flash 文件和好几套不同年代叠加的 CSS。要把整站从一台老旧机器挪到新机器,真正会出事的从来不是「搬」这个动作,而是搬完之后才发现少了半张图,或者某个还在被搜索引擎收录的老链接点开是 404。
我的做法是按下面这个顺序来,每一步都能回退。
一、先只读备份,再动手
登录旧机器后第一件事不是改配置,而是把整站打包并生成校验文件。打包用 tar,校验用 sha256,传输带校验文件一起走:
tar czf site.tar.gz -C /var/www site sha256sum site.tar.gz > site.tar.gz.sha256 scp site.tar.gz site.tar.gz.sha256 root@NEW_HOST:/root/
到了新机器先比对哈希,一致才解包。这一步的全部意义是:无论后面怎么折腾,手上永远留着一份「确定没被动过」的原件。
二、逐行校验数据,而不是只看文件个数
文件数量对得上,不代表内容对得上。我会对源和目标各跑一遍清单再比对,一条比结构,一条比内容:
find site -type f -printf '%P\n' | sort | sha256sum
find site -type f -exec sha256sum {} \; | sort -k2 | sha256sum
第一条比的是目录结构,第二条比的是每个文件的字节内容。两个哈希都一致,才算真的搬干净了。
三、旧链接一律用 301 接管
老站页面多是 .html 直出,搬到新架构后路径常常会变。凡是路径变过的,都用 301 指到新地址,不要用 302,更不要用 JS 跳转——搜索引擎只认 301 传递权重,JS 跳转在爬虫眼里约等于一张空页。规整的路径用一条 rewrite 规则批量处理,比手写几百行 location 靠谱得多。
四、上线后逐页点名复验
上线不等于完成。我会把全站 URL 列成清单,一条命令扫过去,只要不是 200 就立刻停下来查:
while read -r u; do
code=$(curl -s -o /dev/null -w '%{http_code}' "$u")
[ "$code" = "200" ] || echo "FAIL $code $u"
done < urls.txt
整个流程没有一步是聪明的,全是笨办法:先备份、再校验、旧链接用 301、最后逐页点名。老站搬迁最怕的就是想当然,把笨办法做全,反而最省事。