431 Request Header Fields Too Large
使い方
431 Request Header Fields Too Large ステータスコードは、HTTP ヘッダーで指定されたデータが多すぎるため、サーバーがその HTTP リクエストの処理を拒否していることを示します。
サーバーによって、これは HTTP ヘッダー全体の長さの合計を指す場合と、特定のヘッダーを指す場合があります。いずれの場合も、クライアントは1つ以上の HTTP ヘッダーを削除してリクエストを再試行できます。HTTP ヘッダーの量を抑える方法の1つは、送信するクッキーを削るか減らすことです。
SEO への影響
Google のような検索エンジンは、431 のレスポンスステータスを持つ URL をインデックスしません。このステータスコードを返す、以前にインデックスされていた URL は検索結果から削除されます。
例
クライアントがリソースを要求し、2つの大きなクッキー値の組み合わせが HTTP ヘッダーについてサーバーが設定した上限を超えているため、サーバーは 431 Request Header Fields Too Large で応答します。
リクエスト
GET /tech-news HTTP/1.1
Host: example.com
Cookie: first_cookie=<very_long>; second_cookie=<long_again>
レスポンス
HTTP/1.1 431 Request Header Fields Too Large
Content-Type: text/html
Content-Length: 183
<html>
<head>
<title>Request Headers Too Long</title>
</head>
<body>
<p>The request headers are too long.
Try retrying without cookies.</p>
</body>
</html>
対処方法
ブラウザで該当ドメインのクッキーを消去します。クッキーの蓄積が最も頻繁な原因です。サードパーティのスクリプト、アナリティクスのタグ、マーケティングのピクセルが訪問のたびにクッキーを設定し、その合計サイズが最終的にサーバーの制限を超えます。ブラウザのクッキーを全消去する前に、まずサイト固有のクッキーを消去してください。
リクエストとともに送るカスタムヘッダーの値を削減します。長い認可トークン、過大な X-Custom-* ヘッダー、ヘッダーに埋め込まれた URL エンコード済みのクエリパラメーターは、いずれも合計サイズに寄与します。
サーバー側では、ヘッダーのバッファ制限を増やします。
サイト全体でクッキーの使用状況を監査します。ドメインごとに設定するクッキーの数を制限し、SameSite、Path、Domain の各属性を使って、必要のないサブドメインやパスへクッキーが伝播しないようにします。すべてのリクエストに付随する必要のないデータは、サーバー側のストレージや localStorage へ移します。
サーバーの制限を 32 KB を超えて引き上げると、サービス拒否のリスクが生じます。制限は正当なトラフィックに対応できる分だけ引き上げ、その変更はリクエストサイズの監視と組み合わせてください。
Chrome と 431 エラー
Chrome は、あるドメインに蓄積したクッキーによってリクエストヘッダーがサーバーの制限を超えると、「Bad Request - Request Header Field Too Long」または「Bad message 431」と表示します。Chrome の設定で特定サイトのクッキーを消去すると(設定 > プライバシー > Cookie > すべてのサイトデータを表示)、他のサイトに影響を与えずにこのエラーが直ちに解消します。
コードリファレンス
.NET
HttpStatusCode.RequestHeaderFieldsTooLarge
Rust
http::StatusCode::REQUEST_HEADER_FIELDS_TOO_LARGE
Rails
:request_header_fields_too_large
Go
http.StatusRequestHeaderFieldsTooLarge
Symfony
Response::HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE
Python3.5+
http.HTTPStatus.REQUEST_HEADER_FIELDS_TOO_LARGE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_HEADER_FIELDS_TOO_LARGE
Angular
@angular/common/http/HttpStatusCode.RequestHeaderFieldsTooLarge