Bu makalede7 bölüm
- Teknoloji
- hreflang, ISO 639-1, ISO 3166-1 alpha-2, XML sitemap, HTTP Link başlığı, rel=canonical
- Konu
- Çok dilli/çok bölgeli sitelerde hreflang uygulaması ve denetimi
- Seviye
- Orta–ileri
- Ön koşullar
- Çok dilli site yapısının (alt dizin, alt alan adı veya ccTLD) belirlenmiş olması
- Sayfa şablonlarına veya sitemap üretimine erişim
- Bir tarama aracı (ör. Screaming Frog) ve Search Console erişimi
Çok dilli bir sitede Almanya’dan gelen kullanıcıya Türkçe sayfa gösteriliyorsa ilk bakılacak yer hreflang kümesidir. Bu işaretleme, aynı içeriğin dil ve bölge sürümlerini arama motoruna bildirir. Kurulumu basit görünür; ama tek bir eksik dönüş bağlantısı ya da yanlış bölge kodu tüm kümenin yok sayılmasına yeter. Hata sessizdir: site çalışır, yalnızca yanlış sürüm sıralanır. Bu rehber, yapı kararı verildikten sonra hreflang’in nasıl hatasız kurulacağını ve nasıl denetleneceğini anlatır.
hreflang ne işe yarar, ne işe yaramaz
hreflang bir sıralama sinyali değildir. Aynı sorguda birden çok dil sürümü aday olduğunda doğru olanın seçilmesine yardım eder. Örneğin İngilizce ve Türkçe sürümleri olan kurumsal bir web sitesinin hizmet sayfasında, Türkiye’den İngilizce arama yapan kullanıcıya hangi sürümün gösterileceği hreflang ve diğer sinyallerle belirlenir.
Yapmadığı işler de en az bu kadar önemlidir:
- Kullanıcıyı yönlendirmez. Tarayıcı diline göre otomatik yönlendirme ayrı bir uygulamadır ve Googlebot’un sürümlere erişimini engelleyebileceği için önerilmez. Dil seçici bağlantıları kullanın.
- Canonical’ın yerine geçmez. Her dil sürümü kendine işaret eden bir canonical taşır.
- Çeviri kalitesini telafi etmez. Yalnızca şablon metinleri çevrilmiş, gövdesi aynı dilde kalan sayfalar yinelenen içerik gibi değerlendirilebilir.
hreflang’e geçmeden önce yapı kararı (alt dizin, alt alan adı veya ülke kodlu alan adı) verilmiş olmalıdır. Bu kararın sonuçları çok dilli site mimarisi yazısında. Yapı oturmadan etiket yazılmaz.
Uygulama yöntemleri: HTML, HTTP başlığı, sitemap
Google üç yöntemi eşdeğer kabul eder. Bir yöntem seçin ve tutarlı uygulayın; aynı küme için birden çok yöntem kullanıyorsanız hepsi birebir aynı bilgiyi taşımalıdır. İki kaynak birbirini tutmuyorsa sorun ararken önce oraya bakın.
| Yöntem | Uygun olduğu durum | Dikkat |
|---|---|---|
HTML <link> |
Az dil sürümü, şablona erişim var | Her dil eklendiğinde tüm sayfaların head’i büyür |
HTTP Link başlığı |
PDF gibi HTML olmayan dosyalar | Sunucu/CDN yapılandırmasında yönetilir, görünürlüğü düşüktür |
| XML sitemap | Çok sayıda dil veya sayfa | Sitemap üretimi CMS içeriğiyle senkron kalmalı |
HTML head içinde
<link rel="alternate" hreflang="tr" href="https://www.example.com/tr/hizmetler/yedekleme/" />
<link rel="alternate" hreflang="en" href="https://www.example.com/en/services/backup/" />
<link rel="alternate" hreflang="de-DE" href="https://www.example.com/de/leistungen/datensicherung/" />
<link rel="alternate" hreflang="x-default" href="https://www.example.com/en/services/backup/" />
Bu bloğun aynısı kümedeki her sayfada bulunur ve her sayfa kendini de listeler. Kendine referansı unutmak, sahada en sık karşılaştığımız eksiklerden biridir.
HTTP başlığıyla
Link: <https://www.example.com/tr/katalog.pdf>; rel="alternate"; hreflang="tr",
<https://www.example.com/en/catalog.pdf>; rel="alternate"; hreflang="en"
XML sitemap ile
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://www.example.com/tr/hizmetler/yedekleme/</loc>
<xhtml:link rel="alternate" hreflang="tr" href="https://www.example.com/tr/hizmetler/yedekleme/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://www.example.com/en/services/backup/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://www.example.com/en/services/backup/"/>
</url>
<url>
<loc>https://www.example.com/en/services/backup/</loc>
<xhtml:link rel="alternate" hreflang="tr" href="https://www.example.com/tr/hizmetler/yedekleme/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://www.example.com/en/services/backup/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://www.example.com/en/services/backup/"/>
</url>
</urlset>
Sitemap yönteminde her dil sürümü kendi <url> girdisi olarak yer alır ve her girdide kümenin tamamı tekrarlanır. xhtml ad alanı bildirimi unutulursa dosya geçerli XML olmaz. Tüm küme okunmaz.
Dil ve bölge kodları, x-default
Değer biçimi dil veya dil-BÖLGE’dir. Dil kodu ISO 639-1 (iki harf), bölge kodu ISO 3166-1 alpha-2 olmalıdır. Büyük-küçük harf duyarlı değildir; de-DE yazımı okunabilirlik için yaygın gelenektir. Yalnız bölge kodu kullanılamaz: Birleşik Krallık’ı hedeflemek için hreflang="gb" yazmak geçersizdir, doğrusu en-GB’dir. Aynı şekilde hreflang="de" Almanya’yı değil, Almanca dilini ifade eder. Çince gibi dillerde yazı sistemi alt etiketi (zh-Hant, zh-Hans) kullanılabilir.
| Hatalı | Doğru | Neden |
|---|---|---|
en-UK |
en-GB |
Birleşik Krallık’ın ISO kodu GB’dir |
tr-TU |
tr-TR |
Türkiye’nin ISO kodu TR’dir |
en-EU |
en veya ülke bazlı kodlar |
EU bir ülke kodu olarak desteklenmez |
ge (Almanca) |
de |
Almancanın ISO 639-1 kodu de’dir |
tr_TR |
tr-TR |
Ayırıcı alt çizgi değil tiredir |
x-default, hiçbir dil/bölge eşleşmesi olmayan kullanıcıya gösterilecek sürümü belirtir. Genellikle dil seçici sayfası veya uluslararası (çoğunlukla İngilizce) sürüm seçilir. Zorunlu değildir ama önerilir; özellikle bölgesel sürümlerin yanında genel bir sürüm varsa karışıklığı azaltır.
WordPress tarafında bilinmesi gereken bir tuzak var: get_locale() çıktısı tr_TR biçimindedir. Çok dilli eklentiler bunu dönüştürür, ancak şablona elle hreflang yazan geliştirici bu değeri doğrudan basarsa alt çizgili, geçersiz kodlar üretir. Tarama aracı bunu hemen gösterir.
Karşılıklılık ve canonical uyumu
hreflang ilişkisi iki yönlüdür: A sayfası B’yi alternatif gösteriyorsa B de A’yı göstermelidir. Dönüş bağlantısı olmayan ilişki yok sayılır. Bunun nedeni güvenliktir; aksi halde herhangi bir site başka bir siteyi kendi dil sürümü ilan edebilirdi.
Canonical tarafında kural basittir: hreflang’de listelenen her URL kendi canonical URL’si olmalıdır. Denetimlerde en sık rastlanan çelişkiler:
- İngilizce sayfanın canonical’ı Türkçe sayfaya işaret ediyor. İngilizce sayfa “Türkçe sayfanın kopyası” ilan edilmiş olur, küme bozulur.
- hreflang’de parametreli URL (
?lang=en) listelenmiş, canonical ise parametresiz URL’yi gösteriyor. - hreflang’de
httpveya sonu eğik çizgisiz sürüm var, canonicalhttpsve eğik çizgili.
Listelenen URL’ler 200 dönmeli, noindex taşımamalı ve robots.txt ile engellenmemelidir. Bu sinyallerin genel kullanımı canonical, noindex, robots.txt ve sitemap yazısında ayrıntılı.
Sık hatalar tablosu
| Hata | Belirti | Düzeltme |
|---|---|---|
| Dönüş bağlantısı yok | Tarama aracında “missing return links” | Kümeyi tüm sürümlerde aynı listeyle üret |
| Kendine referans yok | Küme eksik görünür | Her sayfa kendi dil satırını da içermeli |
| Yönlendirilen URL listelenmiş | 3xx dönen hedef | Nihai 200 URL’yi yaz |
| noindex veya 404 sayfaya işaret | Küme kısmen geçersiz | Sürüm yoksa satırı kaldır |
| Göreli URL | href="/en/..." |
Tam, mutlak URL kullan |
| Ana sayfaya toplu eşleme | Tüm İngilizce hreflang’ler /en/ ana sayfasına gidiyor | Sayfa düzeyinde gerçek karşılığı eşle; yoksa satır koyma |
| head dışında link | Etiket body içinde veya geçersiz öğeden sonra | head’in başına yakın ve geçerli HTML içinde yerleştir |
Son satır özellikle sinsidir. head içine yerleştirilmiş geçersiz bir öğe (örneğin bir eklentinin bastığı <div> veya <img>) tarayıcı ayrıştırıcısının head’i erken kapatmasına yol açabilir. O noktadan sonraki hreflang satırları body’de kalır ve dikkate alınmaz. Kaynak kodda satırlar duruyor gibi görünür. Render edilmiş DOM’a bakın.
Doğrulama ve izleme
Search Console’daki eski Uluslararası Hedefleme raporu kaldırıldığı için hreflang denetimi büyük ölçüde teknik SEO tarama araçlarıyla yapılır. Bizim uyguladığımız kontrol sırası şöyle:
- Site taraması: Screaming Frog SEO Spider gibi bir araçta hreflang çıkarımını etkinleştirip tüm siteyi tarayın. Eksik dönüş bağlantısı, geçersiz kod, canonical dışı URL ve 200 olmayan hedef raporlarını dışa aktarın.
- Sitemap kontrolü: Sitemap yöntemi kullanılıyorsa sitemap’i ayrı bir liste olarak tarayın; CMS’ten silinen sayfaların sitemap’te kalıp kalmadığına bakın.
- Örnek sayfa testi: Önemli sayfalarda URL Denetimi aracıyla canlı testi çalıştırın ve render edilmiş HTML’de hreflang satırlarının head içinde olduğunu doğrulayın.
- Sonuç izleme: Search Console Performans raporunda ülke filtresiyle sayfaları inceleyin. Almanca karşılığı olan sayfalarda Almanya filtresindeki gösterimlerin büyük kısmını Türkçe URL’ler alıyorsa küme çalışmıyor olabilir.
Komut satırında hızlı bir kontrol için bir sayfanın hreflang satırlarını, başlıklarını ve hedeflerin durum kodlarını çekebilirsiniz:
# HTML içindeki hreflang satırları
curl -s https://www.example.com/tr/hizmetler/yedekleme/ | grep -io '<link[^>]*hreflang[^>]*>'
# HTTP Link başlığı (PDF vb.)
curl -sI https://www.example.com/tr/katalog.pdf | grep -i '^link:'
# Listelenen hedeflerin durum kodları
for u in https://www.example.com/tr/hizmetler/yedekleme/ https://www.example.com/en/services/backup/; do
printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$u"
done
Kalıcı bir kontrol de ekleyin: bir dil sürümü silindiğinde ya da slug’ı değiştiğinde diğer dillerdeki hreflang satırları otomatik güncelleniyor mu? Elle yönetilen kümeler, site taşımalarında en sık bozulan yapılardır; taşıma sırasında bu kontrolün nasıl yapılacağı web sitesi taşırken SEO kaybını önleme yazısında. Kuralların resmi tanımı için Google’ın yerelleştirilmiş sürümler dokümantasyonuna başvurun.
Çok dilli bir sitede hreflang, içerik modelinden ayrı düşünülemez. Sürümler arasındaki eşlemeyi CMS’te veri olarak tutmak, çok dilli ve çok bölgeli web sitesi projelerinde ilk kurduğumuz yapıdır. Eşleme veride durursa etiket kendiliğinden doğru çıkar.
Sık sorulan sorular
Tek dilli bir sitede hreflang kullanmak gerekir mi?
Hayır. hreflang yalnızca aynı içeriğin farklı dil veya bölge sürümleri olduğunda anlamlıdır; tek dilli sitede kendine referans veren tek satır bir şey kazandırmaz. html lang özniteliğini doğru ayarlamak erişilebilirlik ve tarayıcılar için yine gereklidir, ancak Google dil tespitinde bu özniteliğe dayanmadığını belirtir.
Türkçe sayfa için tr mi yoksa tr-TR mi yazmalıyım?
Türkçe içerik yalnız Türkiye’yi hedefliyorsa ikisi de geçerlidir. Başka ülkelerdeki Türkçe konuşan kullanıcıları da hedefliyorsanız ve bölgeye özel ayrı sürüm yoksa yalnız dil kodu olan tr daha kapsayıcıdır. Asıl kural, seçilen kodun tüm kümede tutarlı kullanılmasıdır.
hreflang yönlendirme veya canonical yerine geçer mi?
Hayır. hreflang kullanıcıyı yönlendirmez ve yinelenen içerik sorununu tek başına çözmez; yalnızca hangi sürümün hangi kullanıcıya gösterileceği konusunda ipucu verir. Her dil sürümü kendine işaret eden bir canonical taşımaya devam eder.
Değişiklikten sonra sonuçların düzelmesi ne kadar sürer?
Kesin bir süre yok. Google’ın kümedeki tüm sayfaları yeniden taraması gerekir; seyrek taranan sayfalarda bu daha uzun sürer. Sitemap’i güncellemek ve önemli URL’leri URL Denetimi aracıyla kontrol etmek süreci izlemeyi kolaylaştırır.
- Teknoloji
- hreflang, ISO 639-1, ISO 3166-1 alpha-2, XML sitemap, HTTP Link başlığı, rel=canonical
- Konu
- Çok dilli/çok bölgeli sitelerde hreflang uygulaması ve denetimi
- Seviye
- Orta–ileri
- Ön koşullar
- Çok dilli site yapısının (alt dizin, alt alan adı veya ccTLD) belirlenmiş olması
- Sayfa şablonlarına veya sitemap üretimine erişim
- Bir tarama aracı (ör. Screaming Frog) ve Search Console erişimi
Performans ve SEO