414 URI Too Long
使い方
414 URI Too Long のエラーメッセージを受け取ったとき、クライアントはサーバーがより短い HTTP のパスまたはアドレスを求めていると理解します。仕様は長さに関する要件を一切定めていませんが、実際にはブラウザが特定の種類の攻撃を防ぐためにサイズを制限しています。
サーバー、リバースプロキシ、フレームワークはそれぞれ独自の URI 長の制限を課します。一般的なデフォルト値は 4 KB から 8 KB の範囲ですが、最大値を定める仕様はありません。
414 URI Too Long のレスポンスはデフォルトでキャッシュ可能です。
SEO への影響
Google のような検索エンジンは、414 のレスポンスステータスを持つ URL をインデックスしません。以前にインデックスされていた URL は検索結果から削除されます。
例
クライアントが、サーバーの許容範囲を超える URI を使ってリソースを要求します。
リクエスト
GET /<...a_long_URI...> HTTP/1.1
Host: example.com
レスポンス
HTTP/1.1 414 URI Too Long
対処方法
最も一般的な原因は、クエリパラメーターが多すぎる GET リクエストや、URL にエンコードされた過度に長い値です。リダイレクトループや、設定を誤ったリライトルールが各サイクルでパラメーターを追加していく場合にも、このエラーが発生します。
クライアント側の対処:
nginx:より長いリクエスト行を許可するために large_client_header_buffers を増やします。このディレクティブはバッファ数とバッファサイズの2つの値を取ります。例:large_client_header_buffers 4 32k。適用するには nginx を再起動します。
Apache:httpd.conf で LimitRequestLine をより大きなバイト値に設定します。デフォルトは 8190 バイトです。長い URL を扱うアプリケーションでは 128000 までの値がよく使われます。変更後は Apache を再起動します。
IIS:web.config ファイルの system.webServer > security > requestFiltering > requestLimits の下にある maxUrl と maxQueryString を編集します。デフォルトは URL 長が 4096 バイト、クエリ文字列が 2048 バイトです。これらの値は実用上可能な限り小さく保ってください。URL の制限を大きくすると、インジェクション攻撃にさらされるリスクが高まります。
このエラーが API ではなくブラウザで現れる場合、ブラウザのキャッシュとクッキーを消去すると解消することがあります。特に、古いクッキーがリクエストヘッダーのサイズをサーバーの制限を超えるまで膨らませている場合に有効です。
コードリファレンス
.NET
HttpStatusCode.RequestUriTooLong
Rust
http::StatusCode::URI_TOO_LONG
Rails
:uri_too_long
:request_uri_too_long
Go
http.StatusRequestURITooLong
Symfony
Response::HTTP_REQUEST_URI_TOO_LONG
Python3.5+
http.HTTPStatus.REQUEST_URI_TOO_LONG
Java
java.net.HttpURLConnection.HTTP_REQ_TOO_LONG
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_URI_TOO_LONG
Angular
@angular/common/http/HttpStatusCode.UriTooLong