URL'lerin neden kodlanması gerekir
Bir URL yalnızca sınırlı bir ASCII karakter kümesi içerebilir ve bunların birçoğunun bir görevi vardır. ? sorgu dizesini başlatır, & parametreleri ayırır, = adı değerden ayırır, # parçayı (fragment) başlatır ve / yol bölümlerini ayırır. Bir arama terimi veya dosya adı bu karakterlerden birini içeriyorsa, tarayıcı veya sunucu onu veri olarak değil yapı olarak okur.
Yüzde kodlama bu sorunu, sorunlu bir karakteri % ve ardından gelen iki onaltılık rakamla yazarak çözer. Boşluk %20, & işareti %26, / ise %2F olur. ASCII dışındaki karakterler önce UTF-8 baytlarına dönüştürülür ve her bayt ayrı ayrı kodlanır; böylece é %C3%A9 olur, tek bir emoji ise dört %XX grubuna dönüşür.
İhtiyaç duyduğunuz durumlar:
- Parametre olarak bir arama sorgusu, yönlendirme URL'si veya e-posta adresi içeren bir bağlantı oluşturmak.
- Bir URL'yi başka bir URL'nin içine koymak; örneğin bir giriş akışındaki
returnToveyaredirect_urideğeri. - Okunamaz bir
%çorbası olarak gelen webhook'ları ve analitik bağlantılarını hata ayıklamak. - İstenen yolların kodlanmış biçimde kaydedildiği sunucu loglarını okumak.
Bileşen modu ile tam URL modu
Tam URL kodla (:/?&= koru) onay kutusu iki farklı kural arasında seçim yapar ve yanlış olanı seçmek en yaygın hatadır.
Varsayılan: bir bileşeni kodlamak
Kutu işaretli değilken harfler, rakamlar ve - _ . ! ~ * ' ( ) dışındaki her şey kodlanır. Bu, sorgu dizesinde = işaretinden sonra gelecek veya tek bir yol bölümüne girecek tek bir değer için doğru seçimdir. rock & roll/live metni rock%20%26%20roll%2Flive olur; bu da parametre listesini bozmadan ?q= içinde güvenle durabilir.
Tam URL
Kutu işaretliyken bir URL'ye yapısını veren karakterler korunur: : / ? # & = + , ; @ $ ve yukarıda sayılanlar. Boşluklar, ASCII dışı harfler ve birkaç karakter daha yine kodlanır. Bunu, örneğin https://example.com/files/annual report.pdf gibi neredeyse geçerli olan tam bir adresiniz olduğunda ve yalnızca boşluğu düzeltmeniz gerektiğinde kullanın.
Tam URL modu yapısal bir & ile bir değerin içine ait olanı ayırt edemez. https://shop.example/?q=salt & pepper adresinde & olduğu gibi kalır ve sunucu bozuk bir parametre görür. Bu durumda yalnızca değeri bileşen modunda kodlayın ve URL'ye yapıştırın.
Boşluklar, artı işaretleri ve çift kodlama
Boşluklar için iki gelenek vardır. Yol ve genel URL kodlaması %20 kullanır; HTML form gönderimleri (application/x-www-form-urlencoded) ise + kullanır. Bu kodlayıcı her zaman %20 üretir ve bunu her sunucu her iki yerde de anlar.
Çözücü, çözmeden önce + işaretini boşluğa dönüştürür, çünkü form kodlamalı sorgu dizelerinde anlamı budur. Yan etkisi şudur: bir yoldaki C++ gibi hiç kodlanmamış gerçek bir artı işareti boşluk olarak çözülür. Orijinal metin gerçek bir artı işareti içeriyorsa %2B olarak gönderilmiş olmalıydı ve bu biçim doğru çözülür.
Çift kodlama diğer klasik tuzaktır. % işaretinin kendisi %25 olarak kodlanır; bu yüzden zaten kodlanmış bir dizeyi yeniden kodlayıcıdan geçirmek %20 değerini %2520 yapar. Çalışmayan bir bağlantıda %25 ve ardından iki onaltılık rakam görürseniz bir kez çözün ve sonucu kontrol edin.
Çözme başarısız olduğunda
"Geçersiz kodlanmış dize" mesajı, bir % işaretinden sonra iki onaltılık rakam gelmediğinde veya baytlar geçerli UTF-8 oluşturmadığında görünür. Tipik nedenler:
- Bir
%C3%A9dizisinin ortasından kesilmiş, eksik bir bağlantı. 50% offörneğindeki gibi hiç kodlanmamış gerçek bir yüzde işareti.- Uzun zaman önce Windows-1251 veya Latin-1 gibi eski tek baytlı bir kod sayfasıyla kodlanmış metin; bunlarda
é,%C3%A9yerine%E9olur.
İlk ikisinde bozuk kısmı elle düzeltin. Eski kod sayfaları için güvenilir bir otomatik çözüm yoktur, çünkü aynı bayt farklı kod sayfalarında farklı harfler anlamına gelir.
İlgili kodlamalar
Yüzde kodlama, rastgele baytları kompakt bir dizeye dönüştüren Base64 ile de, HTML içindeki metin için kullanılan & gibi HTML varlıklarıyla da aynı şey değildir. Başlıklardan okunabilir adresler oluşturmak için URL slug oluşturucu kodlamadan daha temiz sonuç verir: My Trip to Kraków, My%20Trip%20to%20Krak%C3%B3w yerine my-trip-to-krakow olur.
Kodlama ve çözme tarayıcınızda çalışır; bu yüzden URL içindeki token'lar veya özel parametreler hiçbir yere gönderilmez.