Melarikan ampersand di URL

203

Saya mencoba mengirim pesan GET yang berisi string dengan ampersand dan tidak dapat menemukan cara untuk menghindari ampersand di URL.

Contoh:

http://www.example.com?candy_name=M&M
result => candy_name = M

Saya juga mencoba:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

Saya menggunakan URL secara manual, jadi saya hanya perlu karakter yang benar.

Saya tidak bisa menggunakan perpustakaan apa pun. Bagaimana itu bisa dilakukan?

tomermes
sumber

Jawaban:

350

Mereka harus dikodekan persen:

> encodeURIComponent('&')
"%26"

Jadi dalam kasus Anda, URL akan terlihat seperti:

http://www.mysite.com?candy_name=M%26M
Blender
sumber
2
: -% 26 tidak berfungsi untuk saya. Apakah ada solusi yang lain.?
Sanjiv
2
Ketika saya mengganti & ke% 26, masih menunjukkan kesalahan yang samaA potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
4
@ Sanjiv: Itu masalah dengan kode Anda, bukan penyandian persen. Tanyakan pertanyaan.
Blender
2
@Sanjiv pastikan Anda mengganti "&" dengan "% 26" terlebih dahulu. Lihat kode ::: NSString * message = @ "Hello Jack & Jill"; message = [message stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [message stringByAppendingString: @ ""]; message = [message stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav
40

Ini tidak hanya berlaku untuk ampersand di URL, tetapi untuk semua karakter yang dipesan . Beberapa di antaranya meliputi:

 # $ & + ,  / : ; = ? @ [ ]

Idenya sama dengan pengkodean & dalam dokumen HTML, tetapi konteksnya telah berubah menjadi di dalam URI, selain berada di dalam dokumen HTML. Jadi, pengkodean persen mencegah masalah dengan penguraian di dalam kedua konteks.

Tempat ini sangat berguna adalah ketika Anda harus meletakkan URL di dalam URL lain. Misalnya, jika Anda ingin memposting status di Twitter:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

Ada banyak karakter yang dipesan di Tweet saya, yaitu ?'():/ , jadi saya menyandikan seluruh nilai statusparameter URL. Ini juga sangat membantu ketika menggunakan mailto:tautan yang memiliki badan atau subjek pesan, karena Anda perlu menyandikan bodydan subjectparameter untuk menjaga garis putus, ampersand, dll utuh.

Ketika karakter dari himpunan yang disediakan ("karakter yang dilindungi") memiliki arti khusus ("tujuan yang dilindungi") dalam konteks tertentu, dan skema URI mengatakan bahwa perlu untuk menggunakan karakter itu untuk tujuan lain, maka karakter tersebut harus dikodekan persen. Persen-pengkodean karakter yang dicadangkan melibatkan konversi karakter ke nilai byte yang sesuai di ASCII dan kemudian mewakili nilai itu sebagai sepasang digit heksadesimal. Digit, didahului oleh tanda persen ("%") yang digunakan sebagai karakter pelarian, kemudian digunakan dalam URI sebagai pengganti karakter yang dipesan. (Untuk karakter non-ASCII, biasanya dikonversikan ke urutan byte dalam UTF-8, dan kemudian setiap nilai byte diwakili seperti di atas.) Karakter yang dicadangkan "/", misalnya, jika digunakan dalam "path" komponen URI, memiliki makna khusus sebagai pembatas antara segmen jalur. Jika, menurut skema URI yang diberikan, "/" perlu berada di segmen jalur, maka tiga karakter "% 2F" atau "% 2f" harus digunakan di segmen alih-alih "/" mentah.

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

Alex W
sumber
4
Di antara daftar di atas, ! ' ( ) *bukan URL yang disandikan encodeURIComponent.
Amil Waduwawara
ada urlencode fungsi php yang memecahkan masalah ini: penggunaan $ escapedfilename = urlencode ($ filename);
Jeremy Young
3

Anda dapat menggunakan% karakter untuk 'melarikan diri' karakter yang tidak diizinkan dalam URL. Lihat [RFC 1738].

Tabel nilai ASCII di http://www.asciitable.com/ .

Anda dapat melihat &26 dalam heksadesimal - jadi Anda membutuhkan M% 26M.

Peter Hull
sumber
2

Ini dapat membantu jika seseorang menginginkannya dalam PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Mohamed Ramadhan
sumber
1

Saya ingin menambahkan komentar kecil pada solusi Blender.

Anda dapat melakukan hal berikut:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Keluaran itu:

http://example.com?candy_name=M%26M

Hal yang hebat tentang ini tidak hanya bekerja untuk & tetapi untuk karakter utama.

Misalnya:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Output:

"http://example.com?candy_name=M%26M%3F%3E%3C"
Antonio
sumber