“搬家了”这三个字,放在现实生活里是搬几箱书、换一把钥匙;放在独立站点上,是一次伤筋动骨的换血。oorr.cn 这个新门牌挂上去的那一刻,笔友城堡这座以“记录美好生活”为底色的小城堡,其实同时经历着三件事:地址变了、屋子重新装修了、住进来的人也换了一批。很多站主把搬家理解成“解析改一下、文件拖过去”,结果一周后发现自己辛苦攒的搜索权重掉了一半,老读者点进来是 404,图片全裂,连自己都找不回后台。这篇东西就是把这个过程拆开讲透——从一个只有标题的搬家公告出发,还原一次完整的站点迁移该怎么做,包含域名与解析的切换节奏、301 重定向的写法与映射表、内容层的重新开张,以及我这些年踩过的、文档里不会写的坑。
它适合三类人看:正准备换域名的个人站长、想从第三方平台搬到自建站的写作者,以及维护着一个小型笔友社区、需要在不惊动读者的前提下完成底层替换的人。哪怕你只是刚起了个念头,还没买域名,也建议先把这篇存下来——搬家最贵的从来不是钱,是顺序错了之后的返工。
1. 先想清楚:这次“搬家”到底搬了什么
很多人一上手就开控制台改解析,这是最容易出事的地方。迁移不是单点操作,而是一组有先后依赖的动作。你得先把“搬的是什么”拆清楚,再决定动手顺序。我的习惯是先画一张三维图:纵向是资产层级,横向是迁移阶段,深度是回滚方案。听起来玄,其实就是问自己三个问题——哪些东西跟着走、哪些东西留在原地、万一失败怎么退回去。这三个问题的答案定了,后面每条命令才知道为什么要敲。
1.1 搬家公告背后其实是三类性质完全不同的迁移
表面上看都是“换了个地方”,实际上站点迁移至少有三种形态,处理方式差别很大。第一种是只换门牌,也就是只换域名,服务器和程序不动。这种最轻,核心工作是解析切走加 301 映射,一天能收工。第二种是换房子,服务器或主机换了,域名不变。这种的难点在于数据一致性和 DNS 生效期间的“双活”状态,你得接受一段时间内新旧两台机器都能响应。第三种是换居住方式,程序换了、内容结构重排了、栏目重新划分了,甚至是定位调整——笔友城堡从单纯的个人随笔,变成带有书信往来、长期笔友匹配属性的小社区。
三类里最容易被低估的是第三种。因为它不产生报错,不报错的东西最危险。程序迁移失败你会看到白屏,结构迁移失败你只会看到“流量慢慢变少”,等发现的时候已经过去两个月了。我的建议是:一次搬家只做一类迁移。如果你既想换域名又想换程序还想改栏目结构,那就拆成三轮,中间隔两周。折腾两周,换来的是每一轮出问题都能立刻定位到原因;一次性全上,出问题你连排查的起点都找不到。
对于 oorr.cn 这次,标题里同时出现了“搬家了”和新的站点定位“记录美好生活”,基本可以判断属于第一类叠加第三类。也就是说,解析切换反而是最简单的那一步,真正花时间的是内容层的重新组织。这个判断很重要,它决定了你的时间预算该往哪倾斜——七成精力放在内容映射和跳转规则上,三成放在服务器操作上。反过来分配,就会出现“技术上线了、读者迷路了”的尴尬。
1.2 按层级拆解资产:域名层、内容层、数据层、关系层、识别层
我把一个站点的资产分成五层,从下往上依次是域名层、数据层、内容层、关系层、识别层。搬家的本质是这五层依次平移,任何一层漏掉,最后都会以“用户体验下降”的形式暴露出来。
| 层级 | 包含内容 | 迁移难度 | 漏掉的后果 |
|---|---|---|---|
| 域名层 | 域名、DNS 记录、SSL 证书、CAA 策略 | 中 | 全站打不开或证书告警 |
| 数据层 | 数据库、上传附件、主题与插件文件、配置文件 | 高 | 页面空白、图片裂开 |
| 内容层 | 文章正文内的绝对链接、栏目结构、标签体系 | 高 | 内链全断,跳出率飙升 |
| 关系层 | 订阅源、邮件列表、留言与评论、友链 | 中 | 老读者无声流失 |
| 识别层 | 站名、Logo、二维码、名片、签名档、外部引用 | 低但繁琐 | 品牌认知割裂 |
域名层看着最简单,其实有个隐蔽的坑:CAA 记录。如果你之前给旧域名配过 CAA,只允许特定证书机构签发,换域名后新域名没配,证书申请就会失败,而报错信息往往很含糊。数据层的坑在附件路径,很多程序把图片地址以绝对 URL 的形式写进数据库,域名一换,图片全裂。内容层的坑在正文里的硬编码链接,尤其是那些手写的“参见本站另一篇”,这类链接数据库替换不一定能覆盖干净。关系层最容易被忘,一个 RSS 地址变了,订阅器里几百个读者不会有任何提示,他们只是某天开始收不到更新,然后慢慢忘了你。
1.3 一步到位还是分阶段:用三个判断条件做决策
有人喜欢一步到位,理由是不想让读者经历两次“咦怎么变了”。这个顾虑合理,但要看具体情况。我一般用三个条件来判断:第一,旧域名的外链权重占比高不高;第二,站点是否有稳定的付费或长期订阅关系;第三,内容量级是否超过手工逐条核对的上限。
如果旧域名本身就没多少外链,站点也没什么订阅关系,内容不到几百篇,那一步到位完全可行,反正损失有限。反过来,如果旧域名积累了三五年的外部引用,订阅者上百,文章上千篇,那就必须分阶段:第一阶段先把新站建好、内容同步、跳转规则跑通,旧站保持原样只加一个顶部公告;第二阶段再切解析,旧站进入只读,所有请求 301 到新站;第三阶段留一个月观察期,处理零星报错,然后旧站彻底下线。
判断标准说白了就一句话:你能不能承受“读者来了发现是废墟”这件事。能承受就快,不能承受就慢。笔友类站点尤其要慢,因为它的价值不在文章数量,而在“有人长期在写、有人长期在读”这种关系,关系断了就很难接回来。
2. 搬迁前的资产清单与备份策略
真正专业的搬家,动作大部分发生在“搬”之前。我见过太多案例,出问题的根因不是切换时手抖,而是切换前没盘点清楚,导致某个隐藏资产压根没被纳入迁移范围。这一节讲的就是怎么在动手前把家底摸干净,以及备份到底该怎么做才算数——注意,是“算数”,不是“做了”。
2.1 一张必须在动手前填完的清单
我会列一张表,左边写资产项,中间写“当前状态”,右边写“迁移后目标位置”。这张表填不满,就不要开始切解析。听起来啰嗦,但它能救你。
| 资产项 | 需要确认的细节 | 目标动作 |
|---|---|---|
| 主域名 | 到期时间、是否锁定、能否正常解析 | 新域名提前续费三年 |
| DNS 托管 | 记录条数、TTL 值、是否有泛解析 | 提前 48 小时降 TTL |
| SSL 证书 | 单域名还是泛域名、到期日 | 新证书提前签发并部署 |
| 站点程序 | 版本、依赖扩展、伪静态规则 | 新环境版本对齐 |
| 数据库 | 大小、字符集、表前缀 | 全量导出并异地留存 |
| 上传目录 | 总容量、是否有外链引用 | 整体打包,路径保持一致 |
| 主题与插件 | 是否有授权绑定域名 | 逐个确认授权可迁移 |
| 图片外链 | 是否有站外引用本站图片 | 决定是否保留旧图床 |
| 订阅源 | RSS 地址、邮件列表服务 | 配置重定向或提前公告 |
| 搜索收录 | 已收录页面数、主要入口页 | 准备改版提交 |
| 外部引用 | 友链、签名档、二维码、印刷物 | 逐条通知或替换 |
| 统计代码 | 是否有站点验证文件 | 新站重新验证 |
这张表里,“主题与插件授权绑定域名”这一条我单独提一下,因为它太容易翻车。不少商业主题和插件把授权写死在域名上,换域名后功能静默失效——不是报错,是某个模块不显示了。你在本地测试一切正常,上线后读者告诉你“评论框没了”,你回头查半天才发现是授权校验。所以买主题插件时,优先选那种支持多域名或可自助解绑的,能省掉一次搬家的大麻烦。
2.2 备份的三层结构:冷备、热备、可验证备
备份不是“导出一份 SQL 就完事”。我按三层来做。冷备是完整的、离线的、带时间戳的全量包,包括数据库、上传目录、配置文件、伪静态规则、证书文件。这个包打完要下载到本地或者另一台机器,不能只放在同一台服务器上——同机器备份等于没备份,硬盘一挂全没。
热备是迁移期间的增量同步。如果你打算让新旧两站并行一段时间,就得有一个机制把新产生的文章和评论同步过去。简单做法是迁移期间旧站进入“只读模式”,关闭评论和新投稿,这样就只需要一次性全量同步,不用处理增量。笔友类站点用这招很合适,提前三天在公告里写清楚“X 月 X 日起暂停更新,X 月 X 日新站见”,读者的接受度其实很高。
可验证备是第三层,也是最容易被跳过的一层。做法是:把备份包在一台干净的环境里完整恢复一遍,然后打开首页、打开一篇带图的文章、提交一条测试评论、登录后台。跑通了,这个备份才算合格。我个人的铁律是“没恢复过的备份,视同不存在”。见过太多次,出事之后翻出备份,发现导出时数据库连接超时被截断,或者压缩包密码忘了,那时候再补救就来不及了。
2.3 那些最容易被漏掉的隐性资产
除了显性的文件和数据库,还有一批隐性资产需要专门处理,它们不出现在任何一份“标准迁移文档”里,但少了就会难受。
第一类是散落在各处的绝对链接。文章正文里的、友链页面里的、关于页里的、甚至站点 favicon 的引用路径。第二类是二维码,印在名片上、贴纸上的那种,域名一换二维码就废了,如果印量不大,建议新域名做一条短路径跳转,旧二维码指向的地址保留至少一年。第三类是外部的身份标识:你在各种社区的个人签名、投稿时留的网址、参与活动时登记的站点地址,这些没人会通知你改,只能自己一个个去翻。
第四类是评论和留言。如果换程序,评论数据往往是最难迁的,因为不同程序的数据结构差异大。我的做法是先把评论全量导出成结构化文件留档,能自动迁就自动迁,迁不了就在新站开一个“旧日留言存档”页面,把精选内容以静态页形式保留下来。老读者看到自己几年前的留言还在,会明显安心很多。第五类是统计和验证。很多站长工具需要在站点根目录放一个验证文件,或者加一条 DNS TXT 记录,换域名后这些全要重做,别忘了。
3. 域名解析与服务器迁移的实操细节
这一节进入动手环节。我把切换过程拆成 DNS 配置、证书部署、时间节奏三块。顺序不能乱:先降 TTL,再配解析,再上证书,最后才切流量。每一步都有它必须在前面或后面的理由,我说清楚为什么,你才好在自己环境里调整。
3.1 DNS 记录怎么配,TTL 为什么要提前降
先说 TTL。TTL 是解析结果在各层缓存里存活的时间,单位秒。你改了解析,不代表全世界立刻生效,因为递归服务器和本地缓存可能还存着旧结果。所以标准动作是:在计划切换的 48 小时之前,把关键记录的 TTL 从默认的 3600 或 7200 降到 300。这样切换那一刻,最坏情况下五分钟内全球都能拿到新结果。
记录类型按需配置,常见组合如下:
| 类型 | 主机记录 | 指向 | 用途 | 备注 |
|---|---|---|---|---|
| A | @ | 新服务器 IPv4 | 主站访问 | 有 IPv6 再加 AAAA |
| AAAA | @ | 新服务器 IPv6 | 双栈访问 | 没有就省略 |
| CNAME | www | @ | 带 www 的访问 | 或直接 A 记录 |
| CNAME | static | 对象存储地址 | 静态资源 | 图片走独立域名 |
| MX | @ | 邮件服务地址 | 收信 | 优先级按服务商给的填 |
| TXT | @ | 验证字符串 | 所有权验证 | 搜索引擎、证书机构都用 |
| CAA | @ | 证书机构标识 | 限制签发方 | 不确定就留空,别乱填 |
这里有个经验:主域名和 www 的关系要提前定死,是统一跳到一个,还是两个都能访问。我倾向统一,把其中一个 301 到另一个,避免同一内容两个地址,权重被拆分。笔友城堡这种以品牌名为主的站点,建议以主域名 oorr.cn 为规范地址,www 版本全部跳过去。
还有一个细节:如果新服务器有独立 IP,优先用 A 记录直连,不要为了“以后好换 IP”而套一层 CNAME 到第三方。多一层解析就多一个故障点,排查时你会感谢自己少绕的那一圈。
3.2 HTTPS 证书与强制跳转的正确姿势
证书这块,最容易出的问题不是签不下来,而是签下来之后忘了覆盖所有子域。主域名配了,www 没配,读者从旧链接进来先看到一个证书告警,信任感立刻打折。所以要么申请泛域名证书一次性覆盖,要么把每个实际在用的子域都单独列出来逐一签发。
强制跳转的写法,Nginx 下我通常这么组织:第一段把 80 端口全部重写到 443,第二段把 www 版本重写到裸域,第三段才是站点本身的配置。顺序不能反,否则会出现跳两次甚至循环。
server { listen 80; server_name oorr.cn www.oorr.cn; return 301 https://oorr.cn$request_uri; } server { listen 443 ssl http2; server_name www.oorr.cn; ssl_certificate /path/fullchain.pem; ssl_certificate_key /path/privkey.pem; return 301 https://oorr.cn$request_uri; } server { listen 443 ssl http2; server_name oorr.cn; root /var/www/oorr; index index.php index.html; ssl_certificate /path/fullchain.pem; ssl_certificate_key /path/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; location / { try_files $uri $uri/ /index.php?$args; } }关于 HSTS,我的建议是第一次搬家别急着开,或者至少先用一个很短的 max-age 试水。因为一旦开了长期 HSTS,浏览器会强制走 HTTPS,你万一证书出问题、临时想回退到 HTTP 做排查,会发现根本回不去。等新站稳定运行一个月,再把 max-age 拉长。
3.3 切换当天的时间表与双活策略
我把切换日拆成几个节点,每个节点做什么、谁来看,提前写好。别小看这个,切换当天人是紧张的,越紧张越容易漏步骤,有张表照着做能省很多心率。
| 时间节点 | 动作 | 验证方式 |
|---|---|---|
| T-7 天 | 新站环境搭好,内容全量同步 | 本地改 hosts 访问,逐页点 |
| T-5 天 | 旧站顶部挂公告,说明搬迁时间 | 公告在首屏可见 |
| T-3 天 | 新证书部署,全站 HTTPS 可访问 | 在线检测工具查一遍 |
| T-2 天 | TTL 降到 300 | 用 dig 命令确认生效 |
| T-1 天 | 数据库再同步一次,关闭旧站评论 | 对比文章数、评论数 |
| T 日 | 切换解析,旧站开启 301 | 多地点访问测试 |
| T+1 天 | 检查日志,处理 404 | 分析访问日志的错误码 |
| T+7 天 | 提交改版,更新外部引用 | 逐条核对清单 |
“双活”的意思是切换期间新旧两台机器都能正确响应。具体做法:新站正常提供内容,旧站保留完整数据,同时在旧站的 Web 配置里加一条全局 301,把所有请求(包括深层链接)重定向到新站的对应路径。这样做的价值是:即使部分地区的 DNS 还没生效,读者访问旧域名也不会看到废墟,而是被平滑送到新站。等 T+7 观察期过了,旧站再彻底关停。
4. 301 重定向与搜索引擎权重承接
这是整篇里技术含量最高、也最容易被做歪的部分。很多人知道要做 301,但做成了“全站跳到首页”,这就等于告诉搜索引擎“我所有页面都变成同一个页面了”,权重承接效果极差,甚至会因为大量软 404 被降权。正确的做法是页面级映射,一个旧地址对应一个新地址,实在没有对应关系的,也要跳到一个语义相近的页面或者一个有引导价值的 404 页。
4.1 为什么必须是 301,而不是 302 或 JS 跳转
301 是永久重定向,语义是“这个资源已经永久搬到新地址了”。搜索引擎拿到这个信号,会把旧地址的权重、外链价值逐步转移到新地址,并把索引里的旧地址替换掉。302 是临时重定向,语义是“暂时挪一下,还会回来”,权重不会转移,旧地址会一直留在索引里。JS 跳转和 meta refresh 更差,搜索引擎虽然能识别,但传递效率低,用户端还会有一次白屏闪烁。
所以流程上,旧域名在相当长一段时间内(我一般留 6 到 12 个月)都要保持 301 状态,不能图省事直接关掉解析。有人想“旧域名到期了不续费,反正大家都用新地址了”,这是最亏的操作——旧域名一旦被释放,上面的历史外链全部归零,而且有被别人抢注做无关内容的风险,那时候受伤的是你的品牌词搜索。
4.2 Nginx 与 Apache 的映射写法
最省事的情况是路径结构完全一致,只是域名变了。Nginx 里保留一份旧域名的 server 块,整段 301 过去,$request_uri会把路径和查询参数原样带上:
server { listen 443 ssl http2; server_name old-site.example; ssl_certificate /path/old-fullchain.pem; ssl_certificate_key /path/old-privkey.pem; return 301 https://oorr.cn$request_uri; }如果路径结构变了,就得用 map 或者 rewrite 做逐条映射。用 map 更清晰,也更好维护:
map $request_uri $new_uri { default /; /old-about.html /about/; /posts/2021/letter-01.html /letters/first-letter/; /posts/2021/letter-02.html /letters/second-letter/; ~^/tag/(.*)$ /topics/$1; } server { listen 443 ssl http2; server_name old-site.example; return 301 https://oorr.cn$new_uri; }Apache 环境下用 .htaccess 也行,规则逻辑一样,只是语法不同:
RewriteEngine On RewriteCond %{HTTP_HOST} ^old-site\.example$ [NC] RewriteRule ^old-about\.html$ https://oorr.cn/about/ [R=301,L] RewriteRule ^posts/2021/letter-01\.html$ https://oorr.cn/letters/first-letter/ [R=301,L] RewriteRule ^(.*)$ https://oorr.cn/$1 [R=301,L]注意最后那条兜底规则要放在所有具体规则之后,否则会把具体规则吃掉。这个顺序问题我在第一次写的时候踩过,排查了快一个小时,日志里全是跳到了错误地址。
4.3 映射表怎么做,死链怎么兜底
映射表不是拍脑袋想的,要有数据来源。我的做法是:先从服务器访问日志里导出最近 90 天被访问过的所有路径,按访问量排序,取前 200 条;再从搜索引擎的收录列表里导出已收录地址;两份合并去重,就是需要处理的优先级列表。访问量高、有外链的排前面,一篇一篇对到新站的对应地址。
对不上的怎么办?分两种。一种是有明确语义对应的,比如旧站的文章归档页,新站有对应的合集页,直接映射过去。另一种是彻底没有对应的,比如旧站某个临时活动页,新站不做了。这种我建议跳到一个“这篇内容已归档”的引导页,页面上给出三个入口:最新文章、热门栏目、站内搜索框。别直接扔到首页,用户会觉得被糊弄。
还要准备一个像样的 404 页。404 页不是用来道歉的,是用来留人的。我的 404 页固定包含:一句人话说明、站内搜索框、五个最新文章链接、一个返回首页的按钮。数据上看,一个好的 404 页能把三分之一的误入流量留下来。
4.4 sitemap、robots 与 canonical 的同步修正
域名换了,这三样东西必须同步改,而且要在切换当天完成,不能拖。sitemap 里如果还写着旧域名,等于持续给搜索引擎发错误信号。robots.txt 里的 Sitemap 声明也要改成新地址。canonical 标签尤其关键,它告诉搜索引擎“这篇内容的规范地址是这个”,如果页面已经在新域名上、canonical 还指向旧域名,权重就会被推回旧站,白折腾一场。
站内结构化数据(文章标记、面包屑标记)里的 URL 字段同理,要全部指向新域名。检查方法很简单:随手打开三篇文章,查看源码,搜一下旧域名,如果还能搜到,说明替换没做干净。这个检查我一般会做两遍,一遍在切换当天,一遍在一周后,因为有些缓存层的模板会延迟更新。
5. 内容层的“重新开张”:公告、栏目与批量修正
技术层面的活干完,站点能打开了,但这不等于“搬家完成”。对读者来说,他们感知到的不是你换了服务器,而是“这个站的语气变了没有、我熟悉的东西还在不在、我以后还来不来”。笔友城堡这类以长期文字往来为核心的站点,这一步的重要性甚至超过技术部分,因为它的用户关系是慢慢养出来的,断一次就要重新养。
5.1 搬迁公告怎么写才不像系统通知
公告的第一原则是:说人话,别写成“系统维护通知”。我见过太多公告是“因业务调整,本站已迁移至新地址,敬请知悉”,读者看完只会觉得“哦,跟我没关系”。好的公告应该包含五件事:发生了什么、为什么、读者需要做什么、有什么没变、有问题找谁。
按这个结构写一段示例,你可以直接改成自己的版本:
笔友城堡换地址了,新门牌是 oorr.cn。
原因很简单:老地址用了太久,栏目越堆越乱,我想借这次机会把整个站重新理一遍,让它更像一座能长期住人的城堡,而不是一间堆满箱子的储藏室。
你需要做的事只有一件:把新地址存进书签,或者重新订阅一次。如果你之前是从某个固定入口进来的,那个入口可能会失效。
没变的东西:所有旧文章都迁过来了,一篇没删;留言也都还在,我花了两个晚上一条条搬的;更新频率不变,还是每周两到三篇。
如果你发现哪里打不开、哪张图裂了、哪条链接跳错了,直接在留言板说一声,我当天就会修。
这段公告的关键在“没变的东西”那一条。读者最怕的不是变化本身,而是不知道自己熟悉的东西还在不在。你主动告诉他“旧文章一篇没删”,比说十句“感谢支持”都有用。
5.2 笔友类站点的独特之处:书信、隐私与长期关系
“笔友城堡”这个名字本身带着很强的场景感:它不是一个信息流站点,而是一个靠书信体文字维系的地方。这类站点在迁移时有三条额外的注意线。
第一条是隐私边界。笔友往来内容往往带有个人生活细节,迁移过程中涉及导出、传输、导入多个环节,每一个环节都可能留下副本。我的做法是:迁移用的中间文件全部放在加密压缩包里,传完立刻删除,不留在服务器上;迁移完成后在新站后台清一遍临时账号和测试数据。这条不是技术问题,是意识问题,但恰恰最容易被忽略。
第二条是书信体的格式保真。这类内容常常有特定排版,比如日期在右上、称呼顶格、段落之间留白。换程序时,编辑器的段落处理逻辑可能不同,导入后可能出现段落被合并、空行丢失。解决办法是导入后随机抽 20 篇新旧对比,重点看空行和引用块。发现系统性丢失,就在导入脚本里加一条格式化规则,别一篇篇手改。
第三条是长期关系的承接。老读者可能已经在旧站留了三年的言,这些留言的位置、上下文、回复关系都是有意义的。如果新站只保留内容不保留结构,那些对话就断了。我建议至少保留“文章—留言”的归属关系,嵌套回复如果迁不了,就把回复内容并入留言正文,用引用的形式呈现。看着土,但有效。
5.3 站内链接与历史内容的批量修正
内容层的最后一步是批量修正硬编码链接。分两种情况处理。
数据库驱动的站点,用 SQL 做全局替换,改之前一定先备份,改之后一定抽查:
-- 先看影响范围,别急着改 SELECT COUNT(*) FROM posts WHERE content LIKE '%old-site.example%'; -- 再执行替换 UPDATE posts SET content = REPLACE(content, 'https://old-site.example', 'https://oorr.cn') WHERE content LIKE '%old-site.example%'; -- 附件表通常也要处理 UPDATE attachments SET url = REPLACE(url, 'https://old-site.example', 'https://oorr.cn') WHERE url LIKE '%old-site.example%';静态站点更简单,用命令行批量替换,但记得排除二进制文件:
grep -rl "old-site.example" ./content --include="*.md" --include="*.html" \ | xargs sed -i 's#https://old-site.example#https://oorr.cn#g'替换完的验证方法:随机抽十篇文章,检查三件事——内链能不能点开、图片能不能显示、代码块里的示例域名有没有被误伤。第三条特别容易被忽略,如果你的文章里本来就贴了别人的网址做示例,粗暴替换可能会把人家域名也改了,那就闹笑话了。所以替换规则一定要带上协议头,从https://old-site.example这种完整形式开始匹配。
6. 常见问题与排查技巧实录
到这一节,站点基本已经上线了。但上线只是开始,真正折磨人的是接下来一周的各种“明明改了却不生效”。这部分我把这些年遇到过的高频问题整理成速查表,再补充几条只在实际操作里才会领悟到的经验。
6.1 迁移后典型故障速查表
| 现象 | 最可能的原因 | 排查入口 |
|---|---|---|
| 部分地区打不开新站 | DNS 未生效或缓存未过期 | 用不同地区的解析查询工具对比 |
| 全站 502 | 后端服务未启动或端口不对 | 查 Web 服务错误日志与前段配置 |
| 首页正常,内页 404 | 伪静态规则未同步 | 检查重写规则文件是否上传 |
| 图片全部裂开 | 附件路径写死旧域名 | 查数据库附件表与页面源码 |
| 后台登录后跳回登录页 | Cookie 域设置仍为旧域名 | 查配置文件中的域名与 Cookie 参数 |
| 证书告警 | 证书未覆盖 www 或子域 | 逐个域名做证书检测 |
| 评论提交失败 | 跨域校验或接口地址未更新 | 浏览器控制台看请求地址 |
| 搜索收录数骤降 | 301 映射错误或缺 canonical | 抽查页面源码与跳转链路 |
这张表的使用方法是:先定位现象,再看最可能的原因,然后从右列入口进去。顺序别反,先查现象再猜原因,比凭印象乱改要快得多。
6.2 缓存层排查:为什么你明明改了却看不到
这是最高频的困惑,也是我花时间最多的一类问题。缓存不止一层,从外到内至少五层:浏览器缓存、CDN 边缘缓存、反向代理缓存、程序自身的页面缓存、PHP 的 opcache。你改了文件没生效,可能是五层里任何一层在作祟。
我的排查顺序是从外到内,逐层排除。先用无痕窗口打开,排除浏览器缓存;再在 CDN 控制台刷新对应 URL,排除边缘缓存;再看反向代理(如果有)的缓存开关;然后进程序后台清页面缓存;最后重启 PHP 服务清 opcache。这个顺序的逻辑是:外层的缓存最容易清、影响面最大,先排掉能快速缩小范围。
有个具体细节值得单独讲:CDN 刷新有时候只刷新了 HTML 没刷资源文件,导致你看到的是新页面配旧样式,排版乱掉。遇到这种情况,除了刷新 URL,还要把静态资源的缓存一并清掉,或者临时给资源链接加个版本参数验证一下。
6.3 几条只在实际操作里才会懂的经验
第一条:切换前一定要自己用手机流量访问一次新站。很多人只在办公室 WiFi 下测试,结果 DNS 缓存是旧的,测了半天测的是旧站。用移动网络访问,能排除本地 DNS 缓存干扰,这个动作能省掉很多自我怀疑。
第二条:迁移期间别动主题和插件。我知道你想顺手升级一下,但真的别。迁移已经是变量最多的时候,再叠加一个变量,出问题你会分不清是搬家导致的还是升级导致的。等稳定两周再说。
第三条:日志要开着,而且要看得懂。切换后头三天,我每天会花二十分钟翻访问日志,只看两样东西:404 的路径列表和 301 的跳转目标。404 列表能告诉你哪些旧链接没映射到,301 目标能告诉你有没有跳错地方。这两个数据比任何监控面板都直接。
提示:旧域名至少保持 301 状态 6 个月,期间不要关停,也不要让它变成空页面。这个时间窗口是给搜索引擎更新索引、给外部引用慢慢修正用的。
最后分享一个我自己反复用的小技巧:搬家完成后,给自己的站点做一次“陌生人测试”——假装你是一个从来没来过的人,从一个外部链接点进来,只靠站内导航找到三样东西:最新一篇文章、关于页、留言入口。如果三步之内找不到,说明导航结构有问题。这个测试比任何用户调研都便宜,也比任何自我感觉都可靠。笔友城堡这种靠“人愿意留下来写字”的地方,路径越短,留下来的人越多。