2

最近、WebサービスアクセスインターフェイスAPIの可能性について考えながら、HTTPクエリ文字列を調査していました。そして、それは非常に過小評価されているようです。

実際、RFC 3986(Uniform Resource Identifier(URI):Generic Syntax)は、クエリ文字列フラグメントの形式については何も述べておらず、許可される文字と他の文字のエンコード方法の定義で終わります。(後でこれに戻ります。)

私が見つけた唯一のことは、フォームがクエリ文字列にどのようにマングルされるかに関するHTML仕様でした(HTML 4.01; 17.13.4フォームコンテンツタイプ、application / x-www-form-urlencoded)。HTML 5アルゴリズムは十分に近いようです(4.10.22.5 URLエンコードされたフォームデータ)。

これは問題ないように見えるかもしれません。結局のところ、なぜ誰もが他のすべての人にクエリ文字列形式を設定したいと思うのでしょうか。何のために?しかし、(HTML以外の)十分に確立された標準はありますか?他に別のフォーマットを使用している人はいますか?


ここでの副次的な質問は、フォームフィールド名の[]を扱うことです。PHPはこれを使用して、フィールドの複数のオカレンスがすべて$_GETスーパーグローバル変数に存在することを確認します。(それ以外の場合は、最後のオカレンスのみが存在します。)

しかし、RFC 3986から、クエリ文字列では許可されてい[ないようです。]それでも、さまざまなブラウザでの私の実験では、これらの文字をエンコードするブラウザはなく、そのようにURIに存在することが示唆されました...

これは実際の習慣ですか?それとも私はそれを間違ってテストしていますか?IIS7でPHP5.3.17を使用してテストしました。InternetExplorer、Firefox、およびChromeを使用します。$_SERVER['QUERY_STRING']次に、何が入っているかを比較しました$_GET


もう1つの質問は、セミコロン分離の実際のサポートです。

HTML 4.01仕様(URI属性値のB.2.2アンパサンド;)では、HTTPサーバーがパラメーター区切り文字(アンパサンドではなく)としてセミコロン()を受け入れることを推奨しています&

それをサポートしているサーバーはありますか?これを使っている人はいますか?(Webサービスで許可されているクエリ文字列の形式を検討する場合)それを気にする価値はありますか?


では、非ASCII文字のサポートはどうですか?

HTML 4.01仕様(B.2.1 URI属性値の非ASCII文字)は、最初にRFCを説明するURIを明確に言い換えています。非ASCII文字はURIで許可されていません。ただし、仕様では、既存の慣行(不正なURIの使用)と、そのような文字をUTF-8エンコーディングに変更し、各バイトをURI標準の16進エンコーディングで処理するためのアドバイスが考慮されています。

私のテストから、たとえばChromeとFirefoxはそうしているようです。しかし、Internet Explorerは送信せず、それらの文字をそのまま送信しました。PHPは部分的にそれに対処しました。$_SERVER['QUERY_STRING']そして$_GETそれらの文字が含まれていました。しかし、代わりに$_SERVER['REQUEST_URI']含まれています。?

そのような場合にどのようにアプローチするかについての基準や慣行はありますか?


そして、別の関連する質問は、著者が非ASCII(たとえば国別)文字を含む名前で(URIによって)リソースをどのように公開する必要があるかということです。さまざまな関係者(HTMLコード、ブラウザー送信要求、ブラウザー保存ファイルdoディスク、サーバー受信および処理要求、サーバー保管)を考慮すると、一貫して機能させることはほぼ不可能のようです。または、少なくとも私は管理しませんでした。

Webページに関しては、私はすでにそれに慣れており、常に国別文字を対応するラテン語の基本文字に置き換えています。しかし、外部ファイル(PDF、画像など)に関しては、名前を「ダウングレード」するのはどういうわけか「間違っている」と感じます。特に、ユーザーがそれらのファイルをディスクに保存することを期待している場合..この問題に対処するにはどうすればよいですか?

4

2 に答える 2

1

実際、RFC 3986 (Uniform Resource Identifier (URI): Generic Syntax) は、クエリ文字列フラグメントの形式について何も述べていません。

はい、セクション 3.4 で:

query       = *( pchar / "/" / "?" )

pcharセクション 3.3 で定義されています。

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

そして、どの文字が許可され、他の文字をどのようにエンコードするかを定義することで終わります。

丁度。これは、クエリ文字列フラグメントの形式を定義しています。

しかし、RFC 3986 からは、クエリ文字列で [ も ] も許可されていないようです。

公式には、はい。しかし、すべてのブラウザーがこれを行うわけではなく、それはブラウザー側の動作が壊れています。私が見たすべての公式仕様 (3986 だけが使用されているわけではありません) では、これらの文字はパーセントでエンコードする必要があると述べています。

では、ASCII 以外の文字のサポートはどうでしょうか。

URI では非 ASCII 文字は使用できません。それらは、文字セットでエンコードされ、パーセントでエンコードされている必要があります。使用される実際の文字セットはサーバー固有であり、使用される文字セットを URI で指定できる仕様はありません。さまざまな仕様で UTF-8 が推奨されていますが、UTF-8 は必須ではなく、一部の外部サーバーは実際に UTF-8 を使用していません。

URL/URI 仕様を置き換えるIRI 仕様 ( RFC 3987 ) は、完全な Unicode 文字セットをサポートしていますが、IRI はまだ比較的新しく、多くのサーバーはまだそれらをサポートしていません。ただし、RFC は、IRI を URI に、またはその逆に変換するためのアルゴリズムを定義しています。

疑わしい場合は、不明な点をすべてパーセント エンコードしてください。サーバーは、必要に応じてデコードされたデータを処理する前に、存在する場合はデコードをサポートする必要があります。

于 2012-10-16T21:46:33.883 に答える
1

HTTP仕様(RFC2616)は確認しましたか?

それらの部分を見てください:


実用的なアドバイスは、Base64を使用して危険な文字が含まれていると予想されるフィールドをエンコードし、後でバックエンドでデコードすることです。

ところで。あなたの質問は本当に長いです。誰かがそれを掘り下げる可能性を減らします。

于 2012-10-16T19:45:05.663 に答える