6 dakikalık okumaMühendislik

URL Kodlaması Açıklandı: Hangi Karakterler Kaçışlanmalı

URL kodlaması, bir karakterin URL sözdizimi olarak okunmasını önlemek için onu bir yüzde işareti ve iki onaltılık basamakla değiştirir. Hangi karakterlerin buna ihtiyacı var ve nerede bozuluyor.

Marius Voß
DevRel · edge infra
Bir sorgu dizesi olarak gösterilen URL kodlaması; bir boşluk ve bir ve işaretinin tek bir parametre değeri içinde yüzde dizilerine dönüştüğü

URL kodlaması, bir karakteri bir yüzde işareti ve iki onaltılık basamakla değiştirir: bir boşluk %20 olur, bir ve işareti %26 olur, bir soru işareti %3F olur. Amaç, bir karakteri veri olarak kullanmak istediğinizde onun URL sözdizimi olarak okunmasını durdurmaktır. Başka bir şey değil.

Bunun göründüğünden daha zor hissettirmesinin nedeni, bununla ilgili hemen hemen her sorunun gerçekte kapsam hakkında bir soru olmasıdır. Hangi karakterler, URL'nin hangi kısmında, hangi katman tarafından kaçışlanıyor? Kapsamı yanlış anlarsanız iki klasik başarısızlıktan birini elde edersiniz: sessizce kısaltılan bir takip parametresi veya https%3A%2F%2Fexample.com olarak gelen ve 404 veren bir hedef. Bu yazı, cevabı belirleyen iki karakter kümesini, kuralların değiştiği yerleri ve bir bağlantının gerçekte ne taşıdığını nasıl kontrol edeceğinizi kapsıyor. Bir yönlendirmenin bunların tümüyle ne yaptığına dair daha geniş bir resim için yönlendirme türlerine bakın.

Her Şeyi Belirleyen İki Küme

RFC 3986 bölüm 2.3, asla kodlama gerektirmeyen bir ayrılmamış (unreserved) küme tanımlar: harfler, rakamlar ve tam olarak dört noktalama işareti - tire, nokta, alt çizgi, tilde. Değeriniz yalnızca bunları içeriyorsa yapacak hiçbir şeyiniz yoktur.

Bunun dışındaki her şey iki kovadan birine girer. Ayrılmış (reserved) karakterler yapısal bir anlam taşır: : / ? # [ ] @ bir URL'nin parçalarını ayırır ve ! $ & ' ( ) * + , ; = o parçaların içindeki şeyleri ayırır. Bölüm 2.2 bunları listeler. Sözdizimi olarak yasaldırlar ve veri olarak göründüklerinde kodlanmalıdırlar. Geri kalanı ASCII dışındaki her şeydir; bu, UTF-8'e dönüştürüldükten sonra bayt bayt kodlanır - bu yüzden aksanlı bir harf genellikle üç yerine altı karaktere mal olur.

Bu, hatırlanmaya değer tek kuralı verir: bir karakter veri olduğunda ve aksi takdirde sözdizimi olarak okunacaksa kodlayın. İki parametre arasındaki bir ve işareti sözdizimidir. Bir kampanya adının içindeki bir ve işareti veridir ve onu olduğu gibi bırakırsanız parametre listesi orada sona erer.

Kampanya değerinin bir boşluk ve bir ve işareti içerdiği bir sorgu dizesi; değerin içinde doğru, URL'nin tamamında yanlış kodlanmış olarak gösteriliyor

Değeri Kodlayın, URL'yi Değil

Bu, en sık gördüğüm hatadır ve her zaman aynı şekildedir. Birinin bir URL'si vardır, bunun kodlanması gerektiğini bilir, bu yüzden tamamını bir kodlayıcıya yapıştırır ve şunu alır:

https%3A%2F%2Fexample.com%2Fspring%3Futm_campaign%3Dspring%20sale

Bu dizi bir URL değildir. Yalnızca başka bir URL'nin içinde bir değer olabilecek, URL şeklinde bir metin parçasıdır - bu, bir hedefi bir yönlendirici üzerinden geçirirken tam olarak ait olduğu yerdir ve onu açmaya çalıştığınızda tam olarak ait olmadığı yerdir.

Doğru yaklaşım, her değeri kendi başına kodlar:

https://example.com/spring?utm_campaign=spring%20sale&utm_source=flyer

Şema, ana bilgisayar, yol ayırıcıları ve ? ile & sözdizimi olarak bırakılır. Yalnızca değer değişti. Her dil bu ayrım için iki fonksiyon sunar ve yanlışını seçmek sorunun diğer yarısıdır: MDN'nin encodeURIComponent sayfası, encodeURI'nin bütün bir URI beklediği için ayrılmış karakterleri kasıtlı olarak olduğu gibi bıraktığını, encodeURIComponent'in ise bir parçasını beklediği için bunları kaçışladığını açıkça belirtir. Değerler encodeURIComponent ister. Python'da bu urllib.parse.quote, Go'da url.QueryEscape, PHP'de rawurlencode'dur.

Boşluk %20'dir, Artı Olduğu Yerler Dışında

İkisi de doğrudur, farklı yerlerde, ve bu konuyla ilgili en kafa karıştırıcı tek şeydir.

Bir yolda veya genel bir URI'de bir boşluk %20'dir. Bir HTML formunun oluşturduğu şekilde oluşturulmuş bir sorgu dizesinde bir boşluk +'dır, çünkü WHATWG URL standardındaki application/x-www-form-urlencoded serileştirmesinin belirttiği şey budur. Her iki biçim de, karşılaşmanız muhtemel her sunucu taraflı sorgu ayrıştırıcısı tarafından bir boşluk olarak okunur.

Tuzak ters yöndedir. Bir artı işareti veri ise - bir telefon numarası, bir arama terimi, spring+summer adlı bir kampanya - %2B olarak yazılması gerekir. Bir sorgu dizesinde olduğu gibi bırakılırsa bir boşluğa dönüşür ve CRM'inizdeki numaranın ülke kodunu neden kaybettiğini merak ederek bir öğleden sonra geçirirsiniz.

KarakterKodlanmışNeden önemli
space%20 veya ++ yalnızca bir sorgu dizesinin içinde, %20 her yerde
&%26Kodlanmamışsa, parametre listesi orada sona erer
?%3FKodlanmamışsa, ondan sonraki her şey sorgu olur
#%23Kodlanmamışsa, geri kalanı sunucuya asla ulaşmaz
+%2BBir sorguda kodlanmamışsa, bir boşluk olarak gelir
%%25Kodlanmamışsa, sonraki iki karakter yutulur

# satırı bir not hak ediyor, çünkü en kafa karıştırıcı hata raporunu üreten satır budur. Bir parça (fragment) sunucuya asla gönderilmez. Bir yönlendirme hedefine kodlanmamış bir # koyun ve sunucu kısaltılmış bir URL görürken tarayıcının adres çubuğu hâlâ doğru görünür, bu yüzden bunu bildiren kişi bağlantının sorunsuz olduğuna yemin eder.

Kampanya URL'lerini ara sıradan daha sık elle oluşturuyorsanız durun: UTM oluşturucumuz yazarken her değeri kodlar ve UTM adlandırma kuralları baştan hiç kodlama gerektirmeyen değerler seçmeyi kapsar. Sonucu kendi alan adınızda kısaltın ve kodlanmış karmaşa kimsenin bakması gereken bir şey olmaktan çıksın.

Çift Kodlama ve Nasıl Tespit Edilir

Çift kodlama, bir değerin her biri kendi işini yapan iki katmandan geçmesiyle ortaya çıkar. Yüzde işaretinin kendisi kaçışlanması gereken bir karakterdir, bu yüzden %20 %2520'ye dönüşür ve %2520 %252520'ye dönüşür.

Belirtiler, bir kez görüldükten sonra tanınabilir. Gerçek bir ziyaretçiye spring%20sale gösteren bir sayfa başlığı. Analitiğe görünür kaçış dizileriyle gelen bir parametre. İlk sıçramada çalışan ve ikincisinde başarısız olan bir yönlendirme. Neden neredeyse her zaman, zaten kodlanmış olarak gelen bir değerin etrafına sarılmış bir kodlama çağrısıdır; bu genellikle değerin kodlanmış biçimini saklayan bir veritabanından çıkması yüzündendir.

Çözüm, kodlamanın hangi katmana ait olduğuna karar vermek ve diğerlerini bundan uzak tutmaktır. Bir değeri okuduğunuzda bir kez kod çözün, bir URL'ye yazdığınızda bir kez kodlayın ve ikisini asla aynı fonksiyonda yapmayın.

Bir boşluğun %20'ye ve ardından %2520'ye dönüştüğü, tarayıcıdaki görünür belirtiyle birlikte iki kodlama katmanından geçen bir değer

Bunun Pratikte Isırdığı Yerler

Üç yer, karşılaşmanız muhtemel sırayla.

Takip parametreleri. Kodlanmamış bir ve işareti içeren bir kampanya değeri, parametre listesini kısaltır; bu yüzden oturum analitiğinize doğrudan trafik olarak düşer ve kampanya hiçbir pay almaz. Hiçbir hata vermez. GA4'te görünmeyen UTM parametreleri raporlama tarafından teşhisi kapsar ve tarayıcılar UTM parametrelerini kaldırır bir parametrenin tıklama ile sayfa arasında kaybolmasının diğer nedenini kapsar.

Yönlendirmeler. Sunucu kuralları tutarsız bir şekilde yeniden kodlar ve bir sorgu dizesinin hayatta kalıp kalmayacağı kullandığınız yönergeye bağlıdır. .htaccess'te bir 301 yönlendirmesi Apache için tam tabloyu içerir; kısa versiyonu, sorgu dizesini değiştiren bir kuralın sizinkini sessizce düşüreceğidir.

QR kodları. Kodlama, yük uzunluğunu şişirir ve yük uzunluğu, basılı kodun ne kadar yoğun olacağını belirler. Her boşluk bir yerine üç karaktere, her aksanlı harf altı karaktere mal olur. Birkaç kodlanmış kampanya adı içeren bir takip URL'si, kodu bir veya iki versiyon yukarı itebilir ve bu, kartvizit boyutunda gerçek bir farktır - QR kod taranmıyor tam olarak bu nedenle yük uzunluğunu dört nedenden biri olarak sayar. Tam URL yerine bir kısa bağlantı kodlamak, mevcut en ucuz çözümdür.

Bir Bağlantının Gerçekte Ne Taşıdığını Kontrol Edin

İki komut, neredeyse her tartışmayı çözer. İlki, bir yönlendirmeden sonra sunucunun ne aldığını gösterir:

curl -sI 'https://example.com/spring?utm_campaign=spring%20sale' | grep -i '^location'

İkincisi, parmaklarınıza güvenmek yerine kodlamayı sizin için oluşturur; bu, bir değer aynı anda birkaç sorunlu karakter içerdiğinde faydalıdır:

curl -G --data-urlencode 'utm_campaign=spring & summer sale' \
  --data-urlencode 'utm_source=flyer' \
  -o /dev/null -w '%{url_effective}\n' https://example.com/spring

Çıktıyı süsleme olarak değil veri olarak okuyun. %2520 görüyorsanız bir çift kodlama sorununuz vardır, bir değerin erken bittiğini görüyorsanız kodlanmamış bir ayırıcınız vardır ve başta %3A%2F%2F görüyorsanız URL'nin tamamını kodlamışsınızdır. Bir terminal açmak istemiyorsanız bağlantı denetleyicimiz yönlendirme kısmını bir tarayıcıda yapar.

Edinilmeye değer alışkanlık, bir kampanya yayına girmeden önce son URL'ye bir kez gözle bakmaktır. Kodlama hataları bir tarayıcıda görünmezdir ve bir terminalde açıktır ve size çalışma süresi yerine atıf kaybettirirler; bu yüzden bu kadar uzun süre hayatta kalırlar.

Temel Taşı Serisini Okuyun

Bu yazı mühendislik kümesinde yer alır. Yönlendirme tarafı için, yönlendirme türleri her durum kodunu ve istemci taraflı yöntemi kapsar ve URL kısaltıcılar nasıl çalışır tıklama ile sayfa arasında ne olduğunu kapsar.

Blogda İlgili Yazılar

Sıkça sorulan sorular

URL kodlaması nedir?

Bir karakteri, o karakterin URL sözdizimiyle karıştırılmaması için, onaltılık bayt değeriyle birlikte bir yüzde işaretiyle değiştirmektir. Bir boşluk %20 olur, bir ve işareti %26 olur, bir soru işareti %3F olur. Mekanizma RFC 3986'da tanımlanır ve yüzde kodlaması (percent-encoding) olarak da adlandırılır.

Hangi karakterlerin URL kodlanması gerekir?

RFC 3986'nın harfler, rakamlar ve dört karakter olan tire, nokta, alt çizgi ve tilde olarak tanımladığı ayrılmamış (unreserved) kümenin dışındaki her şey. Bunun dışındaki her şey, ya yapısal bir anlam taşıyan ayrılmış (reserved) noktalama işaretidir ya da ASCII dışında bir bayttır ve ikisi de, sözdizimi olarak değil bir değerin içinde göründüğünde yüzde kodlanmalıdır.

URL'nin tamamını mı yoksa yalnızca bir kısmını mı kodlamalıyım?

Yalnızca kısımlarını. Tam bir URL'yi bir kodlayıcıdan geçirmek, https://example.com'u https%3A%2F%2Fexample.com'a dönüştürür ve bu artık hiç URL değildir. Her sorgu parametresi değerini ve her yol segmentini ayrı ayrı kodlayın; şemayı, ana bilgisayarı ve ayırıcıları olduğu gibi bırakın.

Bir boşluk %20 mi yoksa bir artı işareti mi?

İkisi de, farklı yerlerde. Bir yolda ve genel bir URI'de bir boşluk %20'dir. HTML formlarının oluşturduğu şekilde oluşturulmuş bir sorgu dizesinde bir boşluk bir artı işaretidir, çünkü application/x-www-form-urlencoded serileştirmesinin belirttiği şey budur. Bu nedenle bir sorgu değeri içindeki gerçek bir artı işareti %2B olarak yazılmalıdır, aksi takdirde bir boşluk olarak okunur.

Çift kodlama nedir?

Zaten kodlanmış olan bir şeyi yeniden kodlamaktır; bu yüzden %20, yüzde işaretinin kendisi %25'e kaçışlandığı için %2520'ye dönüşür. Belirti, metninde gerçek bir %20 gösteren bir sayfa veya görünür kaçış dizileriyle gelen bir parametredir. Bu, neredeyse her zaman her biri yardımseverce kodlayan iki katmandan geçmiş bir değerdir.

Kodlanmış karakterler bir QR kodunu neden taramayı zorlaştırır?

Çünkü her biri bir karakter yerine üç karaktere mal olur. Bir boşluk, niyet olarak bir karakter ve yük olarak üç karakterdir; bu yüzden bir avuç dolusu, kodu bir veya iki versiyon yukarı itebilir, bu da aynı basılı alanda daha fazla modül anlamına gelir. Uzun bir takip URL'sini bir QR'a kodlamak, yalnızca yakın mesafeden taranan bir kod oluşturmanın en hızlı yollarından biridir.

Elido'yu deneyin

Bir URL yapıştırın, çalışan bir kısa bağlantı alın

Kayıt gerekmez. Bağlantı 30 gün boyunca yaşar. Sonsuza kadar saklamak için kaydolun.

Ücretsiz, kayıt gerekmez · Günde 2

Elido'yu deneyin

Özel alan adları, derinlemesine analitik ve açık bir API'ye sahip AB'de barındırılan URL kısaltıcı. Ücretsiz katman - kredi kartı gerekmez.

Etiketler
url encoding
percent encoding
encodeuricomponent
query string
utm parameters
url shortener

Okumaya devam et