Apakah URL diizinkan mengandung spasi?

132

Apakah URI (khususnya URL HTTP) diizinkan mengandung satu atau lebih karakter spasi? Jika URL harus disandikan, apakah +hanya konvensi yang biasa diikuti, atau alternatif yang sah?

Secara khusus, dapatkah seseorang menunjuk ke RFC yang menunjukkan bahwa URL dengan spasi harus dikodekan?

Motivasi untuk pertanyaan: Selagi menguji beta situs web, saya perhatikan bahwa beberapa URL dibuat dengan spasi di dalamnya. Firefox sepertinya melakukan hal yang benar, yang mengejutkan saya! Tapi saya ingin bisa mengarahkan pengembang ke RFC sehingga mereka akan merasa perlu untuk memperbaiki URL tersebut.

Joe Casadonte
sumber
superset yang datang kemudian: apa saja karakter yang tidak valid: stackoverflow.com/questions/1547899/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

101

Sesuai RFC 1738 :

Tidak aman:

Karakter dapat menjadi tidak aman karena sejumlah alasan. Karakter spasi tidak aman karena ruang yang signifikan dapat menghilang dan ruang yang tidak signifikan dapat diperkenalkan ketika URL ditranskripsi atau mengeset atau mengalami perlakuan program pengolah kata. Karakter "<"dan ">"tidak aman karena digunakan sebagai pembatas di sekitar URL dalam teks bebas; tanda kutip ( """) digunakan untuk membatasi URL di beberapa sistem. Karakter "#"tidak aman dan harus selalu dikodekan karena digunakan di World Wide Web dan di sistem lain untuk membatasi URL dari pengidentifikasi fragmen / jangkar yang mungkin mengikutinya. Karakter"%"tidak aman karena digunakan untuk penyandian karakter lain. Karakter lain tidak aman karena gateway dan agen transportasi lain diketahui kadang-kadang memodifikasi karakter tersebut. Karakter-karakter ini "{", "}", "|", "\", "^", "~", "[", "]", dan "`".

Semua karakter yang tidak aman harus selalu dikodekan dalam URL . Misalnya, karakter "#"harus dikodekan dalam URL bahkan dalam sistem yang biasanya tidak berurusan dengan pengidentifikasi fragmen atau jangkar, sehingga jika URL disalin ke sistem lain yang menggunakannya, tidak perlu mengubah pengodean URL.

Marc Novakowski
sumber
2
1738 telah digantikan oleh 2396. ietf.org/rfc/rfc2396.txt Itulah spesifikasi Uri saat ini. Tidak masalah dalam kasus ini.
Steve Severance
40
Dan 2396 telah digantikan oleh 3986. Banyak orang melakukan kesalahan ini, karena RFC tidak dapat diubah, dan dengan demikian tidak memberi tahu pembaca bahwa mereka telah usang. Petunjuk: gunakan tools.ietf.org/html/rfcnnnn , seperti tools.ietf.org/html/rfc2396 sebagai gantinya, ini menampilkan metadata yang hilang di atas.
Julian Reschke
43

Mengapa harus dikodekan? Permintaan terlihat seperti ini:

GET /url HTTP/1.1
(Ignoring headers)

Ada 3 bidang yang dipisahkan oleh ruang putih. Jika Anda menaruh spasi di url Anda:

GET /url end_url HTTP/1.1

Anda tahu ada 4 bidang, server HTTP akan memberi tahu Anda itu permintaan yang tidak valid.

GET /url%20end_url HTTP/1.1

3 bidang => valid

Catatan: dalam string kueri (setelah?), Spasi biasanya dikodekan sebagai +

GET /url?var=foo+bar HTTP/1.1 

daripada

GET /url?var=foo%20bar HTTP/1.1 
Julien
sumber
Bagaimana jika var benar-benar "foo + bar" dan bukan "foo bar"?
Ivo3185
2
Saya berpendapat bahwa itu adalah persyaratan dari layer transport, bukan dari spesifikasi URI itu sendiri. GET jelas merupakan properti dari http: spesifikasi, bukan spesifikasi URL. Demikian pula Anda dapat berargumen bahwa kutipan dalam url "harus" dikodekan karena jika tidak, halaman web akan rusak. Tapi itu properti dari batasan format HTML, (yang ada strategi lain untuk melawan), bukan properti dari spesifikasi URL.
Kent Fredric
ietf.org/rfc/rfc1738.txt - Karakter yang tidak aman termasuk spasi) harus disandikan
Julien
@KentFredric Ini kemungkinan besar layer presentasi , bukan layer transport . Seperti yang ditulis Julien (hampir), spesifikasi URI asli ( RFC 1630 ) mengandung batasan ini, jadi itu adalah bagian dari spesifikasi URI itu sendiri terlepas dari perasaan pribadi Anda. Karena spesifikasi URI ditulis setelah konsep HTTP, sangat mungkin bahwa URI dirancang dengan mempertimbangkan HTTP, termasuk larangan terhadap penggunaan spasi, tetapi tidak terlalu penting, bukan? Yang benar adalah bahwa spec adalah apa spec itu.
Christopher Schultz
38

Jawaban singkat: tidak, Anda harus menyandikan spasi; itu adalah benar untuk mengkodekan ruang sebagai +, tetapi hanya dalam string; di jalan yang harus Anda gunakan %20.

Peter Hilton
sumber
1
Hai, saya juga bingung, kadang-kadang saya melihat buku itu menggunakan "+" tetapi kadang-kadang "% 20", dapatkah Anda menunjukkan beberapa contoh untuk ini? Saat pengguna mengirimkan formulir, bagaimana formulir menyandikan ruang? dengan karakter yang mana?
GMsoF
1
Lihat jawaban ini untuk detail tambahan.
DavidRR
bagaimana dengan bagian fragmen / hash? Bagaimana ruang harus disandikan di sana?
gumkins
@gumkins: fragmen (# dan setelah) tidak dikirim ke server. Dalam praktiknya, Anda dapat menggunakan% 20 atau + di mana saja untuk menyandikan spasi.
Julien
9

URL didefinisikan dalam RFC 3986 , meskipun RFC lain juga relevan tetapi RFC 1738 sudah usang.

Mereka mungkin tidak memiliki spasi di dalamnya, bersama dengan banyak karakter lain. Karena karakter terlarang itu sering perlu diwakili, ada skema untuk menyandikannya ke URL dengan menerjemahkannya ke ASCII yang setara dengan heksadesimal dengan awalan "%".

Sebagian besar bahasa pemrograman / platform menyediakan fungsi untuk encoding dan decoding URL, meskipun mereka mungkin tidak mematuhi standar RFC dengan benar. Sebagai contoh, saya tahu PHP tidak.

Rob Williams
sumber
7

Ya, ruang biasanya disandikan ke "% 20". Setiap parameter yang lolos ke URL harus disandikan, hanya untuk alasan keamanan.

pengguna54650
sumber
6

URL dapat memiliki Karakter Luar Angkasa di dalamnya dan mereka akan ditampilkan sebagai% 20 di sebagian besar browser, tetapi aturan penyandian browser sering berubah dan kita tidak bisa bergantung pada bagaimana browser akan menampilkan URL.

Jadi Alih-alih, Anda dapat mengganti Karakter Luar Angkasa di URL dengan karakter apa pun yang menurut Anda akan membuat URL Lebih Mudah Dibaca dan 'Cukup';) ..... O, jadi karakter umum yang disukai adalah "-", "_", "+" .... tetapi ini bukan kompulsi sehingga Anda dapat menggunakan karakter apa pun yang tidak seharusnya ada di URL.

Harap hindari%, &,}, {,], [, /,>, <sebagai Pengganti Karakter Ruang URL karena mereka dapat melakukan kesalahan pada browser dan Platform tertentu.

Seperti yang Anda lihat, Stak overflow sendiri menggunakan karakter '-' sebagai pengganti Space (% 20).

Selamat bertanya.

Surfer Web AM
sumber
5

URL tidak boleh memiliki ruang di dalamnya. Jika Anda perlu alamat yang benar, gunakan nilainya yang dikodekan%20

Chris Ballance
sumber
5

Dapatkah seseorang menunjuk ke RFC yang menunjukkan bahwa URL dengan spasi harus dikodekan?

URI, dan dengan demikian URL, didefinisikan dalam RFC 3986.

Jika Anda melihat tata bahasa yang didefinisikan di sana, Anda pada akhirnya akan mencatat bahwa karakter spasi tidak pernah dapat menjadi bagian dari URL yang secara sintaksis legal, sehingga istilah "URL dengan spasi" adalah kontradiksi dalam dirinya sendiri.

Julian Reschke
sumber
3

Untuk menjawab pertanyaan Anda. Saya akan mengatakan itu cukup umum untuk aplikasi untuk mengganti spasi dalam nilai yang akan digunakan dalam URL. Alasannya adalah untuk menghindari pengkodean URI yang semakin sulit dibaca.

Lihat artikel wikipedia ini tentang Persen-penyandian .

Eric Schoonover
sumber
2

Firefox 3 akan menampilkan %20s dalam URL sebagai spasi di bilah alamat.

Sophie Alpert
sumber
Ini bukan jawaban yang tepat untuk pertanyaan sederhana cukup: "Is a URL allowed to contain a space?". Bukan komentar.
Roko C. Buljan