检查301重定向在移动端与桌面端的差异,核心是分别用移动端和桌面端的用户代理请求同一个URL,对比返回的状态码、Location响应头和最终落地页。如果两端拿到不同的跳转目标或不同的状态码,说明服务器端做了UA判断、用了独立的移动站点,或者中间层缓存不一致。下面从交付结果倒推需要准备的资料、执行的步骤和验收标准。
一次完整的差异检查,交付物应当包括三样东西:一张按URL列出的对照表,记录桌面UA与移动UA各自的响应状态和跳转终点;一份差异清单,标出哪些URL两端行为不一致;一份判断说明,指出差异属于预期设计还是配置错误。没有这三样,检查就只是零散地看了几个页面,无法作为修改依据。
要产出这些结果,需要准备的资料包括:待检查的URL列表(至少覆盖首页、主要栏目页、旧域名下的典型页面)、服务器或CDN上重定向规则的存放位置、以及可修改请求头的工具。curl、浏览器开发者工具的设备模拟、以及在线HTTP头查询服务都能改UA,选一个你能重复执行的即可。
最直接的方法是用curl指定User-Agent,只看响应头,不下载正文。下面是一个可执行的例子,把其中的域名和路径替换成你要检查的实际地址:
curl -I -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15" https://example.com/old-page
curl -I -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" https://example.com/old-page
两次请求重点看三行:第一行是状态码,应当是301;Location:后面是跳转目标;如果出现Vary: User-Agent,说明服务器会按UA返回不同结果,这正是差异的高发点。把两次的Location逐字对比,包括协议、域名、路径、结尾斜杠和查询参数。任何一处不同都记为差异。
如果两端状态码不同,比如桌面返回301而移动返回302或200,这通常意味着移动端走了另一套规则。302是临时跳转,不会传递权重,如果本意是永久迁移,这就是需要修正的问题。如果移动端直接返回200,说明移动页面没有做跳转,而是原地返回了内容,需要确认这是有意的移动适配还是遗漏。
第一类:移动站独立域名导致的差异。桌面跳转到https://example.com/new-page,移动跳转到https://m.example.com/new-page。这属于设计如此,判断标准是移动站内容与桌面站是否一一对应、移动站是否也能正常返回301而不是软404。适用条件是站点确实维护了独立的移动域名;如果移动站已经废弃,这种差异就是错误,应当让移动UA也跳到统一的目标。
第二类:UA判断写错导致的差异。规则里用UA关键字匹配移动设备,但匹配串写得太宽或太窄,导致部分移动设备被当成桌面、或部分桌面浏览器被当成移动。判断方法是换两三个不同的移动UA(iOS、Android各一)再测一遍,如果同一类设备结果不一致,说明匹配规则有问题。
第三类:缓存层导致的差异。CDN或反向代理按UA分别缓存了跳转响应,旧缓存未刷新。判断方法是加一个随机查询参数再请求,绕过缓存看真实响应;如果带参数的结果与不带参数不同,差异来自缓存而非源站规则。适用条件是站点使用了CDN或页面缓存。
状态码和Location一致,不代表结果一致。还要跟到最后一跳,确认两端最终落在同一个页面上。使用curl -IL跟随跳转,观察跳转次数:超过两跳就值得记录,因为每多一跳都增加移动网络下的失败概率。如果移动端因为网络或UA问题在中间某一跳停住,用户看到的就是错误页。
落地页检查项包括:页面是否返回200、页面语言和内容是否与目标一致、canonical标签指向的URL是否与跳转目标一致。canonical指向旧地址而实际落在新地址,是常见的配置矛盾,会让搜索引擎收到互相矛盾的信号。两端canonical不一致时,以你希望被收录的那个版本为准去统一。
把上面的检查固化成一张表,每个URL一行,列为:URL、桌面状态码、桌面Location、移动状态码、移动Location、跳转次数、是否一致。验收标准是:所有本应永久迁移的URL两端都返回301,Location字符串完全相同(或移动站差异属于已确认的设计),跳转链不超过两跳,落地页canonical与跳转目标一致。
下一步动作:先挑出差异清单里状态码不一致和Location不一致的URL,回到服务器或CDN的重定向规则中定位对应条目,确认是否存在UA判断或独立的移动规则;修改后重新跑一遍同样的两次curl请求,用同一张表复核,直到两端结果收敛。