Alat pembangun · URL pengekod & penyahkod
WHATWG URL Standard lwn RFC 3986: mengapa pelayar dan perpustakaan tidak bersetuju
· Latar belakang
pengekodan url piawaian alat pembangun
Terdapat dua takrifan hidup bagi URL dan mereka tidak bersetuju dengan sengaja. Siaran ini menerangkan sebab WHATWG menulis standardnya sendiri, di mana kedua-duanya berbeza dalam pengekodan dan penghuraian, dan yang mana satu kod anda ikuti.
URL yang ditolak oleh perpustakaan yang ketat dan pelayar dimuatkan dengan senang hati — satu rentetan, dua keputusan
Rentetan dengan garis miring ke belakang dalam JavaScript mungkin ditafsirkan dengan lancar oleh pelayar anda sebagai sebahagian daripada laluan URL. Rentetan yang sama mencapai bahagian belakang perpustakaan Python, dan ia enggan menghuraikannya kerana garis miring ke belakang tidak dibenarkan. Satu URL, dua hasil berbeza. Kedua-duanya tidak salah—mereka mengikut piawaian yang berbeza. Piawaian WHATWG menerangkan perkara yang sebenarnya dilakukan oleh pelayar dengan URL dunia sebenar, termasuk cara mereka mengendalikan input yang tidak betul. RFC 3986 mentakrifkan tatabahasa formal yang sepatutnya dipatuhi oleh URL. Banyak perpustakaan bahagian belakang yang dibina di atas RFC 3986 menguatkuasakan tatabahasa itu dengan ketat dan menolak apa-apa di luarnya.
Perbezaan ini penting apabila anda memindahkan data antara persekitaran. URL pelayar menerima mungkin gagal pengesahan dalam alat hujung belakang. Memahami standard yang mana kod anda laksanakan menghalang masalah hantu penyahpepijatan—URL berfungsi dengan baik di satu tempat tetapi gagal secara misteri di tempat lain tanpa sebab yang jelas.
Mengapa WHATWG dimulakan semula — menerangkan perkara yang sebenarnya dilakukan oleh pelayar dengan input yang salah dan bukannya yang sah
Kumpulan Kerja WHATWG dibentuk dalam 2004 untuk menyeragamkan cara pelayar sebenarnya mengendalikan URL dalam amalan, dan bukannya menentukan peraturan formal yang lebih ketat yang tidak akan dipatuhi oleh pelayar. RFC 2396 menerangkan spesifikasi tatabahasa formal, tetapi pelayar dalam amalan tidak pernah mengikutinya dengan betul. Pelayar dunia nyata membangunkan peraturan praktikal untuk bertolak ansur dengan ruang, mengendalikan aksara yang dilepaskan dan pulih daripada input yang tidak betul yang RFC tidak jangkakan atau jangkakan.
RFC 3986 tiba di 2005 dengan tatabahasa formal untuk URL yang dibentuk dengan baik dan keperluan yang ketat. Pelayar melaksanakan WHATWG; perpustakaan bahagian belakang sering melaksanakan RFC 3986.
Set pengekodan berbanding aksara tersimpan — cara senarai setiap komponen URL Standard berkaitan dengan kategori RFC 3986
RFC 3986 membahagikan aksara kepada tiga kategori: reserved, unreserved dan semua perkara lain yang mesti dikodkan. Aksara terpelihara seperti titik bertindih, garis miring, tanda soal dan cincang mempunyai makna struktur dalam URL. Aksara tidak terpelihara ialah huruf, angka, sempang, garis bawah, noktah dan tilde; ini sentiasa selamat. Semua yang lain mendapat peratusan dikodkan sebagai bait. Piawaian menyediakan satu peraturan yang jelas: ketahui kategori mana watak anda tergolong.
Piawaian WHATWG URL mengambil pendekatan berasaskan komponen. Ia menentukan peraturan pengekodan yang berbeza untuk skema, kuasa, laluan, pertanyaan dan serpihan secara berasingan dan bukannya menggunakan kategori global. Ampersand mungkin dikodkan dalam laluan tetapi dibiarkan sahaja dalam rentetan pertanyaan. Ruang sentiasa dikodkan, tetapi perwakilan tepat berbeza mengikut konteks. Reka bentuk setiap komponen ini sepadan dengan gelagat pelayar dengan lebih baik tetapi memerlukan mengetahui bahagian mana URL yang anda pengekodkan.
Toleransi ralat: ruang, garis miring ke belakang dan tab — memasukkan satu standard ditolak dan satu lagi pembaikan
Ruang mesti menjadi %20 di bawah kedua-dua standard, tetapi pelayar secara senyap menukar ruang literal. Garis miring ke belakang dilarang oleh kedua-dua standard, namun sesetengah pelayar menganggapnya sebagai pemisah laluan. Tab, baris baharu dan aksara kawalan adalah dilarang. WHATWG menentukan tingkah laku penghurai yang lembut: tukar atau abaikan mereka.
Aksara bukan ASCII seperti é atau 中 mesti dikodkan peratus menggunakan pengekodan UTF-8. RFC 3986 sebenarnya tidak menyatakan langkah pengekodan aksara itu sendiri; ia menganggap bait wujud tetapi tidak menyatakan cara mendapatkannya daripada teks. Piawaian WHATWG secara eksplisit memerlukan UTF-8: tukar rentetan menjadi UTF-8 bait dahulu, kemudian peratus mengekodnya. Kedua-dua piawaian mencapai hasil pengekodan yang sama, tetapi ia bermula daripada andaian asas yang berbeza dan tidak jelas tentang perkara yang sama.
Contoh yang berjaya: menghuraikan URL dengan garis miring ke belakang dan ruang dalam kedua-dua model — output dibandingkan
Ambil contoh rentetan "https://example.com/café\ carian". Pelayar menemui garis miring ke belakang dan melihatnya sebagai watak laluan; ia melihat ruang dan mengekodnya kepada %20, menghasilkan sesuatu seperti https://example.com/café%5C%20search. Penghurai RFC 3986 menolak keseluruhan URL dengan serta-merta kerana garis miring ke belakang adalah dilarang dan ruang adalah dilarang. Pelayar terus menghuraikan; parser yang ketat berhenti sepenuhnya. Cuba contoh lain: "https://user@example.com:80/path?q=a&b=c". Kedua-dua piawaian mengenal pasti maklumat pengguna, hos, port, laluan dan pertanyaan dengan jelas. Mereka bersetuju sepenuhnya tentang URL berstruktur ini. Perselisihan sahaja berlaku pada input luar biasa atau salah bentuk.
Buka URL pengekod & penyahkod dan bandingkan mod RFC 3986 dengan gelagat pelayar. Tampalkan rentetan dengan ruang, garis miring ke belakang atau bekas tepi yang lain. Alat ini menunjukkan kepada anda dengan tepat cara setiap standard mengubah input yang sama secara berbeza. Anda akan melihat serta-merta yang mana satu lebih ketat dan apa yang dilakukan oleh setiap satu.
Mana satu yang digunakan oleh persekitaran anda — pelayar dan Node mengikut Piawaian URL; banyak perpustakaan pelayan mengikuti RFC, yang diterangkan secara umum
Dalam pelayar, JavaScript menggunakan WHATWG URL Standard secara lalai. URL API melaksanakannya dengan tepat. Node.js juga menggunakan WHATWG. Perpustakaan Python cenderung untuk melaksanakan RFC 3986; urllib mengikutinya dengan teliti. Perpustakaan Java berbeza-beza; java.net.URL cenderung ke arah RFC 3986. Peti url Rust mengikuti WHATWG. Go's net/url dipengaruhi oleh WHATWG. Ini adalah corak umum, bukan peraturan mutlak.
Apabila anda membina URL secara pengaturcaraan dan ia bergerak antara pelayar dan hujung belakang, pilih satu standard dan patuhinya. Gunakan URL API pelayar untuk WHATWG. Jika perpustakaan bahagian belakang anda lebih ketat, ia bukan percanggahan tetapi pilihan reka bentuk.
Perkara ini tidak meliputi — penghuraian nama hos, literal IPv6 dan pemprosesan IDNA
Penghuraian nama hos melibatkan IDNA, peraturan punycode dan pendaftar yang melangkaui URL menghuraikan dirinya sepenuhnya. Alamat IPv6, skema khas seperti mailto: atau data:, dan komponen kosong adalah topik berasingan yang berbeza daripada pengekodan peratus sepenuhnya. Had panjang domain dan kesahihan nama hos berbeza mengikut pendaftar dan tidak berkaitan dengan perbincangan ini. Juga dikecualikan: rujukan relatif dan peraturan penghuraian khusus skema. Siaran ini sahaja memfokuskan pada pengekodan dan menghurai perbezaan.
Perbincangan ini memberi tumpuan kepada perbezaan pengekodan dan penghuraian yang membezakan piawaian ini. Tidak termasuk peraturan nama hos, peraturan DNS dan kelakuan khusus skema menghalang kekeliruan tentang peraturan pengekodan peratus.
Bawa pulang: URL yang sama adalah sah di satu dunia dan ralat di dunia yang lain — cara pengekod & penyahkod URL memberi anda pengekodan biasa RFC 3986 supaya anda boleh melihat perkara yang dinormalkan oleh pelayar
Rentetan URL yang sama boleh sah di bawah satu standard dan tidak sah di bawah yang lain. Kedua-duanya betul dalam matlamat reka bentuk mereka sendiri. Apabila mengekod komponen URL secara pemprograman, gunakan alat yang sesuai untuk persekitaran anda. WHATWG menerangkan perkara yang sebenarnya dilakukan oleh pelayar; RFC 3986 mentakrifkan tatabahasa formal. Pengekod & penyahkod URL menunjukkan peraturan RFC 3986 bersama-sama gelagat pelayar supaya anda boleh melihat perbezaan yang tepat dan memilih yang sesuai dengan situasi anda.
Masalah paling kerap muncul apabila URL merentasi sempadan pelayar-ke-belakang. Memahami perbezaan ini bermakna mengendalikan lintasan itu dengan sengaja dan bukannya secara tidak sengaja atau secara tidak sengaja.