Hreflang ile Canonical Çatışırsa Hangisi Önceliklidir?

Hreflang ve canonical etiketleri çatıştığında Google'ın önceliklendirme kararını temsil eden editoryal blog görseli

Bir sayfada hreflang etiketi bir dil sürümünü işaret ederken, canonical etiketi başka bir URL'yi yetkili sürüm olarak gösteriyorsa, Google iki sinyalden birini seçmek zorunda kalır. Bu çatışma nadiren kasıtlı kurulur; genellikle bir CMS güncellemesi, bir şablon değişikliği veya iki farklı ekibin aynı sayfa üzerinde ayrı ayrı çalışmasının sonucudur. Sonuç aynıdır: hreflang kümesi teknik olarak sitede durur, ama Google'ın davranışı hreflang'ın vaat ettiğiyle örtüşmez.

Sorunun can alıcı noktası şudur: canonical ve hreflang aynı katmanda çalışmaz. Canonical, hangi URL'nin indekslenmeye değer olduğuna karar veren bir birleştirme sinyalidir. Hreflang ise birleştirilmiş bu kümenin içinde hangi sürümün hangi dil ve bölgeye sunulacağını belirten bir eşleştirme sinyalidir. Biri küme oluşturur, diğeri kümenin içini dağıtır. Çatışma anında Google'ın izlediği sıra bu hiyerarşiyi yansıtır; sıra bilinmeden yapılan düzeltmeler genellikle sorunu başka bir sayfaya taşımaktan öteye gitmez.

Google'ın işleme sırası: önce canonical, sonra hreflang mı?

Google, bir URL kümesini değerlendirirken önce canonical sinyallerini işleyerek hangi sayfaların birbirinin kopyası veya varyantı olduğuna dair bir grup oluşturur. Bu grup içinde bir "seçilmiş" sürüm belirlenir. Hreflang etiketleri ancak bu seçim tamamlandıktan sonra devreye girer; seçilmiş sürüm etrafında hangi dil ve bölge alternatiflerinin sunulacağını tarif eder. Yani hreflang, canonical'ın kararını değiştirmez, onun üstüne bina edilir.

Bu sıralamanın pratik sonucu açıktır: bir sayfanın canonical'ı kendisini değil başka bir URL'yi gösteriyorsa, o sayfa üzerindeki hreflang bildirimi ölü bir işaret haline gelir. Google, o sayfayı zaten "asıl sürüm değil, bir varyant" olarak sınıflandırmıştır; üzerine ne yazılırsa yazılsın hreflang kümesine ciddi bir katkı sağlamaz. Etiket sitenin kaynak kodunda dursa da, aramada hiç etkisi olmayan bir dekorasyona dönüşür.

Self-referencing olmayan canonical, hreflang kümesini nasıl geçersiz kılar

Çok dilli sitelerde en sık rastlanan çatışma biçimi budur: dil sürümlerinin her biri kendi URL'sine self-referencing canonical vermesi gerekirken, bir veya birkaç sürüm yanlışlıkla ana dile ait sayfayı canonical olarak gösterir. Bu genellikle şablon mirasından kaynaklanır; yeni dil sürümü eklenirken canonical bloğu kopyalanır ama URL değişkeni güncellenmez, sabit bir değer kalır.

Sonuç, hreflang etiketinin İngilizce sayfayı işaret ettiği ama İngilizce sayfanın canonical'ının Türkçe sayfaya döndüğü bir yapıdır. Google bu durumda İngilizce sayfayı bağımsız bir sürüm olarak değil, Türkçe sayfanın bir kopyası olarak değerlendirir. Arama sonuçlarında İngilizce sorgu yapan bir kullanıcıya Türkçe sayfa çıkabilir, ya da İngilizce sayfa hiç görünmez; her ikisi de hreflang doğru kurulu göründüğü halde yanlış sayfanın gösterildiği senaryonun köküdür.

Bu hatanın tespiti basittir ama gözden kolayca kaçar: her dil sürümünün kaynak kodunda canonical etiketinin gerçekten kendi URL'sini mi, yoksa başka bir sürümü mü gösterdiği tek tek kontrol edilmelidir. Şablon düzeyinde otomatik üretilen bir hata olduğu için, bir sayfada görülen sorun genellikle o dildeki tüm sayfalarda tekrar eder.

Farklı diller aynı canonical'a işaret ederse hreflang kümesi buharlaşır

Daha zor tespit edilen bir varyant, birden fazla dil sürümünün kendi self-referencing canonical'ını değil, ortak bir üçüncü URL'yi (örneğin eski bir tek dilli sürüm veya bir kategori sayfası) canonical olarak göstermesidir. Bu genellikle site geçişleri sonrasında ortaya çıkar: eski yapıdan kalan bir canonical kuralı, yeni dil sürümlerine miras kalır ve kimse fark etmeden aylarca çalışır.

Bu senaryoda Google'ın gördüğü tablo şudur: beş farklı dil URL'si var, hepsi hreflang ile birbirine bağlı, ama hepsi de aynı altıncı URL'yi yetkili sürüm olarak gösteriyor. Google, kümenin gerçek merkezinin bu beşi değil, işaret edilen altıncı URL olduğuna karar verir. Hreflang etiketleri artık birbirine bağlı beş sayfayı değil, aynı hedefe yönlenen beş "gölge" sayfayı tanımlar; kümenin kendisi anlamını kaybeder.

Bu durumun düzeltilmesi tek bir sayfada yapılacak bir müdahale değildir; her dil sürümünün canonical değerinin kendi URL'sine çekilmesi, ardından hreflang kümesinin yeniden doğrulanması gerekir. Düzeltme öncesi ve sonrası arasında bir geçiş dönemi oluşur; Google'ın yeni kümeyi tanıyıp eski değerlendirmeyi bırakması anında gerçekleşmez.

Canonical zinciri (redirect) hreflang hedefini nasıl bozar

Canonical etiketinin doğru URL'yi göstermesi yetmez; o URL'nin kendisi de doğrudan erişilebilir olmalıdır. Hreflang bir dil sürümüne işaret ettiğinde ve o sürümün URL'si bir 301 zinciriyle başka bir yere yönlendiriliyorsa, Google zinciri takip etmek zorunda kalır. Zincir bir adımdan uzunsa, veya zincirin sonunda çıkan URL başlangıçtaki hreflang bildirimindeki dil veya bölge ile uyuşmuyorsa, sinyal parçalı hale gelir.

Bu durum özellikle domain taşıma veya URL yapısı değişikliği sonrasında görülür: eski dil URL'leri yeni yapıya yönlendirilirken hreflang bildirimleri güncellenmemiş, hâlâ eski URL'leri işaret ediyor olabilir. Çok dilli site taşımalarında redirect zinciri tek dilli taşımadan farklı bir risk taşır; her dil sürümü için ayrı bir yönlendirme haritası ve ayrı bir hreflang güncellemesi gerekir, biri unutulduğunda çatışma o sürümde yeniden doğar.

Pratik kural şudur: hreflang bir URL'yi işaret ediyorsa, o URL 200 durum koduyla doğrudan yanıt vermeli ve kendi canonical'ını kendisine vermelidir. Zincirin herhangi bir halkasında bu iki koşuldan biri bozulursa, o dil sürümü kümeden düşme riski taşır.

Doğru öncelik modelini kurmanın pratik sırası

Çatışmayı önlemenin en güvenilir yolu, iki etiketi aynı anda değil, sıralı olarak kurmaktır. Önce her dil sürümünün kendi URL'sine self-referencing canonical verdiği doğrulanır; bu adım hreflang'dan tamamen bağımsız çalışır ve kendi başına test edilebilir. Canonical katmanı temiz olduğunda, hreflang bildirimleri bu temiz kümenin üzerine eklenir.

Canonical etiketin çok dilli yapıdaki varsayılan kararı her sürümün kendini işaret etmesidir; bu kural yalnızca aynı dilin farklı ülke varyantları birleştirilmek istendiğinde bilinçli olarak esnetilir. Bu istisna dışında, canonical'ın herhangi bir dil sürümünde kendisinden başka bir URL'yi göstermesi bir hata sinyali olarak okunmalıdır, tasarım kararı olarak değil.

Yeni bir dil sürümü eklenirken bu sıra tersine çevrilmemelidir. Önce hreflang etiketleri yazılıp canonical'ın doğruluğu sonradan kontrol edilirse, aradaki geçiş süresinde Google'ın kümeyi hangi durumda gördüğü kontrol dışına çıkar. İki etiketin aynı deploy içinde, ama canonical'ın önce doğrulanmış olduğu bir sırayla yayına alınması, çatışma riskini üretim aşamasında kapatır.

Çatışma teşhisi: hangi araçla hangi sinyal doğrulanır

Bir çatışma şüphesi doğduğunda, ilk bakılacak yer sayfanın kendi kaynak kodudur; canonical etiketinin gösterdiği URL ile adres çubuğundaki URL'nin birebir aynı olup olmadığı gözle bile kontrol edilebilir. Bu adım hiçbir araç gerektirmez ve en sık rastlanan hatayı, yanlış self-referencing canonical'ı, dakikalar içinde ortaya çıkarır.

Search Console'un URL İnceleme aracı bir adım öteye gider: Google'ın o URL için "kullanıcı tarafından belirtilen canonical" ile "Google tarafından seçilen canonical" alanlarını ayrı ayrı gösterir. Bu iki alan farklıysa, Google sitenin beyan ettiği canonical'ı kabul etmemiş demektir; bu genellikle "Alternate page with proper canonical tag" statüsü olarak raporlanır ve hreflang kümesinin o sayfada neden çalışmadığını doğrudan açıklar.

Kapsam raporundaki hreflang hataları sekmesi ise kümenin genel sağlığını gösterir, ama tekil bir çatışmayı her zaman ayrı bir hata satırı olarak işaretlemez; bazı durumlarda hata hiç görünmez, sadece yanlış sayfa sessizce gösterilir. Bu yüzden GSC raporu tek başına yeterli kanıt sayılmamalı, canlı URL testi ve kaynak kod kontrolüyle birlikte okunmalıdır. Duplicate içerik olarak işaretlenen dil sürümlerinde de aynı üçlü doğrulama sırası geçerlidir: önce canonical, sonra hreflang, sonra içerik farkı.

Teşhis oturunca düzeltme çoğu zaman tek şablona iner; sayfa sayfa yama, aynı hatayı ertesi dil sürümünde yeniden üretir. Canonical önce, hreflang sonra. Sıra tersine çevrilirse hreflang bloğu dolu görünür, Google yine de sayfayı varyant sayar. Yeni dil veya yeni şablon bu iki katmanı ayrı ayrı doğrulamadan yayına çıkmamalı; bozulma kendiliğinden olmaz, canonical'a dokunup hreflang'ı eski URL'de bırakan sonraki bir değişiklikle gelir.