HTTP の URL 長制限(データ編集)
まず、実際には、 http 1.1 プロトコル 長さは制限されていません。プロトコルの原文:
HTTP プロトコルは、URI の長さに事前制限を設けていません。サーバーは URI を処理できなければなりません。また、そのような URI を生成できる GET ベースのフォームを提供する場合、サーバーは、無制限の長さの URI を処理できる必要があります (SHOULD)。URI がサーバーより長い場合、サーバーは 414 (Request-URI Too Long) ステータスを返す必要があります。
<em>Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxyimplementations might not properly support these lengths.</em>
変換:
HTTP プロトコルでは、URI、サーバーはリソースの URI を処理できる必要があり、無制限の長さの URI を処理できる必要があります。このような無効な長さの URI は、クライアントの実行時に生成される可能性があります。 GET メソッドに基づいてリクエストを作成します。サーバーが長すぎる URI を処理できない場合、サーバーは 414 ステータス コードを返す必要があります (このステータス コードは Request-URI が長すぎることを意味します)。
注 : サーバーには次の依存関係があります 255 バイトの URI は、一部の古いクライアントまたはプロキシ実装ではこれらの長さをサポートしていない可能性があるため、注意して使用する必要があります。 詳細については、規約の 3.2.1 を参照してください
規約では明示的に制限していませんが、 URL の長さ。実際の実装では、URL の長さには依然として制限があります。1 つはサーバー側の制限、もう 1 つはブラウザ側の制限です。
1. サーバー側
サーバー側では、主に Apache、jboss、nginx など、インターネットで見つけた調整方法を以下に示します。 http リクエスト URL の長さとリクエストメッセージ本文の長さ調査(1) (サーバー側)
1.1 nginx
現在のプロジェクトでは主にnginxを使用しているため、その設定パラメータを強調します:large_client_header_buffers
これパラメータは、クライアントから要求されたヘッダー情報を受け入れるときに nginx サーバーによって割り当てられる最大バッファのサイズが制限されています。つまり、nginx サーバーがクライアントのリクエストを一度に受け入れるときに受信できるヘッダー情報の最大サイズは制限されています。時間。このヘッダにはリクエストラインだけでなく、一般情報ヘッダ、リクエストヘッダフィールド、レスポンスヘッダフィールドの合計長も含まれます。これにより、URL の長さも大幅に制限されます。
nginx サーバーのデフォルトの制限は 4K または 8K で、これはサーバーのハードウェア構成に基づきます。これは通常、メモリの 1 ページのサイズです。 4096バイト。
2. ブラウザ側
ブラウザにはさまざまな種類があり、URL の長さの制限は次のように異なります。
これらのデータは主にオンライン データ検索を通じて取得されており、作成者は個人的に検証していませんそれ。しかし、開発を行う際には制限があることは議論の余地のない事実です。
私が最初に考えたのは、HTTP 1.1 プロトコルに制限があるかどうかを確認することでした (このプロトコルは本当に臭くて長いです...) 。このプロトコルが URL に長さの制限を課していないことが判明したことには驚きました。元の単語は次のとおりです:
"HTTP プロトコルは、URI の長さに先験的な制限を設けません。サーバーは、提供するリソースの URI を処理できなければなりません (MUST)そして、そのような URI を生成できる GET ベースのフォームを提供する場合、無制限の長さの URI を処理できるべきです (SHOULD)。URI がサーバーが処理できる長さより長い場合、サーバーは 414 (Request-URI Too Long) ステータスを返す必要があります (セクションを参照)。 10.4.15 ).
注: サーバーは、255 バイトを超える URI の長さに依存することに注意する必要があります古いクライアントまたはプロキシの一部の 実装では、これらの長さを適切にサポートしていない可能性があるためです。」 制限が適用される前は、サーバーはサービスを提供するリソースの URI を処理できなければなりません。無制限の長さの URI を処理できる必要があります。このような無効な長さの
URI は、要求時に生成されたGET でクライアント上で発生する可能性があります。サーバーが長すぎる URI を処理できない場合、サーバーは 414 ステータス コードを返す必要があります (このステータス コードは Request-URI が長すぎることを意味します)。 注: サーバーは 255 バイト 🎜> URI に依存しています。一部の古いクライアントまたはプロキシ実装ではこれらの長さをサポートしていない可能性があるため、使用には注意が必要です。
したがって、http 標準プロトコルからは、
URL の長さを制御することはできません。ヘッダーの長さに制限があるかどうかについては、プロトコルをさらに検討する必要があります。 url と header の長さの制限は、主にサーバーとクライアントの制限に依存します。
次にサーバー側から開始します:
主に監視しますapache と nginx は 2 つのサーバーであり、他のサーバーについてはよく知りません
公式の Apache でこのような設定オプション LimitRequestLine (http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestline)
定義上、このオプションは長さを制限しませんURL の長さはヘッダーの長さではなく、http リクエストのリクエストラインの長さです (関連定義: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1) )。 つまり、Request-Line = メソッド SP リクエスト URI SP HTTP バージョン CRLF の長さ。
ただし、GET リクエストと HEAD リクエストはメッセージ エンティティ (メッセージ本文) をサーバーに送信しないため、GET リクエストと HEAD リクエストのパラメータ長も大幅に制限されます。この制限は、URL の長さが設定値を超えないように制限していると言えます。これを超えると、サーバーはエラー ステータス コード 414 (Request-URI Too Large) を返します。
メッセージ本文全体について、Apache サーバーに制限はありますか?
次に他の関連パラメータを調べてみると、確かに次のようなパラメータがありました。 LimitRequestBody
(http://httpd.apache.org/docs/2.0/mod/ core.html#limitrequestbody)
このパラメータは、http リクエストで受け入れられる最大メッセージ サイズを制限します。デフォルトは無制限ですが、実際にはこの無制限にも制限があり、最大値は 2G を超えることはできません。
これらは、Apache サーバーによる http リクエストに関連するいくつかの制限です
nginx サーバーについても、同様のパラメーターがあります
large_client_header_buffers
このパラメータは、nginx サーバーによって次の目的で使用されます。クライアントリクエストの受け入れ ヘッダー情報に割り当てられる最大バッファサイズには制限があります。これは、nginx サーバーがクライアントリクエストを受け入れるときに一度に受信できる情報の最大サイズです。このヘッダにはリクエストラインだけでなく、一般情報ヘッダ、リクエストヘッダフィールド、レスポンスヘッダフィールドの合計長も含まれます。これにより、URL の長さも大幅に制限されます。
nginx サーバーのデフォルトの制限は 4K または 8K で、これはサーバーのハードウェア構成に基づきます。現在、ほとんどのサーバーは 4K です。 4096バイト。
client_header_buffer_size
(http://wiki.nginx.org/HttpCoreModule#client_header_buffer_size)
このパラメータは、クライアントから送信される http ヘッダー情報のサイズを制限します。この値とlarge_client_header_buffers も http リクエスト ヘッダーのサイズを制限します。いずれかの値を超えると、サーバーはエラー ステータス コード 414 (リクエスト URI が大きすぎます)。
このパラメータのデフォルト値は 1K です
client_max_body_size
このパラメータは、クライアントから送信される の http リクエストのメッセージ エンティティ サイズを制限します。この値を超えると、サーバーはエラー ステータス コード 413 (リクエスト エンティティが大きすぎます) を返します。このパラメータのデフォルト値は 1MB で、これは post メソッドで送信されるコンテンツの最大制限を制限するのと同等です
上記は、http リクエスト URL の長さに関するサーバー側の制限です。これらは、実際のテストを行わずに公式ドキュメントに基づいて結果を取得しただけです