101 Switching Protocols означает, что сервер принимает заголовок запроса Upgrade, отправленный клиентом. Сразу после пустой строки, которой заканчивается ответ 101, обе стороны начинают общаться по этому соединению на другом протоколе. Ответ должен содержать заголовок Upgrade с названием нового протокола.
Сегодня это почти всегда рукопожатие WebSocket. Браузер отправляет GET с заголовками Upgrade: websocket, Connection: Upgrade и Sec-WebSocket-Key. Сервер отвечает 101 с соответствующим Sec-WebSocket-Accept, и дальше стороны обмениваются фреймами WebSocket. Раньше код 101 использовался и для перехода h2c с незашифрованного HTTP/1.1 на HTTP/2, но этот механизм устарел: теперь браузеры согласуют HTTP/2 и HTTP/3 во время TLS-рукопожатия (ALPN).
Механизм 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 не увидит. Если проверить эндпоинт WebSocket как обычный URL, он, как правило, ответит кодом 4xx, например 426 Upgrade Required или 400 Bad Request.
Типичные причины и сценарии использования
- Браузер открывает WebSocket (
new WebSocket('wss://...')), и сервер принимает рукопожатие. - Клиент запрашивает устаревший переход
h2cна незашифрованный HTTP/2, и сервер его поддерживает. - WebSocket не работает за обратным прокси, потому что прокси не передает заголовки
UpgradeиConnection. В nginx укажитеproxy_http_version 1.1и передавайте оба заголовка бэкенду.