首页 > 文章 > 开发运维 > HTTP 304是报错吗?查完状态码,还要看缓存和请求头

HTTP 304是报错吗?查完状态码,还要看缓存和请求头

HTTP状态码

点击使用相关工具

去使用

浏览器网络面板里出现304,页面却能正常显示,这两件事并不矛盾。304的英文名称是Not Modified,通常出现在缓存重新验证过程中:客户端已经有一份资源,带条件去问服务器是否需要更新,服务器判断可以继续使用已有版本,就不再发送这份资源的正文。

它不能直接翻译成“网页打不开”,也不能证明整张页面每个请求都正常。先核对这条请求的状态、地址和缓存条件,比看到一个3开头的数字就清空所有配置更有帮助。

在查询页里,304和404分别返回什么

打开HTTP状态码查询,输入304,当前只留下“304 / Not Modified / 未修改(缓存)”一行。改成404,则是“404 / Not Found / 资源不存在”。这里是查字典含义,不会向你的网站发请求,也不会诊断某个网址。

再输入30,能看到301、302、304、307、308共5条。搜索采用包含匹配,会检查数字、英文名称和中文说明,并非必须输入完整状态码。英文输入not modified也能找到304,不区分大小写;输入“缓存”同样可命中这一行。

搜索框不会自动去掉首尾空格:304 末尾多一个空格,当前就没有结果。输入999也没有结果,清空搜索才恢复全部28条。它收录的是一组常用状态,查不到不能推出某个状态码不存在或无效,更不能把空结果当作远程服务器没有响应。

把“未修改”放回一次条件请求里读

下面是一组用于理解流程的简化示例,并非查询工具发出的实际请求。假设浏览器曾获得一份样式文件,服务器同时给了它一个版本标记:

HTTP/1.1 200 OK
ETag: "style-v1"

之后浏览器需要确认这份缓存是否仍可使用,就可能发送:

GET /assets/site.css HTTP/1.1
If-None-Match: "style-v1"

如果资源仍与这个版本标记匹配,服务器可以回应304,客户端据此复用已有内容;如果资源已更新,则可能返回200并传送新正文。示例里的路径和版本名只是演示字段关系,不保证任意网站都会返回同样的响应。

RFC 9110第15.4.5节将304用于条件GET或HEAD请求。304响应本身不带资源正文,所以单看这一次响应的正文为空,并不能判断图片或脚本丢失了。它仍有响应头,也经历了网络往返;说“使用缓存”不等于这次完全没有网络通信。

不发起网络重新验证而直接采用本地缓存,与发起条件请求后收到304,是两种不同情况。排查时不要把网络面板里的“来自内存缓存”、200和304一律当成同一个过程。

页面真的坏了,先找是哪一条请求

一个页面可能同时请求HTML、CSS、JavaScript、图片和接口。某张图片304,并不能说明另一个返回404的脚本也已加载;主文档200,也不能证明所有接口都成功。先在浏览器开发者工具的Network面板重新加载,查看请求地址、方法、状态以及对应的响应头,再把选中的状态码拿来查询。

404表示服务器未找到目标资源的当前表示,或不愿透露它存在,不表示缓存核对通过。遇到静态文件404,先对照实际请求地址与部署后的路径,检查目录、文件名大小写和引用位置;不要因另有304,就把丢文件的问题解释成“正常使用缓存”。404本身也不能确定资源是暂时缺失还是永久删除。

若接口200但数据内容不符合预期,还要查看响应正文和业务字段。将合法JSON整理成容易阅读的结构时,可以用JSON格式化与校验;它能帮助检查文本结构,仍无法替代服务端日志和业务规则判断。

304需要“修复成200”吗?

资源显示正常、缓存条件正确时,没有必要仅为改变数字而关闭缓存。反过来,若部署新版本后仍看到旧内容,应核对实际请求URL、ETag或Last-Modified、响应缓存头以及中间缓存;不能只凭304一项认定具体故障。禁用缓存重载可以作为一次对照观察,但不能代替查明原因。

查询页显示的红、黄、绿是本站的分类配色,并非浏览器对业务成功与否的结论。记录“哪个URL、什么方法、什么状态、当时是否带条件请求”,往往比只截下一格状态码更能让后续排查找到对象。颜色适合扫读,诊断仍要回到具体请求。

立即使用HTTP状态码