Mengatasi Dilema Pengekodan URL Slash semasa Permintaan GET
Dalam percubaan untuk menghantar permintaan HTTP GET ke URL yang mengandungi peratusan yang dikodkan slash (/), seperti "http://example.com//," pendekatan biasa ialah menggunakan kelas WebClient sebagai berikut:
using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); }
Walau bagaimanapun, kaedah ini menghasilkan hasil yang tidak dijangka. Watak slash akan berubah menjadi slash tambahan semasa penghantaran, yang membawa kepada permintaan berikut dihantar:
GET // HTTP/1.1 Host: example.com Connection: Keep-Alive
Isu ini timbul apabila menggunakan OCSP melalui HTTP/GET, yang memerlukan penghantaran / sebenar bukan '/ ' untuk memastikan pematuhan protokol.
Penyelesaian Berpotensi
Walaupun tidak ideal, coretan kod berikut membentangkan penyelesaian untuk isu ini:
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); }
Penyelesaian ini melibatkan pengubahsuaian bendera dalaman objek Uri untuk memaksa CanonicalPathAndQuery, memastikan bahawa aksara slash dikekalkan semasa penghantaran.
Penafian
Adalah penting untuk ambil perhatian bahawa pendekatan ini tidak dijamin serasi dengan versi rangka kerja akan datang. Sentiasa teruskan dengan berhati-hati apabila mengubah suai gelagat kelas dalaman.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Pengekodan URL daripada Mengubah Slash Berkod Peratusan dalam Permintaan GET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!