web-dev-qa-db-ja.com

クエリ文字列キーでは大文字と小文字が区別されますか?

次のようなURLがあるとします。

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

それから何の結果になります

request.querystring("key")

and 

request.querystring("KEY")

私は少し混乱しています。

RIのRFC 言います:

6.2.2.1。ケースの正規化

URIが汎用構文のコンポーネントを使用する場合、コンポーネント構文の等価ルールが常に適用されます。つまり、スキームとホストは大文字と小文字を区別しないため、小文字に正規化する必要があります。たとえば、URIは http://www.example.com/ と同等です。

他の一般的な構文コンポーネントは、スキームで特に定義されていない限り、大文字と小文字を区別すると想定されます(セクション6.2.3を参照)。

スキーム(ここでは「http」)、ホスト(サーバー名)は大文字と小文字を区別しませんが、とにかく小文字にする必要があります。残りは大文字と小文字を区別します。ただし、別のスキームを使用していて、区別しないように明示的に指定している場合を除きます。

そのため、仕様に従って、すべてのhttpベースのURIでkeyとKEYは異なるものになります。

59
gbjbaanb

@gbjbaanbの答えは間違っています。RFCでは、クエリ文字列に許可されている文字セットのみを指定しています。 pathおよびfragment URIのコンポーネントと同様に、query URIコンポーネントには意味があります権限のみ提供リソース。

このようなものが大文字と小文字を区別するかどうかは、完全にその権限次第です。

C#およびIISの場合、HttpRequestオブジェクト内の解析されたクエリ文字列のバッキングストアはSystem.Collections.Specialized.NameValueCollection which 大文字と小文字を区別しないようにする(デフォルト)。

そのクラスは他のコンストラクターを提供するため、異なる等値比較子を提供できるため、実装で大文字と小文字を区別しないようにすることは絶対にありません。

さらに、ページ自体(およびクライアント側のjavascript)が未加工のURIにアクセスできるため、必要に応じて自由に実行できます。

クエリ文字列がHTMLフォーム送信の結果として構築される場合、キー(名前)はフォームコントロールのname属性の値から取得されます。HTML仕様では大文字と小文字が区別されます。しかし、私が知っている限りでは、誰もそれを本当にしません。

そのため、1日の終わりに、クエリ文字列で要求ハンドラが何を期待しているかを知る必要があります。大文字と小文字を区別する場合もあればしない場合もあります。

47
Nicholas Carey

hurl.it によれば、key123およびKEY198と等しくなります。それらは2つの異なるクエリ文字列としてアクセス可能です。

8
Rémi Delhaye