先给结论:静态响应与脚本渲染结果不同,通常不是迁移本身失败,而是迁移改变了服务端返回的初始 HTML、资源路径或渲染依赖。定位时先把“静态响应”当成服务端交付的原始文档,把“脚本渲染结果”当成浏览器执行 JavaScript 后的 DOM,再逐层比对二者差异出现在哪一层。下面用一个假设情境说明决策过程。
假设你把一个旧内容站迁到新主机,保留原数据库和主题,只更换了服务器与对象存储。迁移后,直接请求页面得到的 HTML 里缺少正文,只剩标题和加载占位;而用浏览器打开同一 URL,正文正常出现。此时不能直接判断“迁移导致内容丢失”,因为脚本渲染可能补回了静态响应缺失的部分。你要做的是确认差异是迁移引入的,还是原本就依赖前端补渲染。
先让两次观察尽量只差一个变量。用同一网络环境、同一浏览器无痕窗口、同一 URL 参数,分别保存静态响应和渲染后 DOM。静态响应可通过 curl -s URL 或浏览器查看源代码获得;渲染结果通过开发者工具的 Elements 面板复制。若两次请求返回的 HTML 不同,先检查 CDN 缓存、页面缓存插件和浏览器缓存。迁移后常见的情况是:新主机开启了页面缓存,旧主机没有,导致静态响应被替换成缓存版本。此时清除缓存后再取一次,若差异消失,问题在缓存层,不在渲染层。这个动作的结果会直接影响下一步:缓存差异不需要改主题,而持续存在的差异才需要继续往模板和脚本查。
把两份结果按同一层级比对,重点看三类节点:
如果静态响应缺少正文,但渲染后有正文,且资源引用都正常,说明页面本来就把正文交给前端渲染。迁移只是暴露了这个依赖,而不是制造了它。反过来,如果静态响应有正文,渲染后正文消失或被替换,则更可能是脚本执行中修改了 DOM,或新旧环境对同一接口返回了不同数据。
迁移会改变的东西有限:服务器环境、文件路径、数据库连接、对象存储地址、缓存策略、PHP 版本和可能的代理层。渲染依赖通常来自主题或插件的前端逻辑。把两者分开的方法是:在旧环境或旧备份上取同一页面的静态响应,与新环境对比。若旧环境静态响应同样缺少正文,那差异不是迁移造成的;若旧环境静态响应有正文而新环境没有,则迁移改变了服务端输出。
一个可操作的检查是临时停用新环境上的页面缓存和合并压缩类插件,再取静态响应。若正文重新出现,说明迁移后新增的优化层改变了初始 HTML。这个动作的结果会影响下一步:需要调整的是缓存或压缩配置,而不是重写前端渲染。
脚本渲染结果正常,不代表用户和抓取端都能看到同样结果。要确认渲染后的内容是否稳定:禁用 JavaScript 再打开页面,看是否仍有正文;查看渲染后的 DOM 是否包含完整文本,而不是图片或空容器。若禁用 JavaScript 后正文消失,说明该页面强依赖脚本渲染。此时要决定的是保留这种依赖,还是让服务端也输出一份可读内容。对旧内容站来说,如果正文是核心资产,通常应让静态响应包含正文,渲染只做增强;如果页面本身就是应用型界面,则要接受静态响应与渲染结果的差异,但需确保关键内容在渲染后可被稳定获取。
选一个代表性 URL,按上述顺序做一次完整对比,记录三个结果:静态响应是否含正文、渲染后是否含正文、禁用脚本后是否含正文。若三项中只有渲染后有正文,优先检查主题模板是否把正文输出交给了 JavaScript;若静态响应和渲染结果都有正文但内容不同,优先检查接口或缓存是否返回了不同版本;若两者都缺失正文,则回到数据库和模板层排查。
这个验证不承诺收录或排名结果,但它能帮你判断差异发生在服务端、缓存层还是前端渲染层。迁移后最容易被忽略的是:静态响应与脚本渲染结果不同,往往不是单一故障,而是迁移改变了某一层的默认行为。先固定对比条件,再按层排除,比直接改主题或重装插件更省时间。