HTTP状态码与缓存机制

5 阅读4分钟

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 缓存是浏览器 / 代理对资源进行本地存储,避免重复请求的机制,能大幅提升速度、减轻服务器压力。

分为两大类:

  1. 强制缓存(不发请求,直接用)
  2. 协商缓存(发请求验证,再决定用不用)

2.1 强制缓存

浏览器直接使用本地缓存,不向服务器发请求

核心字段

  1. Cache-Control(HTTP/1.1 标准,优先)

    • max-age=31536000:缓存有效时间(秒)
    • public:可被 CDN、代理服务器缓存
    • private:只允许浏览器缓存(默认)
    • no-cache不直接使用缓存,必须走协商缓存
    • no-store完全不缓存(敏感数据、支付接口)
  2. 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 缓存流程(最清晰版)

  1. 浏览器查看是否有缓存→ 无:请求服务端 → 200 + 缓存
  2. 有缓存 → 判断强制缓存是否过期→ 未过期:直接使用(200 from cache)
  3. 已过期 → 发送请求,走协商缓存→ 资源未修改:返回 304,使用缓存→ 资源已修改:返回 200 + 新内容

2.4 企业级实战缓存策略(通用最佳实践)

  • HTML 页面Cache-Control: no-cache每次都协商,保证内容最新。
  • JS / CSS / 图片 / 字体Cache-Control: max-age=31536000强缓存一年,配合哈希文件名(如 app.abc123.js)。
  • 接口数据根据业务设置:短缓存或不缓存。
  • 敏感数据 / 支付 / 登录接口Cache-Control: no-store绝对不缓存。

三、高频问题

  1. 304 是什么意思?协商缓存生效,资源未修改,浏览器使用本地缓存。

  2. 强制缓存和协商缓存区别?强制缓存不发请求;协商缓存发请求验证

  3. no-cache 和 no-store 区别?

    • no-cache:走协商缓存
    • no-store:完全不缓存
  4. ETag 为什么比 Last-Modified 更好?更精确、基于文件内容、不受时间精度限制。

  5. 内存缓存 vs 磁盘缓存?

    • memory cache:读得快,关闭浏览器消失
    • disk cache:持久化,关闭浏览器还在

四、总结

  • 状态码:快速定位请求成败与问题位置(200/304/401/403/404/500)。
  • 强制缓存:减少请求,速度最快。
  • 协商缓存:节省流量,保证资源不过时。
  • 304 = 缓存生效 = 性能优化成功。