HTTPQUERY
日本語

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