Saya menyadari bahwa +
dalam string kueri URL mewakili spasi. Apakah ini juga kasus di luar wilayah string kueri? Artinya, apakah URL berikut:
http://a.com/a+b/c
sebenarnya mewakili:
http://a.com/a b/c
(dan dengan demikian perlu dikodekan jika harus benar-benar a +
), atau apakah sebenarnya mewakili a+b/c
?
url
encoding
query-string
Francisco Ryan Tolmasky I
sumber
sumber
rawurldecode
. Saya mengatakan ini di sini untuk referensi karena ini adalah hasil nilai tinggi di pencarian google untuk "php url decode breaks on plus symbol".Jawaban:
+
karakter dalam komponen path diharapkan diperlakukan secara literal.Secara eksplisit:
+
hanya karakter khusus dalam komponen permintaan.sumber
+
karakter ditafsirkan sebagai spasi dalam komponen kueri? Atau itu hanya aturan "dari alam"?http:
), authority (//server.example.com
), dan path (/myfile/mypage.htm
), dan tidak mendefinisikan makna khusus untuk+
karakter tersebut. Spesifikasi HTML mendefinisikan komponen permintaan menjadi aplikasi tipe mime / x-www-form-urlencoded yang didefinisikan sebagai "ganti spasi dengan+
dan karakter khusus lainnya seperti dalam RFC1738". Jadi ini bukan "dari alam", tetapi dari standar yang diterima (non-RFC).Server.UrlEncode
keliru mengkode spasi sebagai plusses di bagian path juga, melanggar aturan HTTP.Anda dapat menemukan daftar karakter berkode URL yang sesuai di W3Schools .
+
menjadi%2B
%20
sumber
%25252B
Karakter spasi hanya dapat dikodekan sebagai "+" dalam satu konteks: application / x-www-form-urlencoded pasangan nilai kunci.
RFC-1866 (spesifikasi HTML 2.0), paragraf 8.2.1. subparagraf 1. mengatakan: "Nama-nama bidang nilai-nilai dan melarikan diri: karakter spasi diganti dengan` + ', dan kemudian karakter yang dipesan melarikan diri ").
Berikut adalah contoh string di URL di mana RFC-1866 memungkinkan ruang pengkodean sebagai plus: " http://example.com/over/there?name=foo+bar ". Jadi, hanya setelah "?", Spasi dapat diganti dengan plus (dalam kasus lain, spasi harus dikodekan ke% 20). Cara pengkodean data formulir ini juga diberikan dalam spesifikasi HTML nanti, misalnya, cari paragraf yang relevan tentang aplikasi / x-www-form-urlencoded dalam Spesifikasi HTML 4.01, dan seterusnya.
Tapi, karena sulit untuk selalu menentukan konteks dengan benar, itu praktik terbaik untuk tidak pernah menyandikan spasi sebagai "+". Lebih baik untuk meng-enkode semua karakter kecuali "tanpa cadangan" yang didefinisikan dalam RFC-3986, hal.2.3. Berikut adalah contoh kode yang menggambarkan apa yang harus dikodekan. Itu diberikan dalam bahasa pemrograman Delphi (pascal), tetapi sangat mudah untuk memahami cara kerjanya untuk setiap programmer terlepas dari bahasa yang dimiliki:
sumber
menggunakan fungsi komponen encodeURICon untuk memperbaiki url, ini berfungsi pada Browser dan node.js
sumber
Coba di bawah ini:
sumber
escape
sudah usang, alih-alih Anda harus menggunakanencodeURI
atau dalam kasus bagian permintaanencodeURIComponent
. Juga string parameter harus dikodekan sesuai dengan w3c .Anda harus selalu menyandikan URL.
Berikut ini cara Ruby menyandikan URL Anda:
sumber