426 是什么
426 Upgrade Required 表示服务器要求客户端换用更高版本的协议或另一种协议再请求(RFC 9110 §15.5.22):响应通过 Upgrade 头指明期望的目标协议或版本,常见于强制 HTTPS 迁移、强制 HTTP/2,以及 API 版本切换的过渡期。
基本信息
| 名称 | 426 Upgrade Required |
|---|---|
| 类别 | 4xx |
| 规范 | RFC 9110 §15.5.22 |
| 关键头部 | Upgrade 声明目标协议,Connection: Upgrade |
| 常见场景 | 明文 HTTP 被要求改走 TLS |
| 现状 | 浏览器没有内建的自动升级行为 |
典型使用场景
- 强制 HTTPS:明文入口返回 426,明确要求走 TLS
- 协议升级过渡:要求客户端先满足 HTTP/2 的前置条件
- API 版本强制升级:老版本客户端被要求换新版本
- 排障:确认 426 响应里的 Upgrade 具体要求什么协议
- 安全基线检查:核对是否仍在明文端口暴露服务
- 客户端兼容评估:确认自家 SDK 是否能处理 426
复现与浏览器侧做法
复现与浏览器侧做法
# 明文访问被要求升级到 TLS
printf 'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: upgrade\r\nUpgrade: TLS/1.2, HTTP/1.1\r\n\r\n' | nc example.com 80
# HTTP/1.1 426 Upgrade Required
# Upgrade: TLS/1.2, HTTP/1.1
# Connection: Upgrade
# 面向浏览器的迁移更推荐跳转而不是 426
curl -sI http://example.com/ | grep -iE '^(HTTP|location)'强制升级的几种表达
| 方式 | 机制 | 适用 |
|---|---|---|
| 426 | Upgrade 头声明目标协议 | 协议级升级要求,面向 API 客户端 |
| 301 与 308 | Location 指向 https 地址 | 面向浏览器的永久迁移 |
| HSTS | 浏览器记住必须使用 HTTPS | 长期策略,需先有可用证书 |
| 302 与 307 | 临时跳转 | 灰度与调试阶段 |
浏览器对 426 没有内建的自动升级行为,面向用户的站点迁移仍应使用 301 或 308 跳转。
Connection 与 Upgrade 属于逐跳语义,代理必须显式转发,否则客户端根本看不到服务器的升级要求。
强制 HTTPS 的完整做法是「跳转加 HSTS 响应头」,426 更适合 API 与协议客户端这类能自主处理升级的场景。
在明文端口返回 426 通常只是一次性提示:真正的迁移路径是 301 跳转到 HTTPS 并同时下发 HSTS,避免用户每次访问都被拦一次。
Connection: Upgrade 只在当前连接内有效;客户端重连后若仍使用旧协议,服务器需要重复返回 426。