300 是什么
300 Multiple Choices 表示目标资源存在多个可选的表示(不同格式、语言或镜像),服务器可以在响应体或 Link 头里列出候选,让客户端选择(RFC 9110 §15.4.1)。实践中浏览器不会替用户做选择,服务器也很少主动返回它;现代做法多用内容协商(Accept 系列头)或明确的 301、302 单目标跳转。
基本信息
| 名称 | 300 Multiple Choices |
|---|---|
| 类别 | 3xx 重定向 |
| 规范 | RFC 9110 §15.4.1 |
| 响应内容 | 候选列表,放在响应体或 Link 头里 |
| 现状 | 罕见,浏览器不自动选择 |
| 替代方案 | 服务端内容协商,或明确的单目标跳转 |
典型使用场景
- 同一资源的多种格式(PDF、HTML、纯文本)由一个入口分发
- 多语言站点:列出 zh-CN、en、ja 等候选版本入口
- 归档与镜像场景:给出多个可访问的镜像地址
- 协议排障:确认「页面没跳转」是否因为收到 300 被当普通响应处理
- 接口设计评审:判断是否真的需要让客户端自行选择表示
- 老系统维护:识别只实现了 300 的遗留网关行为
响应示意
响应示意
GET /manual HTTP/1.1
HTTP/1.1 300 Multiple Choices
Link: </manual.html>; rel=alternate; type=text/html
Link: </manual.pdf>; rel=alternate; type=application/pdf
# 部分客户端支持用 Location 指定优选版本,多数客户端不做选择
# 实际观察服务端给了哪些候选
curl -si https://www.example.com/manual | grep -iE '^(HTTP|link|location)'3xx 家族怎么选
| 状态码 | 语义 | 典型用法 |
|---|---|---|
| 300 | 多个候选,可自行选择 | 多格式、多语言入口 |
| 301 | 永久搬走 | 域名或路径永久迁移 |
| 302 | 临时跳转 | 灰度发布、登录后回跳 |
| 307 与 308 | 保持方法与实体的跳转 | 需要原样重发 POST 的场景 |
301 与 302 由 Location 单点指路,300 是「多选题」,两者语义不可互换。
现代内容协商由 Accept、Accept-Language 在服务端完成,客户端拿到的仍是 200;用 300 让客户端挑反而增加实现成本。
让客户端选择意味着每个客户端都要理解候选语义,而浏览器与常见库普遍不支持,实际会退化成不可用响应。
若确实需要给用户多个选项,更常见的做法是返回一个正常的 200 选择页,而不是借用 300。