结论先说:如果你看到404页面,先不要急着改服务器配置或重发内容。缓存造成的假象,是指浏览器、CDN或反向代理把旧的404响应保存下来,后续请求没到源站就被拦截返回。排除办法是绕过缓存直接验证源站响应,再逐层对比缓存层与源站的结果。适用前提是你已经确认这个地址在源站应该存在,且近期改过路由、重定向或发布过新文件。
缓存造成的404通常有几个可观察特征。第一,同一地址用无痕窗口能打开,正常窗口仍然404。第二,清除浏览器缓存后短暂恢复,过一会儿又变回404。第三,源站日志里没有这次404请求的记录,说明请求根本没到源站。
这些只是可能原因,不能凭单一现象断言。要定位到具体哪一层,需要下面逐层验证。
最直接的办法是直接请求源站,跳过CDN和代理。如果你能拿到源站IP,用curl指定解析地址:
curl -I -H "Host: 你的域名" http://源站IP/出问题的路径
看返回的状态码。源站返回200,而通过域名访问返回404,问题就在缓存层或代理层。源站本身也返回404,那就不是缓存假象,要查路由、文件是否存在或重写规则。
如果拿不到源站IP,可以在请求头里加禁用缓存的字段试探:
curl -I -H "Cache-Control: no-cache" -H "Pragma: no-cache" https://你的域名/路径
注意,no-cache只是建议,CDN是否遵守取决于它的配置,返回404不代表源站也404。这一步只能作为参考,最终仍要以直连源站的结果为准。
确认是缓存问题后,按从近到远的顺序清理,每清一层就复测一次,才能知道是哪一层在起作用。
每步之后记录返回状态码和响应头。响应头里的Age大于0,说明命中了缓存;X-Cache、CF-Cache-Status等字段能告诉你是否命中CDN缓存。这些字段名因服务商而异,以你实际使用的服务为准。
清理完成后,合格的验收信号是:直连源站和通过域名访问返回一致的状态码;多次刷新结果稳定;响应头里不再出现异常的缓存命中标记;源站日志能看到对应请求。
几个常见误区需要避开。robots.txt的抓取限制不等于索引移除,也不影响缓存层是否返回404,别把它当成清缓存的手段。站点地图不保证收录,和404缓存假象是两回事。另外,HTTPS不保证内容一定是最新的,它只管传输加密,缓存问题照样存在。
如果清完所有缓存层仍然404,而源站直连正常,那问题可能在DNS解析、负载均衡转发或某个中间代理,需要继续往上游排查,而不是反复清浏览器缓存。
下一步:拿一个出问题的具体URL,按“直连源站—加no-cache请求—无痕窗口—CDN刷新”的顺序各测一次,记录每次的状态码和响应头,就能判断假象出在哪一层。