Files
leetcode-go/笔试/微派 Test1/11-单选题9-Http响应头.md
T

3.7 KiB
Raw Blame History

tags, create time
tags create time
笔试
微派
HTTP
网络
Web
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 更精确(因为时间精度只有秒级)。