101 Switching Protocols 表示服务器接受了客户端的 Upgrade 请求头。101 响应以一个空行结束,紧接着双方就会在这条连接上改用另一种协议通信。响应中必须包含 Upgrade 响应头,注明新协议的名称。
如今这几乎都是 WebSocket 握手:浏览器发送一个带有 Upgrade: websocket、Connection: Upgrade 和 Sec-WebSocket-Key 的 GET 请求,服务器返回 101 以及对应的 Sec-WebSocket-Accept,此后双方交换的就是 WebSocket 帧。101 过去也用于 h2c 升级(从明文 HTTP/1.1 升级到 HTTP/2),但这种方式现已弃用,浏览器改为在 TLS 握手期间(通过 ALPN)协商 HTTP/2 和 HTTP/3。
Upgrade 机制只存在于 HTTP/1.1 中。HTTP/2 和 HTTP/3 从不发送 101;基于这两种协议的 WebSocket 使用扩展 CONNECT(RFC 8441 和 RFC 9220)。
响应示例
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= SEO 与重定向检测
普通的页面请求永远不会得到 101。浏览器和爬虫只有在明确要求升级连接时才会收到它,因此它对索引没有任何影响。重定向检测工具发送的是普通的 GET、HEAD 或 POST 请求,不会遇到 101。如果像普通 URL 一样检测 WebSocket 端点,它通常会返回 4xx 状态码,例如 426 Upgrade Required 或 400 Bad Request。
常见原因与使用场景
- 浏览器打开 WebSocket(
new WebSocket('wss://...')),服务器接受了握手。 - 客户端请求已弃用的
h2c升级(升级到明文 HTTP/2),而服务器支持该升级。 - WebSocket 在反向代理后面无法连接,原因是代理没有转发
Upgrade和Connection请求头。在 nginx 中设置proxy_http_version 1.1,并把这两个请求头传递给后端。