URLの長さの上限について
2019/02/07
画面遷移時にGETフォームやURLにGETパラメータを付けて連携する場合、URLの長さがブラウザなどの上限に達しないかを考慮する必要があります。
調べるとIEは2083文字や2048文字が上限と言った情報が出て来ますが実際どうかを検証してみました。
URLの長さ上限はブラウザとサーバのそれぞれを考慮する
URLの長さの上限はHTTPリクエストを送るブラウザ側の上限と、それを受けるサーバ側の上限があります。
1. ブラウザの上限(IE)
よくエンジニアを悩ませるのにIEの独自仕様がありますが、URLの長さについてIE11で検証しました。結果をまとめると以下のようになります。
- URLバーに入力できる文字数は2048文字
- GETパラメータ付きのリンクやGETフォームで画面遷移をする場合は2083文字以上を送信できる。(少なくとも8000文字以上は送信可能)
海外サイトなどで調べると、よく聞く2083文字制限はIE9までの話という情報がありIE11ではURLの長さが8000文字以上でも問題ありませんでした。
2. その他のブラウザの上限
ChromeやFirefoxではURLの長さは少なくとも1万文字以上は可能です。後述するサーバの上限が先に来るかと思います。
3.サーバの上限
サーバの上限は使用するインフラやMWにより変わりますが、AWSの場合はALBの上限でHTTP2の場合8kBが上限となります。これは設定変更できないようです。apacheなどにも上限設定がありますが、こちらは変更はできます。
そのため、AWSの場合はURLの長さは約8,000文字が上限と考えると良いかと思います。
URLの長さを計算する場合はURLエンコードを考慮
URLの全角文字や記号は基本的にURLエンコードを行うため、エンコード後の長さを考慮する必要があります。
UTF8でエンコード対象の文字は、エンコードを行うと1文字が9文字がとなります。エンコード後の文字は1文字1バイトです。
ブラウザによりURLエンコードの挙動が異なる
URLエンコードを明示的にロジックで行わない場合(リンクURLに全角文字などをそのまま含む場合)、chromeやfirefoxはリンク時に自動的にエンコードします。
IEは自動的にはエンコードせずに「?」に文字化けしてGETリクエストを送信してしまいます。そのため、サーバがリクエストを受け取った際には文字化けしており、正しくパラメータを受け取れません。
以上を考慮すると、URLエンコードは明示的に処理して行うのがよいかと思います。