426 Upgrade Required
Применение
При получении кода состояния 426 Upgrade Required ответ содержит поле заголовка ответа Upgrade, указывающее требуемый протокол (или протоколы).
Это сообщение связано с сообщением 101 Switching Protocols, которое отправляется в ответ на запрос обновления протокола, сделанный клиентом с помощью заголовка Upgrade.
Влияние на SEO
Поисковые системы, такие как Google, не будут индексировать URL со статусом ответа 426. Ранее проиндексированные URL, которые возвращают этот код состояния, будут удалены из результатов поиска.
Пример
Клиент запрашивает ресурс по открытому HTTP, и сервер отвечает 426 Upgrade Required, поскольку использование TLS обязательно. Клиент переключается на HTTPS, и запрос выполняется успешно.
HTTP/2 и HTTP/3
HTTP/2 и HTTP/3 согласуются через ALPN во время TLS-рукопожатия, а не через заголовок Upgrade. Механизм обновления до HTTP/2 в открытом виде (h2c) был удалён из спецификации. Заголовок Upgrade применяется к переключениям протокола, таким как TLS и WebSocket.
Первоначальный запрос
GET /tech-news HTTP/1.1
Host: example.com
Первоначальный ответ
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.2
Connection: upgrade
Content-Type: text/html
Content-Length: 140
<html>
<head>
<title>TLS Required</title>
</head>
<body>
<p>This service requires TLS.</p>
</body>
</html>
Последующий запрос по HTTPS
GET /tech-news HTTP/1.1
Host: example.com
Ответ
HTTP/1.1 200 OK
Content-Type: text/html
Как исправить
Прочитайте заголовок Upgrade в ответе, чтобы определить требуемый протокол. Сервер перечисляет один или несколько приемлемых протоколов, например TLS/1.2, HTTP/2, HTTP/3 или websocket.
Для обновления версии протокола переключите клиент на указанный протокол и отправьте запрос заново. HTTP/2 и HTTP/3 используют ALPN во время TLS-рукопожатия, а не заголовок Upgrade. Для других протоколов, таких как WebSocket, добавьте Connection: upgrade и соответствующий заголовок Upgrade. Сервер отвечает 101 Switching Protocols, и соединение продолжается по новому протоколу.
Для WebSocket-соединений через nginx настройте прокси на пересылку заголовков upgrade:
Без этих директив nginx по умолчанию использует HTTP/1.0 для соединений с вышестоящим сервером и отбрасывает заголовки upgrade, из-за чего при каждой попытке WebSocket-рукопожатия возвращается 426.
Когда сервер требует HTTPS, измените схему URL запроса с http:// на https://. Убедитесь, что в клиенте или среде выполнения включён TLS 1.2 или TLS 1.3. Более старые версии TLS обычно отвергаются.
Обновите клиентские библиотеки и SDK, если они не поддерживают требуемый протокол. Устаревшие HTTP-библиотеки по умолчанию используют HTTP/1.1 и не умеют согласовывать HTTP/2 или HTTP/3.
Удалите ненужные заголовки Upgrade из запросов, не предназначенных для переключения протокола. Некоторые прокси трактуют случайно оставшийся заголовок Upgrade как попытку согласования протокола и возвращают 426.
Примеры кода
.NET
HttpStatusCode.UpgradeRequired
Rust
http::StatusCode::UPGRADE_REQUIRED
Rails
:upgrade_required
Go
http.StatusUpgradeRequired
Symfony
Response::HTTP_UPGRADE_REQUIRED
Python3.5+
http.HTTPStatus.UPGRADE_REQUIRED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_UPGRADE_REQUIRED
Angular
@angular/common/http/HttpStatusCode.UpgradeRequired