とあるASPの開発中にIEのみ項目が追加(並べ替え?)できない、というHELPが自分に来た。
確かその処理は、サーバに非同期通信してた気がしたのでソースを調べてみると、prototype.jsにてAjax.Requestしていた。
しかし、そこのメソッドがGETになっていた。
IEで動かないという時にまず思い浮かんだのが、「URL長すぎ」。
IEは確か長いURLが駄目だった気がした(前にも似たようなことがあった気がした)ので、ちゃんと調べてみると、
[IE] URL に使用可能な文字数は最大 2,083 文字
Internet Explorer では、URL (Uniform Resource Locator) に使用できる最大文字数は 2,083 文字です。
GET メソッドを使用する場合、最大文字数は 2,083 文字に制限されます (実際のパスも含めた文字数)。
ところが、POST を使用する場合、名前と値の組み合わせの発行については URL の文字数が制限されません。これは、名前と値の組み合わせは URL ではなく、ヘッダーに含めて送信されるためです。
とのことで、GETの時のみ制限があるそうで。
ちなみにFirefoxは、
URL の最大長は何文字?
Mozilla/Firefox は事実上無制限
少なくとも 2MB (200 万文字)は送信可能なことを確認しました(後述)。ソースコードは未確認ですが、事実上無制限と考えてよいでしょう。
ただし、あまりに長い URL は、アドレスバーが表示されなくなる、極端に動作が遅くなる、などの不具合があります。
とのこと。Firefox万歳!
しかし、サーバ側の制約の場合もあるので注意がいるかもしれない。
URL の最大長は何文字?
Apache は 8177 バイト
Apache HTTP server では、HTTP リクエスト行の長さが LimitRequestLine を超えると、414 Request-URI Too Large エラーを返します。
LimitRequestLine のデフォルト値は 8190 バイトです。Apache 2.0 では 0 からDEFAULT_LIMIT_REQUEST_LINE (=8190)の間で設定可能です。Apache 2.2 では任意の値にセットできます。
通常のリクエスト行は
GET <url> HTTP/1.1
ですから、url 部分の最大長は 8177 バイトということになります。
という記述もあったので、サーバ側の制約の場合もあるかもしれない。
(まぁ通常は多分デフォルト設定だと思うが…)
自社で用意したサーバなら、設定変えるだけで普通は問題ないと思う。
それよりも、長すぎるURLを送りつけるヒドイ仕様を何とかした方が何かと幸せになれる希ガスる。
Opera9.5、Firefox3.0の正式リリースでテストしなければならないブラウザが増えた気がするけど、まあなんとかなるっしょ!