URL のエンコード: HTTP GET でのリテラル スラッシュの保持
HTTP GET リクエストでは、URL エンコードは、次のような特殊文字を送信するために重要です。標準の文字セットの一部ではありません。ただし、URL パスにスラッシュ (/) が含まれる場合、特定の GET 実装はそれを二重スラッシュ (//) 構文に自動的に変換します。これは、URL エンコードされたスラッシュ文字を HTTP/GET 経由で OCSP などのプロトコルに準拠するために不可欠であるため、送信する場合に問題となる可能性があります。
次のコード スニペットは、この問題を示しています。
using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); }
ただし、サーバーに送信される実際のリクエストは次のとおりです。
GET // HTTP/1.1 Host: example.com Connection: Keep-Alive
HTTP GET でリテラルのスラッシュを保持するには、カスタム ソリューションが必要です。以下は、パスとクエリを保持するように Uri オブジェクトを変更するコード スニペットです:
Uri uri = new Uri("http://example.com/%2F"); ForceCanonicalPathAndQuery(uri); using (WebClient webClient = new WebClient()) { webClient.DownloadData(uri); } void ForceCanonicalPathAndQuery(Uri uri){ string paq = uri.PathAndQuery; // need to access PathAndQuery FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); ulong flags = (ulong) flagsFieldInfo.GetValue(uri); flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical flagsFieldInfo.SetValue(uri, flags); }
Uri オブジェクトを変更すると、パスは強制的に元の状態に維持され、リテラルのスラッシュが確実に保持されます。 GETリクエスト。このソリューションにより、URL エンコードされたスラッシュを必要とするプロトコルの準拠した実装が可能になります。
以上がURL エンコードされた HTTP GET リクエストでリテラルのスラッシュを保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。