先做一件事:把“同一地址”拆成可对照的请求条件,而不是直接比较两次看到的页面。设备差异通常来自 User-Agent 或客户端能力,登录状态差异通常来自 Cookie 或会话。你要判断的是:这些差异是页面主动输出的,还是中间层(CDN、缓存、反爬、个性化)插入的。对照时,固定一个变量、记录响应头与正文指纹,再决定是用无状态请求复现,还是用带会话请求复现。
很多对照失败,是因为把“看到的页面”当成唯一证据。对域名价值评估这类需要判断站点真实输出的场景,建议同时记录三样东西:HTTP 状态码、响应头中的缓存与变体线索、正文中稳定出现的标识文本。只比较最终渲染结果,会混入脚本执行和本地缓存的影响。
这一步的实际动作是:对同一地址发起两次请求,一次不带 Cookie、使用桌面 User-Agent,一次带目标会话、使用移动 User-Agent,保存完整响应。结果会影响下一步——若两次首字节 HTML 不同,你不需要再排查前端;若相同,才进入渲染层对照。
适合判断“地址本身对不同设备是否返回不同内容”。代价是:你无法看到登录后才出现的内容,也可能被反爬策略拦截,导致误判为内容差异。成立条件是你能控制请求头,并且目标页面不强制依赖会话。
适合判断“登录状态是否改变同一地址的输出”。代价是:会话可能过期、可能绑定设备指纹,复制到另一环境后失效。成立条件是你能合法取得一个测试账号,并确认会话在两次请求间保持有效。若会话失效,你看到的差异可能只是登录页与内容页的差异,而不是个性化差异。
选择依据可以简化为一句:先问差异是否只在登录后出现。如果否,用无状态请求;如果是,用带会话请求,并额外记录会话标识的变化。两种路径都成立时,优先无状态,因为它更容易复现和交接。
假设你手上有两个响应:A 来自桌面浏览器未登录,B 来自移动浏览器已登录。两者正文都包含同一段核心文本,但 B 多出一段推荐模块。此时有三种合理解释:服务端按会话输出、前端按登录态渲染、中间层按设备注入。区分方法如下:
Vary,若包含 Cookie 或 User-Agent,说明缓存层认为这些请求头会改变响应。注意,Vary 只是线索,不是结论。它可能过度声明,也可能被中间层忽略。抓取量或某次请求返回空内容,也不能单独证明处理正确——缓存未命中、限流、会话过期都会造成同样现象。
完成上述对照后,你会得到一张条件表:哪些请求头或会话状态会改变输出。接下来按目的决定动作。
一个可执行的短例子:假设某地址在未登录时返回通用介绍,登录后返回带账户摘要的版本。你先用无状态请求确认通用版本稳定,再用带会话请求确认账户摘要只在会话有效时出现。若账户摘要也出现在无状态请求中,说明它被缓存或错误地公开输出,这时应优先检查缓存键是否包含会话标识,而不是继续比较设备差异。
第一,把 CDN 缓存命中当成服务端分流。两者都会让同一地址返回不同内容,但缓存差异通常随时间或节点变化,服务端分流则与请求头或会话稳定相关。第二,把前端渲染差异当成 SEO 差异。搜索引擎处理 JavaScript 的能力因引擎而异,必须分别核查,不能用一个引擎的结果推断另一个。第三,把 HTTPS 当成内容一致性的保证。HTTPS 不保证安全无漏洞,也不保证不同设备返回相同内容。
因此,对照的终点不是“哪个版本正确”,而是“在什么条件下返回什么内容”。把这个条件写清楚,后续的评估、修复或交接才有可复查的依据。若你无法复现某个条件,先记录缺失的变量,而不是直接下结论。