304过程
大约 2 分钟
HTTP 304 状态码(Not Modified)是 HTTP 协议中的一个响应状态码,表示客户端请求的资源自上次请求以来未被修改,可以使用缓存版本。以下是详细的过程讲解:
1. 304 状态码的基本概念
HTTP 304 响应表示:
- 客户端之前已经获取过该资源
- 资源自上次获取后未发生修改
- 客户端可以直接使用本地缓存的版本
- 服务器不需要返回资源内容,只返回响应头
2. 304 的工作流程
客户端首次请求
GET /example.js HTTP/1.1
Host: example.com服务器首次响应
HTTP/1.1 200 OK
Content-Type: application/javascript
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Cache-Control: max-age=3600
Content-Length: 1234
[资源内容]客户端再次请求(带缓存验证头)
GET /example.js HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"服务器返回 304 响应
HTTP/1.1 304 Not Modified
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Cache-Control: max-age=36003. 涉及的主要 HTTP 头部字段
请求头字段
If-Modified-Since: 包含上次响应中的Last-Modified值If-None-Match: 包含上次响应中的ETag值
响应头字段
Last-Modified: 资源最后修改时间ETag: 资源的唯一标识符(实体标签)Cache-Control: 缓存控制指令Expires: 缓存过期时间
4. 验证机制
基于时间的验证
使用 Last-Modified 和 If-Modified-Since 头部:
- 服务器比较资源当前修改时间和请求中的时间
- 如果资源未修改,则返回 304 状态码
基于实体标签的验证
使用 ETag 和 If-None-Match 头部:
- 服务器比较资源当前 ETag 和请求中的 ETag
- 如果匹配,则返回 304 状态码
- ETag 比时间戳更精确,可以检测到秒级以下的更改
5. 优势与好处
- 节省带宽: 不需要传输资源内容,只传输响应头
- 提高响应速度: 减少了数据传输时间
- 减轻服务器负载: 服务器不需要处理完整的资源传输
- 改善用户体验: 更快的页面加载速度
6. 注意事项
- 304 响应必须不包含消息体
- 客户端需要正确实现缓存机制
- 服务器需要准确维护资源的修改时间和 ETag
- 开发者需要合理设置缓存策略以平衡性能和实时性
这个机制是 Web 性能优化的重要组成部分,有效利用可以显著提升网站性能。