3.7 KiB
3.7 KiB
tags, create time
| tags | create time | |||||
|---|---|---|---|---|---|---|
|
2026-05-16 15:25 |
11 - 单选题 9:HTTP 响应头
题目
一个 HTTP 响应消息中,以下哪个响应头字段用于告诉客户端(浏览器)在多久之内不需要再次请求该资源?
| 选项 | 内容 |
|---|---|
| A | Content-Length |
| B | Cache-Control: max-age=3600 |
| C | Transfer-Encoding |
| D | Content-Type |
点击查看答案与解析
✅ 正确答案:B
详细解析
各字段的含义
flowchart LR
A["HTTP Response"] --> Header["响应头 Headers"]
Header --> BL["Content-Length: 表示主体字节数"]
Header --> CC["Cache-Control: 控制缓存行为"]
Header --> TE["Transfer-Encoding: 传输编码方式"]
Header --> CT["Content-Type: 媒体类型"]
逐项分析
| 选项 | 正误 | 原因 |
|---|---|---|
| A | ❌ | Content-Length 只说明响应体的字节大小,和缓存无关 |
| B | ✅ 正确 | Cache-Control: max-age=3600 告诉浏览器:这个响应的响应体在未来 3600 秒内是新鲜的,可以直接使用本地缓存副本,无需向服务器发请求 |
| C | ❌ | Transfer-Encoding 指定了传输层的编码方式(如 chunked),用于不定长数据流式传输,与缓存无关 |
| D | ❌ | Content-Type 声明资源的媒体类型(如 text/html, application/json),让浏览器知道如何解析内容,不涉及缓存时效 |
Cache-Control 常用指令
| 指令 | 含义 |
|---|---|
max-age=N |
资源在 N 秒内被认为是新鲜的 |
no-cache |
不使用本地缓存(但可用),每次必须向服务器验证(条件请求) |
no-store |
完全不允许缓存任何形式的内容 |
public |
允许任意中间节点(CDN、代理、浏览器)缓存 |
private |
只允许浏览器缓存,不能由 CDN/代理共享 |
s-maxage=N |
只对共享缓存(如 CDN)生效,覆盖 max-age |
HTTP 缓存流程
sequenceDiagram
participant B as "浏览器 (Browser)"
participant S as "服务器 (Server)"
Note over B,S: 第一次请求
B->>S: GET /index.html
S-->>B: 200 OK + Cache-Control: max-age=3600
Note over B: 在接下来的 1小时内...
B->>B: 直接使用本地缓存! 不发请求 ✨
Note over B,S: 3600秒后
B->>S: GET /index.html (带 If-Modified-Since)
S-->>B: 304 Not Modified (无身体) ← 只返回头部确认
Note over B: 继续使用缓存并刷新计时器 ⏱️
HTTP 缓存的完整层级
graph TD
subgraph "强缓存 (不回服务器)"
BR["🌐 浏览器缓存"]
end
subgraph "协商缓存 (回服务器验证)"
CD["📡 CDN / Proxy"]
VS["🖥️ 验证服务器"]
end
BR -.->|命中 → 直接返回| DONE["✅ 200 (from disk/memory cache)"]
BR -.->|未命中 / 过期 →| CD
CD -.->|命中 → 直接返回| DONE
CD -.->|未命中 →| VS
VS -.->|304 Not Modified →| CD
CD -.->|转发给浏览器| DONE
VS -.->|200 OK + body →| CD
[!note] 区分两个容易混淆的状态码
- 200 (from memory cache): 浏览器从内存取,极快
- 200 (from disk cache): 浏览器从硬盘取,稍慢
- 304 Not Modified: 协商缓存命中,服务器说"没变",客户端继续用旧副本
[!tip] 面试常考组合
ETag+If-None-Match: 实体标签机制。服务器通过计算内容的哈希值生成 ETag,客户端下次请求时带上If-None-Match: <etag>。如果内容未变,服务器返回 304。这比Last-Modified+If-Modified-Since更精确(因为时间精度只有秒级)。