Adakah yang tahu daftar karakter lengkap yang dapat digunakan dalam GET tanpa dikodekan? Saat ini saya menggunakan AZ az dan 0-9 ... tapi saya mencari tahu daftar lengkapnya.
Saya juga tertarik jika ada spesifikasi yang dirilis untuk penambahan bahasa Cina, bahasa Arab (yang jelas akan berdampak besar pada pertanyaan saya)
!*'();:@&=+$,/?#[]
atau tidak dilindungiA-Za-z0-9_.~-
(atau karakter persen%
sebagai bagian dari pengkodean persen)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
untuk menemukan string URL dengan karakter buruk. Mungkin itu berguna untuk orang lain juga.Jawaban:
Dari spesifikasi RFC 1738 :
EDIT: Seperti yang ditunjukkan oleh @Jukka K. Korpela, RFC ini diperbarui oleh RFC 3986 . Ini telah memperluas dan mengklarifikasi karakter yang valid untuk host, sayangnya itu tidak mudah disalin dan ditempelkan, tetapi saya akan melakukan yang terbaik.
Dalam urutan pertama yang cocok:
sumber
A-Za-z0-9_.-~
karakter yang tidak dilindungi dan dilindungi undang-undang di awal jawaban ini.!*'();:@&=+$,/?#[]
Ini dapat menghemat waktu untuk orangreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
mengatakan ini adalah RFC 3986 karakter tanpa syarat (bagian 2.3) serta karakter yang dipesan (bagian 2.2) jika mereka perlu mempertahankan makna khusus mereka. Dan juga karakter persen sebagai bagian dari pengkodean persen.
sumber
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Daftar lengkap dari 66 karakter tanpa pagu harga ada di RFC3986, di sini: http://tools.ietf.org/html/rfc3986#section-2.3
Ini adalah karakter apa pun dalam rangkaian regex berikut:
sumber
{}^\~
danbacktick
tidak aman. Dan RFC3986 daftar \ sebagai tidak aman karena sistem file. Ini artinya{}^
bisa digunakan juga.-
atau meletakkannya di awal atau akhir kelas karakter, karena[.-~]
sebenarnya berisi semua karakter ASCII dari 46 hingga 126.Saya mengujinya dengan meminta situs web saya (apache) dengan semua karakter yang tersedia di keyboard jerman saya sebagai parameter URL:
Ini tidak disandikan:
Tidak disandikan setelah
urlencode()
:Tidak disandikan setelah
rawurlencode()
:Catatan: Sebelum PHP 5.3.0
rawurlencode()
disandikan~
karena RFC 1738 . Tapi ini digantikan oleh RFC 3986 sehingga aman digunakan, sekarang. Tapi saya tidak mengerti mengapa misalnya{}
dikodekan melaluirawurlencode()
karena mereka tidak disebutkan dalam RFC 3986.Tes tambahan yang saya lakukan adalah tentang penautan otomatis dalam teks surat. Saya menguji Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de dan yahoo.de dan mereka sepenuhnya menautkan URL yang berisi karakter ini:
Tentu saja
?
itu ditautkan juga, tetapi hanya jika digunakan sekali.Beberapa orang sekarang menyarankan untuk menggunakan hanya
rawurlencode()
karakter, tetapi apakah Anda pernah mendengar bahwa seseorang memiliki masalah untuk membuka situs web ini?Asterisk
http://wayback.archive.org/web/*/http://google.com
Colon
https://en.wikipedia.org/wiki/Wikipedia:About
Plus
https://plus.google.com/+google
Pada tanda, tanda titik dua, tanda koma dan tanda seru
https: //www.google.com/maps/place/USA/@36.2218457, ...
Karena itu karakter ini harus dapat digunakan tanpa kode tanpa masalah. Tentu saja Anda tidak boleh menggunakan
&;
karena urutan pengkodean seperti&
. Alasan yang sama berlaku karena%
digunakan untuk menyandikan karakter secara umum. Dan=
saat memberikan nilai ke nama parameter.Akhirnya saya akan mengatakan tidak apa-apa untuk menggunakan ini tanpa kode:
Tetapi jika Anda mengharapkan URL yang dibuat secara acak sebaiknya tidak Anda gunakan
.!
, karena itu menandai akhir kalimat dan beberapa aplikasi email tidak akan otomatis menautkan karakter terakhir dari url. Contoh:sumber
+
pertanda terutama :-DDari sini
sumber
Ini tercantum dalam RFC3986 . Lihat ABNF yang Dikumpulkan untuk URI untuk melihat apa yang diizinkan di mana dan regex untuk penguraian / validasi.
sumber
RFC3986 mendefinisikan dua set karakter yang dapat Anda gunakan dalam URI:
Karakter yang Dicadangkan :
:/?#[]@!$&'()*+,;=
Karakter Tanpa Cadangan :
A-Za-z0-9-_.~
sumber
Perubahan yang akan datang adalah untuk nama domain cina, arab bukan URI. URI yang terinternasionalisasi disebut IRI dan didefinisikan dalam RFC 3987 . Namun, setelah mengatakan bahwa saya akan merekomendasikan untuk tidak melakukan ini sendiri tetapi mengandalkan pustaka yang sudah teruji, karena ada banyak pilihan pengkodean / decoding URI dan apa yang dianggap aman berdasarkan spesifikasi, versus apa yang aman dengan penggunaan aktual (browser) .
sumber
Jika Anda ingin memberikan pengalaman khusus kepada pengguna yang dapat Anda gunakan
pushState
untuk menghadirkan beragam karakter ke url browser:sumber