404 not found 是 HTTP 状态码,表示服务器能收到请求,但找不到对应的资源。很多人改完重定向、伪静态或站点根目录后,看到浏览器不再报 404,就认为配置已经生效。这个判断并不可靠:页面可能被缓存、被软 404 掩盖,或只是返回了 200 却内容为空。确认配置实际生效,要看服务器返回的真实状态码和响应头,而不是只看页面外观。
浏览器和 CDN 都可能缓存旧响应。你改了 Nginx 的 try_files 或 Apache 的 .htaccess,本地看到正常,但边缘节点仍在返回旧结果。另一种情况是程序捕获了所有请求,统一输出 200 加一段“页面不存在”的提示,这就是软 404:用户看到的是错误页,搜索引擎拿到的却是成功状态。
判断时要把“可能原因”和“已经定位的原因”分开。页面打不开,可能是规则没生效,也可能是后端服务没启动、DNS 没切换、证书报错。只有拿到状态码和响应头,才能缩小范围。
命令行工具比浏览器更接近真实响应。以下命令只请求响应头,不下载正文:
curl -I https://example.com/old-page
重点看第一行和几个头字段:
HTTP/1.1 404 Not Found 还是 200 OK;Location 是否指向你配置的目标地址;Cache-Control、Age、X-Cache 是否显示命中缓存;Server 是否是你实际修改的那台服务器或网关。如果返回 301 或 302,再请求一次目标地址,确认最终落地页返回 200,且没有形成跳转链。跳转链过长会让抓取工具放弃跟随,配置看似生效,实际没到达终点。
robots.txt 的 Disallow 只限制抓取,不保证页面从索引中移除,也不等于可靠的删除手段。如果旧页面已经返回 404,再在 robots.txt 里屏蔽它,反而可能让抓取工具无法看到 404 状态,延迟移除判断。站点地图同理:提交 sitemap 不保证收录,它只是告知候选地址。
要确认某个 URL 的真实状态,应分别核查:服务器是否返回预期状态码、该状态码是否被中间层改写、robots.txt 是否允许抓取该路径。三者相互独立,不能用一个结果推断另外两个。
curl -I 请求原地址,记录状态码和 Location。curl -I "https://example.com/old-page?t=1",对比两次结果是否一致。适用条件是你能直接访问服务器或至少能发出 HTTP 请求。如果只能通过第三方面板操作,就以面板提供的响应头检测结果为准,并注意面板展示的可能是缓存副本。
状态码正确只说明这一次请求的响应符合预期,不代表所有路径都正确。批量修改规则后,应抽查若干条不同前缀的 URL,覆盖有参数、无参数、带斜杠和不带斜杠几种形式。HTTPS 能加密传输,但不代表站点没有漏洞,也不直接决定排名,它和 404 配置是否生效是两件事。
下一步:挑三条你最关心的旧地址,分别执行 curl -I 并记录状态行,再和服务器配置文件里的规则逐条对照,找出返回结果与预期不一致的那一条。