访问不存在的地址,页面显示的是主题的 404 样式,状态码却是 200,curl -I 怎么看都是正常页,收录里多出几百条空地址。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,404 模板在 get_header 之前有一行空白或 BOM,输出已经开始,再用 http_response_code 设置 404 就失效,PHP 只记一条 headers already sent。状态码头一旦发出就改不了,页面内容照常渲染。
「headers already sent」这类改动最怕改一半,回滚脚本先准备好,再动生产。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
curl -sI https://example.com/no-such-page | head -3 # 期望第一行 HTTP/1.1 404 Not Found grep -rnP '^\xEF\xBB\xBF' wp-content/themes/
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,检查 404 模板和 functions.php 开头有没有空行、BOM 或多余空格;把状态码设置挪到模板最前面,在 get_header 之前调用;在主题里用 status_header(404) 包一层,避免直接调 PHP 函数;用 curl 逐个验证不存在的地址,别看浏览器渲染结果。
最后用这个标准收尾,随机不存在的地址返回 404,页面仍是主题的错误页样式,收录里不再新增这类地址。
