426 Upgrade Required
使い方
426 Upgrade Required ステータスコードを受け取ると、そのレスポンスには必要なプロトコルを示す Upgrade レスポンスヘッダーフィールドが含まれます。
このメッセージは、クライアントが Upgrade ヘッダーを使って行ったプロトコルアップグレードの要求への応答として送られる 101 Switching Protocols のメッセージに関連します。
SEO への影響
Google のような検索エンジンは、426 のレスポンスステータスを持つ URL をインデックスしません。このステータスコードを返す、以前にインデックスされていた URL は検索結果から削除されます。
例
クライアントが平文の HTTP でリソースを要求し、TLS が必須であるためサーバーは 426 Upgrade Required で応答します。クライアントは HTTPS に切り替え、リクエストは成功します。
HTTP/2 と HTTP/3
HTTP/2 と HTTP/3 は、Upgrade ヘッダーではなく TLS ハンドシェイク中の ALPN を通じてネゴシエートされます。平文での 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 など、受け入れ可能なプロトコルを1つ以上列挙します。
プロトコルのバージョンアップグレードの場合は、クライアントを指定されたプロトコルに切り替えてリクエストを再送信します。HTTP/2 と HTTP/3 は Upgrade ヘッダーではなく TLS ハンドシェイク中の ALPN を使います。WebSocket のような他のプロトコルでは、Connection: upgrade と対応する Upgrade ヘッダーを含めます。サーバーは 101 Switching Protocols で応答し、接続は新しいプロトコルの下で進行します。
nginx を経由する WebSocket 接続では、アップグレードのヘッダーを転送するようプロキシを設定します。
これらのディレクティブがないと、nginx は上流への接続にデフォルトで HTTP/1.0 を使い、アップグレードのヘッダーを取り除くため、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