HTTP 状态码与缓存机制
前言
HTTP 是互联网最基础的应用层协议,状态码用于标识请求结果,缓存是前端 / 后端性能优化的核心手段。本文从分类、原理、流程、实战场景全面梳理。
一、HTTP 状态码(Status Code)
HTTP 状态码是服务端返回的 3 位数字,用来告诉客户端:本次请求发生了什么。
1.1 五大分类
- 1xx:信息类,请求正在处理
- 2xx:成功类,请求正常处理完毕
- 3xx:重定向类,需要进一步操作
- 4xx:客户端错误,请求本身有问题
- 5xx:服务端错误,服务端处理失败
1.2 高频重点状态码
2xx 成功
- 200 OK请求成功,响应体正常返回。最常见。
- 201 Created创建资源成功(POST/PUT 常用)。
- 204 No Content请求成功,但无响应体,常用于删除 / 更新接口。
3xx 重定向
- 301 Moved Permanently永久重定向,浏览器会缓存,SEO 权重转移。
- 302 Found临时重定向。
- 304 Not Modified****资源未修改,使用缓存,HTTP 缓存核心状态码。
4xx 客户端错误
- 400 Bad Request请求参数错误、格式错误。
- 401 Unauthorized未登录、Token 无效 / 过期,需要认证。
- 403 Forbidden已认证,但权限不足。
- 404 Not Found资源不存在。
- 405 Method Not Allowed请求方法不支持(如接口只支持 POST,却用 GET)。
- 429 Too Many Requests请求频率超限,限流触发。
5xx 服务端错误
- 500 Internal Server Error服务器代码异常、空指针、报错。
- 502 Bad Gateway网关错误,后端服务不可用 / 挂了。
- 503 Service Unavailable服务过载、维护中。
- 504 Gateway Timeout网关超时,后端响应太慢。
二、HTTP 缓存(性能优化核心)
HTTP 缓存是浏览器 / 代理对资源进行本地存储,避免重复请求的机制,能大幅提升速度、减轻服务器压力。
分为两大类:
- 强制缓存(不发请求,直接用)
- 协商缓存(发请求验证,再决定用不用)
2.1 强制缓存
浏览器直接使用本地缓存,不向服务器发请求。
核心字段
-
Cache-Control(HTTP/1.1 标准,优先)
max-age=31536000:缓存有效时间(秒)public:可被 CDN、代理服务器缓存private:只允许浏览器缓存(默认)no-cache:不直接使用缓存,必须走协商缓存no-store:完全不缓存(敏感数据、支付接口)
-
Expires(HTTP/1.0 旧版)绝对时间,依赖本地时钟,已不推荐。
强制缓存生效表现
控制台 Network 显示:
- 200 OK (from disk cache)
- 200 OK (from memory cache)
2.2 协商缓存
强制缓存过期后,浏览器发请求到服务器验证:资源是否更新?
两组配对响应 / 请求头
① Last-Modified / If-Modified-Since
-
服务端返回:
Last-Modified: 时间 -
浏览器下次请求带上:
If-Modified-Since: 时间 -
服务端对比:
- 没修改 → 304
- 修改了 → 200 + 新资源
② ETag / If-None-Match(优先级更高)
-
服务端返回:
ETag: "文件指纹/版本号" -
浏览器下次请求带上:
If-None-Match: "指纹" -
服务端对比:
- 一致 → 304
- 不一致 → 200 + 新资源
ETag 优势
- 更精确:基于文件内容 / 哈希,不是时间
- 1 秒内多次修改可识别
- 某些服务器文件时间不准时更可靠
2.3 完整 HTTP 缓存流程(最清晰版)
- 浏览器查看是否有缓存→ 无:请求服务端 → 200 + 缓存
- 有缓存 → 判断强制缓存是否过期→ 未过期:直接使用(200 from cache)
- 已过期 → 发送请求,走协商缓存→ 资源未修改:返回 304,使用缓存→ 资源已修改:返回 200 + 新内容
2.4 企业级实战缓存策略(通用最佳实践)
- HTML 页面
Cache-Control: no-cache每次都协商,保证内容最新。 - JS / CSS / 图片 / 字体
Cache-Control: max-age=31536000强缓存一年,配合哈希文件名(如 app.abc123.js)。 - 接口数据根据业务设置:短缓存或不缓存。
- 敏感数据 / 支付 / 登录接口
Cache-Control: no-store绝对不缓存。
三、高频问题
-
304 是什么意思?协商缓存生效,资源未修改,浏览器使用本地缓存。
-
强制缓存和协商缓存区别?强制缓存不发请求;协商缓存发请求验证。
-
no-cache 和 no-store 区别?
no-cache:走协商缓存no-store:完全不缓存
-
ETag 为什么比 Last-Modified 更好?更精确、基于文件内容、不受时间精度限制。
-
内存缓存 vs 磁盘缓存?
- memory cache:读得快,关闭浏览器消失
- disk cache:持久化,关闭浏览器还在
四、总结
- 状态码:快速定位请求成败与问题位置(200/304/401/403/404/500)。
- 强制缓存:减少请求,速度最快。
- 协商缓存:节省流量,保证资源不过时。
- 304 = 缓存生效 = 性能优化成功。