1. ホーム
  2. http

[解決済み] クエリ文字列のキーは大文字と小文字を区別しますか?

2023-03-19 11:02:33

質問

このようなurlがあるとします。

http://www.example.com?key=123&KEY=198

の結果はどうなるのでしょうか?

request.querystring("key")

and 

request.querystring("KEY")

少し混乱しています。

どのように解決するのですか?

URI の RFC にはこうあります。

6.2.2.1. 大文字小文字の正規化

URIが汎用構文のコンポーネントを使用するとき、コンポーネント構文の等価ルールが常に適用されます。すなわち、スキームとホストは大文字と小文字を区別せず、したがって小文字に正規化されるべきです。例えば、URI HTTP://www.EXAMPLE.com/ は次のように等価です。 http://www.example.com/ .

他の一般的な構文の構成要素は、スキームで特に定義されない限り、大文字と小文字が区別されると仮定されます(セクション6.2.3参照)。

scheme (ここでは "http"), host (サーバ名) は大文字と小文字を区別しませんが、いずれにせよ小文字にする必要があることに注意してください。残りの部分は、大文字と小文字を区別しないと明示されている別のスキームを使用している場合を除き、大文字と小文字を区別します。

つまり、仕様によると、すべての http ベースの URI において、キーと KEY は異なるものなのです。

編集する それは、独自の URI を定義するカスタム スキームや当局には当てはまりますが、http は誰もが準拠する明確に定義された仕様です (または、たとえばパイプ文字を区切り文字とする http クエリを持つことができます。この場合の混乱を想像してみてください)。そこでのカオスを想像してみてください!)

その HTTP の RFC 仕様 にはこうあります。

スキームとホストは大文字と小文字を区別せず、通常は小文字で提供されます。 他のすべてのコンポーネントは大文字と小文字を区別して比較されます。 で比較されます。 reserved"セット内の文字以外の文字は、パーセントエンコードされたオクテットと同じです。 は,パーセントエンコードされたオクテットと等価であり,通常の形式は,それらをエンコードしないことである。 通常の形式は、それらをエンコードしないことです([RFC3986]のセクション 2.1 と 2.2 を参照)。

つまり、HTTP スキームの仕様で定義されている URI のクエリ部分は、大文字と小文字が区別されるのです。Microsoft がクエリ文字列に対して大文字と小文字を区別しないパーサーを持っている場合、そのパーサーは仕様に適合していません。このレベルのこだわりはあまり重要ではないと思います。