Hreflang Nasıl Uygulanır (Adım Adım)
Üç hreflang yönteminin tümü için çalışan kod — HTML head etiketleri, HTTP Link başlıkları ve XML site haritası ek açıklamaları — ayrıca sözdizimi kuralları, ölçekte CMS otomasyonu ve gerçekten doğru şekilde yayınlandığını doğrulamak için doğrulama iş akışı.
Diller
Bu sayfada 1 kanıt sinyali
- İlgili canlı araçreturntag - hreflang checker
Hreflang eklemenin tam olarak üç yolu vardır — head içinde HTML link etiketleri, HTTP Link yanıt başlıkları (PDF gibi HTML olmayan dosyalar için) veya XML site haritasında xhtml:link girdileri (ölçekte en iyisi). Birini seçin; Google üçünü de eşdeğer kabul eder ve birleştirmenin bir faydası yoktur. Her yöntem aynı iki tartışılmaz kurala uyar: kendine referans (her sayfa kendini listeler) ve karşılıklılık (A, B'yi gösteriyorsa, B de A'yı göstermelidir, aksi takdirde Google çifti yok sayar). Kodlar ISO 639-1 dil kodu artı isteğe bağlı ISO 3166-1 alpha-2 bölge kodudur; x-default geri dönüş değeridir. Hepsini tek bir doğruluk kaynağından üretin, ardından yalnızca kaynağı görüntüleyerek değil, işlenmiş head'i doğrulayın — 374 756 alan adı üzerinde yaptığım çalışmada, hreflang kurulumlarının %67'sinden fazlasında en az bir sorun vardı.
TL;DR — Hreflang eklemenin üç yolu vardır: sayfanızın
<link>bölümüne küçük<head>etiketleri, sunucunuzun gönderdiği birLink:başlığı veya XML site haritanızdaki girdiler. Yalnızca birini seçersiniz. Hangisini seçerseniz seçin, iki kural asla değişmez: her sayfa kendisini listeler ve bağlantı verdiğiniz her sayfanın geri bağlantı vermesi gerekir — aksi takdirde Google tüm seti yok sayar. Ardından etiketlerin sayfada gerçekten istediğiniz gibi göründüğünü kontrol edersiniz.
Buradan başlayın: hreflang’e ihtiyacınız olduğuna zaten karar verdiniz
Bu nasıl yapılır kılavuzudur. Hâlâ hreflang’e ihtiyacınız olup olmadığından veya ne yaptığından emin değilseniz, önce hreflang genel bakışını okuyun — bu sayfa, bir sayfanın birden fazla dil veya ülke sürümüne sahip olduğunuzu bildiğinizi ve yalnızca doğru şekilde oluşturmak istediğinizi varsayar.
Eklemenin üç yolu (birini seçin)
<link>içinde HTML<head>etiketleri. Her sayfanın HTML’sinin üstüne birkaç satır eklersiniz. Anlaması en kolay, görmesi en kolay, daha küçük siteler için iyidir.- HTTP
Link:başlıkları. Aynı bilgi, sunucunuz tarafından HTML yerine yanıtta gönderilir. Bu, HTML olmayan dosyalar için tek seçenektir — örneğin, etiket koyacak<head>bölümü olmayan bir PDF. - XML site haritası. Tüm dil sürümlerini her sayfada değil, site haritası dosyanızın içinde listelersiniz. Büyük siteler için en iyisidir, çünkü her sayfaya dokunmanız gerekmez — tüm harita tek bir yerde yaşar.
Google üçüne de aynı şekilde davranır. “Daha hızlı” veya “daha güçlü” bir tane yoktur ve aynı anda birden fazla kullanmanın hiçbir faydası yoktur — bu yalnızca senkronizasyonun bozulması için daha fazla yer sağlar.
Evidence for this claim Google supports equivalent HTML, HTTP-header, and sitemap methods for declaring localized versions; HTTP headers can be used for non-HTML files such as PDFs. Scope: Google Search hreflang implementation methods. Confidence: high · Verified: Google: Localized versionsHTML sürümü neye benzer
Diyelim ki bir ABD İngilizcesi sayfanız, bir Birleşik Krallık İngilizcesi sayfanız, bir Almanca sayfanız ve insanların seçim yapmasını sağlayan küresel bir ana sayfanız var. ABD İngilizcesi sayfasına şunu koyarsınız:
<link rel="alternate" hreflang="en-us" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-gb" href="https://example.com/uk/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />Her satırı şöyle okuyun: “bu sayfanın alternatif bir sürümü var, bu dil/bölge için ve bu adreste yaşıyor.” x-default satırı, dili diğerleriyle eşleşmeyen herkes için yedek seçeneğinizdir.
Fark edilecek iki şey var, çünkü bunlar hreflang’in çalışmasını sağlayan iki kuraldır:
- ABD sayfası kendisini listeler (ilk
en-ussatırı, üzerinde olduğunuz ABD sayfasını işaret eder). - Set içindeki diğer her sayfa, geri işaret eden aynı bloğu taşımak zorundadır. Birleşik Krallık sayfası, Almanca sayfa ve ana sayfa — hepsinin bu dört satırın kendi sürümüne ihtiyacı vardır.
İki kural, açık bir dille
- Her sayfa geri işaret eder. ABD sayfanız Almanca sayfanıza bağlantı veriyorsa, Almanca sayfanın ABD sayfasına bağlantı vermesi gerekir. Bu geri bağlantıyı kaçırırsanız, Google çifti atar. Bu, insanların en çok bozduğu kuraldır.
- Her sayfa kendini işaret eder. Her sürüm, set içinde kendi URL’sini listeler. Google bunu isteğe bağlı ama iyi bir uygulama olarak adlandırır — yine de yapın, her şeyi tutarlı tutar.
Gerçek, tam web adresleri kullanın
Her zaman https:// ile başlayan tam adresi kullanın. /us/ değil, //example.com/us/ değil — tamamı, https://example.com/us/. Ve Google’ın gerçekten dizine eklediği tam adresle eşleşmesi gerekir: aynı protokol, aynı www (veya olmaması), aynı sondaki eğik çizgi, aynı büyük/küçük harf kullanımı.
Kodları doğru alın
Kod, iki harfli bir dildir, isteğe bağlı olarak bir tire ve iki harfli bir ülke ile takip edilir: en, en-us, de, es-mx. Klasik hatalar en-uk (doğrusu en-gb — uk aslında Ukraynaca anlamına gelir) ve Japonca için jp (doğrusu ja).
Ardından çalıştığını kontrol edin
Yeni başlayanların kaçırdığı en önemli şey: yayınladıktan sonra, etiketlerin orada ve <head> içinde olduğunu doğrulamak için gerçekten oluşturulan sayfaya bakın. Etiketleriniz JavaScript tarafından ekleniyorsa, “Sayfa Kaynağını Görüntüle” seçeneğinde görünmeyebilirler ancak canlı sayfada görünürler. Google Search Console’un URL İnceleme aracı, Google’ın gerçekte ne oluşturduğunu gösterebilir.
Başlık ve site haritası yöntemleri için tam kod, bunu tüm bir CMS’de nasıl otomatikleştireceğiniz, kesin doğrulama adımları ve kümeleri sessizce bozan hatalar mı istiyorsunuz? Gelişmiş sekmesine geçin.
TL;DR — Üç yöntem, birini seçin:
<link>içinde HTML<head>etiketleri, HTTPLink:başlıkları (PDF gibi HTML olmayan dosyalar için tek seçenek) veya bir XML site haritasındaki<xhtml:link>girdileri (ölçekte en iyisi — makine tarafından oluşturulan tek bir dosya, QA’sı en kolay). Google üçünün eşdeğer olduğunu ve bunları birleştirmenin bir faydası olmadığını söylüyor. Her yöntem öz referans + karşılıklılık kuralına uyar, mutlak URL’ler kullanır ve ISO 639-1 dil + isteğe bağlı ISO 3166-1 alpha-2 bölge kodlarını kullanır. Her şeyi tek bir doğruluk kaynağından üretin — elle bakımı yapılan hreflang bozulur. Ardından oluşturulan head’i doğrulayın, karşılıklılık için tüm kümeyi tarayın ve her URL değişikliğinden sonra yeniden kontrol etmeye devam edin. Tarayıcıları coğrafyaya göre otomatik yönlendirmeyin.
Bir satır kod yazmadan önce: üç karar
1. Hangi yöntem. Google, seçimin performansla değil kolaylıkla ilgili olduğunu açıkça belirtiyor — “The three methods are equivalent from Google’s perspective and you can choose the method that’s the most convenient for your site.” (çeviri) «Üç yöntem Google’ın bakış açısından eşdeğerdir ve siteniz için en uygun olan yöntemi seçebilirsiniz.» Benim kaba kuralım:
Evidence for this claim Google supports equivalent HTML, HTTP-header, and sitemap methods for declaring localized versions; HTTP headers can be used for non-HTML files such as PDFs. Scope: Google Search hreflang implementation methods. Confidence: high · Verified: Google: Localized versions- Bir avuç URL, statik veya basit bir site, az sayıda yerel ayar → HTML
<link>etiketleri. - HTML olmayan varlıklar (PDF’ler, belgeler) → HTTP
Link:başlıkları (başka seçeneğiniz yok — bir PDF’de<head>yoktur). - Çok sayıda yerel ayar, mevcut bir site haritası hattı veya headless/JAMstack kurulumu → XML site haritası, programlı olarak oluşturulur.
Karar Ağaçları merceği bunu gerçek bir akış şeması olarak ele alır.
2. Tek doğruluk kaynağı. Hangi yöntemi seçerseniz seçin, ek açıklamalar tek bir yerden üretilmelidir — veritabanınızdaki bir yerel ayar/çeviri tablosu, bir CMS ilişki alanı veya (küçük siteler için) tek bir elektronik tablo. En kötü hreflang anti-deseni, sayfa başına etiketleri elle bakım yapmaktır. Bir yerel ayarın şablonu saptığı anda, geri dönüş bağlantıları kaybolur ve çiftler düşer.
3. Yöntemleri birleştirmeyin. Üçünü de çalıştırabilirsiniz; Google’ın faydası olmadığını söylüyor ve her ek yöntem, üç kopyanın birbiriyle çelişmesi için başka bir yüzeydir.
Evidence for this claim Google requires fully qualified alternate URLs and reciprocal links, and recommends including each page itself in its alternate set. Scope: Google Search hreflang rules shared by all delivery methods. Confidence: high · Verified: Google: Hreflang guidelinesYöntem 1 — <link> içinde HTML <head> etiketleri
Google’dan birebir alınan sözdizimi şöyledir:
<link rel="alternate" hreflang="lang_code" href="url_of_page" />Geri dönüşlü, çok dilli, çok bölgeli bir küme için tam çalışan bir set:
<link rel="alternate" hreflang="en-us" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-gb" href="https://example.com/uk/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />Bu tam blok, kümedeki her sayfaya gider (ABD sayfası, Birleşik Krallık sayfası, Almanya sayfası ve ana sayfa) — her biri kendi öz referans satırını içerir. Karşılıklılığı sağlayan şey budur.
Yerleşim katı bir kuraldır. Google: “The <link> tags must be inside a
well-formed <head> section of the HTML.” (çeviri) «<link> etiketleri, HTML’nin iyi biçimlendirilmiş bir <head> bölümünün içinde olmalıdır.» Ve kendi sorun giderme tavsiyeleri:
“If in doubt, paste code from your rendered page into an HTML validator to ensure
that the links are inside the <head> element.” (çeviri) «Şüpheye düşerseniz, bağlantıların <head> öğesinin içinde olduğundan emin olmak için oluşturulmuş sayfanızdaki kodu bir HTML doğrulayıcıya yapıştırın.»
Bu, kulağa geldiğinden daha önemlidir, çünkü çoğu yazılı rehberin atladığı bir hata modu vardır: hreflang etiketleri <head> dışına ve geçersiz oldukları <body> içine zorlanabilir. Pubcon Vegas 2019 sunumumda bunu doğrudan işaretledim — etiketler meşru olarak gövdede bulunamaz (bu, bir sitenin başka bir sitenin alternatiflerini ele geçirmesine izin verir), ancak hatalı biçimlendirilmiş veya enjekte edilmiş bir <p> etiketi veya bir
iframe, <head>’i erken kapatabilir, böylece ondan sonraki her şey — hreflang’ınız dahil — <body> içinde oluşturulur. Etiket teknik olarak kaynakta mevcuttur ancak sessizce geçersizdir. Hata ayıklamanın en hızlı yolu tarayıcı DOM
kesme noktalarıdır: etiketlerin oluşturulan DOM’da gerçekte nereye düştüğünü izleyin, ardından <head>’i bozan işaretlemeye geri dönün.
HTML etiketleri ne zaman mantıklıdır: yönetilebilir sayıda yerel ayara sahip küçük ve orta ölçekli siteler, sayfa başına <link> bloğunun büyümediği yerler. Düzinelerce yerel ayarı olan bir sitede, her sayfa büyük bir işaretleme bloğu taşır — büyük sitelerin site haritası yöntemine yaslanmasının nedenlerinden biri de budur.
hreflang’i aynı alternate öğesi üzerindeki diğer <link> öznitelikleriyle karıştırmayın. Google’ın rehberliği, <link rel="alternate"> taşıyan bir hreflang öğesinin aynı etikette media gibi ilgisiz bir alternate özniteliği de taşımaması gerektiğini açıkça belirtir — aynı URL için hem bir dil/bölge alternatifi hem de bir medya sorgusu alternatifi gerekiyorsa, bunlar birleştirilmiş tek bir öğe değil, iki ayrı <link> öğesidir. Bunları karıştırmak, Google’ın ikisi olarak da ayrıştıramayacağı bir etiketle sonuçlanmanın kolay bir yoludur.
Yöntem 2 — HTTP Link: başlıkları
Aynı bilgi, HTML yerine HTTP yanıtında gönderilir. Sözdizimi:
Link: <https://example.com/file.pdf>; rel="alternate"; hreflang="en",
<https://de-ch.example.com/file.pdf>; rel="alternate"; hreflang="de-ch"Her URL’nin etrafındaki açılı parantezlere, noktalı virgülle ayrılmış özniteliklere ve her alternatifi ayıran virgüle dikkat edin. Başlıktaki her URL virgülle eklenir.
Buna ne zaman ihtiyacınız olur: HTML olmayan kaynaklar. Bir PDF, bir .doc, doğrudan sunulan bir görsel — hiçbirinin <head> etiketlerini tutacak bir <link> bölümü yoktur, bu nedenle başlık, hreflang’ı bunlara eklemenin tek yoludur.
Yapılandırma hususları: bu başlıkları sunucu veya CDN katmanında ayarlarsınız (bir Apache Header yönergesi, bir Nginx add_header, bir Cloudflare/Fastly/CloudFront yanıt başlığı kuralı veya uygulamanızın yanıtı). Başlık belge başına işaretleme yerine altyapı tarafından ayarlandığından, karşılıklılık kuralını burada bozmak kolaydır — İngilizce PDF’nin başlığı ve Almanca PDF’nin başlığı genellikle ayrı ayrı yapılandırılır, bu nedenle her birinin tüm seti (kendisi dahil) listelediğinden emin olmak size kalmıştır. Başlık oluşturmayı, HTML/sitemap yaklaşımınızla aynı yerel ayar tablosuyla yönlendirin.
Tutulması gereken değişmez: her alternatif yanıt, her seferinde aynı eksiksiz seti taşır. İngilizce PDF’nin başlığının Almanca alternatifi listelemesi yeterli değildir — Almanca PDF’nin yanıtı, her yanıtta (yalnızca bir tarayıcının denk geldiği ilkinde değil) aynı seti (kendisi artı diğer tüm alternatifler) geri taşımak zorundadır. Başlığı, ayarlayıp unuttuğunuz tek seferlik bir şey olarak değil, oluşturulmuş çıktı olarak ele alın.
Yöntem 3 — XML sitemap <xhtml:link> ek açıklamaları
Ölçekte, bu genellikle doğru tercihtir: tüm küme bir (veya birkaç) makine tarafından oluşturulan dosyada yaşar, hiçbir şey her sayfanın <head> bölümünü şişirmez ve — tüm ilişki grafiği tek bir yerde olduğu için — QA yapması açık ara en kolay yöntemdir. Sözdizimi:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://www.example.com/english/page.html</loc>
<xhtml:link rel="alternate" hreflang="de"
href="https://www.example.de/deutsch/page.html"/>
<xhtml:link rel="alternate" hreflang="en"
href="https://www.example.com/english/page.html"/>
</url>
<url>
<loc>https://www.example.de/deutsch/page.html</loc>
<xhtml:link rel="alternate" hreflang="de"
href="https://www.example.de/deutsch/page.html"/>
<xhtml:link rel="alternate" hreflang="en"
href="https://www.example.com/english/page.html"/>
</url>
</urlset>Sitemap yönteminde insanların takıldığı iki şey:
- Ad alanı bildirimi zorunludur.
xmlns:xhtml="http://www.w3.org/1999/xhtml"öğesindeki o<urlset>isteğe bağlı bir süsleme değildir — onu atlarsanız dosyadaki her<xhtml:link>geçersiz olur. - Her
<url>bloğu kendi kendine eksiksiz olmalıdır. Yukarıdaki her iki<url>bloğunun, kendi<loc>öğeleri dahil her iki alternatifi de listelediğine dikkat edin. Her<url>girişi tam seti taşır (kendine referans + tüm alternatifler). Bir sitemapta karşılıklılık yalnızca “her URL’nin bloğu, kümedeki her URL’yi (kendisi dahil) listeler” anlamına gelir.
Oluşturucuyu gereğinden fazla mühendislikle donatmamanız için bilmeye değer iki davranış: bir <xhtml:link> bloğu içindeki <url> alt öğelerinin sırası Google için önemli değildir — onları sıralamak için zaman harcamayın — ve bu <xhtml:link> ek açıklamaları, bir <url> girişinin alt öğeleri oldukları ve kendileri ayrı <url> girişleri olmadıkları için sitemap’inizin dosya başına 50 000 URL sınırına dahil edilmez.
Programatik olarak oluşturma. Sitemap yönteminin tüm amacı, CMS’nizin kendi çeviri verilerinin bir yan ürünü olmasıdır. CMS’niz /english/page.html ve /deutsch/page.html dosyalarının birbirinin çevirisi olduğunu zaten biliyorsa, sitemap oluşturucunuz bu ilişki tablosunu gezinmeli ve <xhtml:link> bloklarını derleme zamanında (veya sitemap isteği zamanında) yaymalıdır. Bunu yaparsanız, hreflang gerçeklikle senkronizasyonu kaybedemez — her seferinde gerçeğin kaynağından yeniden oluşturulur ve bir yerel ayar eklemek, yüzlerce sayfada elle düzenleme değil, bir veri değişikliğidir.
Ekipler için geliştirici kaynakları olmadan, Ahrefs hreflang rehberimde hafif bir Google Sheets şablonu oluşturdum: bir Kurulum sekmesi (varsayılan bir dil artı en fazla dört varyant seçin), bir URL’ler sekmesi (her dilin URL’lerini sütunlara yapıştırın) ve sizin için sitemap XML bloğunu otomatik olarak oluşturan bir Sonuçlar sekmesi. Bu, gerçek bir CMS entegrasyonunu haklı çıkaramayacak kadar küçük siteler için somut hale getirilmiş “tek doğruluk kaynağı” fikridir.
Hangi yöntemi seçerseniz seçin geçerli olan kurallar
Bunlar yöntemden bağımsızdır ve tartışılmaz.
- Kendine referans. Her sayfa (veya her
<url>bloğu veya her başlık) kendisini listeler. Mueller bunu isteğe bağlı-ancak-iyi-uygulama olarak çerçeveler, ancak bunu atlamak çalışmamdaki alan adlarının %18,0’ında mevcuttu — otomatikleştirin ve hiçbir maliyeti olmaz. - Karşılıklılık. “Each language version must list itself as well as all other language versions.” Ve uygulama: “If two pages don’t both point to each other, the tags will be ignored. This is so that someone on another site can’t arbitrarily create a tag naming itself as an alternative version of one of your pages.” Eksik bir geri dönüş bağlantısı çifti düşürür.
- Mutlak, tam nitelikli URL’ler. “Alternate URLs must be fully-qualified, including the transport method (http/https)” — yani
https://example.com/foo, asla//example.com/fooveya/foodeğil. Ve URL, Google’ın dizine eklediği tam biçimle eşleşmelidir: protokol,www, sondaki eğik çizgi ve büyük/küçük harf hepsi uyumlu olmalıdır, aksi takdirde geri dönüş bağlantısı eşleşmesi başarısız olur.
Kodları doğru almak
“The first code of the hreflang attribute is the language code (in ISO 639-1 format) followed by an optional second code that represents the region code (in ISO 3166-1 Alpha 2 format).” Bunları bir tire ile birleştirin: en-US. Bir dili tek başına hedefleyebilirsiniz (es = İspanyolca her yerde), ancak bir bölgeyi tek başına hedefleyemezsiniz — her zaman önce bir dil vardır.
En sık gördüğüm hatalar (ve çalışma veri setinde gördüklerim):
en-UKyerineen-GB—ukUkraynaca’dır, Birleşik Krallık’ın bölge kodugb’dir.- Japonca için
jpyerineja, Çince içincnyerinezh. - İki harfli ISO 639-1 gerektiğinde üç harfli kodlar (
ger,eng). - Bölge kodu olarak
EU,UNveyaUKkullanmak — hiçbiri geçerli ISO 3166-1 alpha-2 hedefleri değildir.
x-default, geri dönüş için ayrılmış değerdir — açık yerel ayarlarınızdan hiçbiriyle eşleşmeyen kullanıcılara hizmet veren bir dil seçici veya otomatik yönlendiren bir ana sayfa:
<link rel="alternate" href="https://example.com/" hreflang="x-default" />Zorunlu değildir. Çalışmamda en çok eksik olan öğeydi (alan adlarının %56,3’ü bunu atladı), ancak eksik bir x-default, eksik bir karşılıklı etiket gibi kümeyi bozmaz — Google, eşleşmeyen kullanıcılar için kendi dil/bölge algılamasına geri döner. Yine de ekleyin; bu bir kontrol listesi öğesidir, küme kırıcı değil. (Bu kümede özel bir x-default alt konusu vardır.)
Ölçekte uygulama — CMS ve platform yaklaşımları
WordPress. Yoast SEO does not generate hreflang on its own. To actually
output tags you need a multilingual plugin — WPML or Polylang. WPML
auto-generates hreflang for every page that has translations, adds an x-default
pointing at your default-language version, and by default injects the annotations
into the XML sitemap; there’s a setting under WPML → Languages → SEO Options
(“Display alternative languages in the HEAD section”) if you want head-tag output
instead of, or in addition to, the sitemap. (See WPML’s docs on using it with
Yoast.)
Shopify. Shopify Markets, pazarlar/dilleri yapılandırdıktan ve içerik yayınlanıp gezinmeye eklendikten sonra otomatik olarak karşılıklı bağlantılı hreflang etiketleri oluşturur — bu da en yaygın hata modunu (eksik karşılıklı bağlantılar) tasarım gereği ortadan kaldırır. Sorun şu: Markets’in otomatik etiketleri genellikle yalnızca dil (fr, de) biçimindedir, dil-bölge (fr-FR, fr-CA) biçiminde değildir; bu da bölgesel özgüllüğe ihtiyaç duyan markaları yetersiz bırakır — Fransa için Fransızca vs. Kanada vs. Belçika. Bunun için <link> içinde manuel theme.liquid etiketlerine (Shopify’ın kendi tema hreflang belgeleri bu kalıbı gösterir) veya bir uygulamaya geçmeniz gerekir — ve dikkatli olun, çünkü otomatik Markets etiketlerini manuel/uygulama etiketleriyle karıştırmak belgelenmiş bir çakışma kaynağıdır. Birini seçin.
Özel / headless / kurumsal. Çeviri-ilişki tablonuzdan derleme veya sunum zamanında açıklamaları oluşturun, yukarıdaki site haritası bölümünde açıklandığı gibi. Bu, aynı “tek doğruluk kaynağı” ilkesidir — hreflang, CMS’nizin zaten sahip olduğu verilerin hesaplanmış bir çıktısı haline gelir, elle bakımı yapılan ve bozulabilecek bir yapı değil.
Kümeyi bozan uygulama hataları
Coğrafi/IP’ye göre otomatik yönlendirme. Bu, sözdizimi hatalarından ayrı bir hatadır ve daha kötüdür. Ziyaretçileri — ve özellikle tarayıcıları — algılanan konuma göre bir sürüme yönlendirirseniz, tüm bölgesel kümelerin dizinden çıkarılmasına neden olabilirsiniz, çünkü Googlebot çoğunlukla ABD’den tarar. O Pubcon sunumunda söylediğim gibi: bir coğrafi yönlendirme “arama motorlarını taradıkları yere yönlendirir. Örneğin Google çoğunlukla ABD’den tarar, bu yüzden tüm coğrafi sayfaları fiilen dizinden çıkarırdık.” Burada bir düzenleyici boyut da var — AB’nin coğrafi engelleme karşıtı kuralları kapsamında potansiyel risk. Doğru model kullanıcıları yönlendirmek, tarayıcıları asla: insan ziyaretçileri tespit edin ve (isteğe bağlı olarak) yönlendirin, ancak botların her URL varyantına doğrudan erişmesine her zaman izin verin; asıl yönlendirme sinyalini hreflang versin. Google’ın kendi çok bölgeli rehberliği tam da bu nedenle otomatik yönlendirme yerine müdahaleci olmayan bir öneri bandı önerir.
Hreflang’i canonical olmayan, yönlendirilmiş veya noindex URL’lere yönlendirmek. Bir yerel ayarın URL’si değişirse ve yönlendirme eklenirse ancak hreflang hâlâ eski URL’yi gösteriyorsa, kümeniz artık bir 301 veya 404’e referans veriyor demektir (çalışmamda alan adlarının %16,9’u bozuk/yönlendirilmiş sayfalara referans veriyordu). Benzer şekilde, her varyant kendisine canonicalize edilmelidir; canonicalize edilmiş bir URL’ye veya noindex’li bir sayfaya hreflang işaret etmek, geri dönüş bağlantısını bozar (%8,0’ı canonical olmayan URL’lere işaret ediyordu).
Tutarsız URL biçimleri. Hreflang URL’si ve dizine eklenen URL, biçim olarak bayt düzeyinde aynı olmalıdır — sondaki eğik çizgi, www, protokol ve büyük/küçük harf dahil. Buradaki bir uyumsuzluk sessiz bir karşılıklılık hatasıdır.
Yayın sonrası uygulamanızı doğrulama
Yalnızca ham kaynağı değil, oluşturulmuş kaynağı görüntüleyin. Hreflang’iniz istemci tarafı JavaScript ile ekleniyorsa, curl veya Ctrl+U (“Sayfa Kaynağını Görüntüle”) hiçbir şey göstermez — ancak etiketler oluşturulmuş DOM’da mevcuttur. GSC URL İnceleme → “Canlı URL’yi Test Et” → “Test Edilen Sayfayı Görüntüle” veya oluşturma yeteneğine sahip bir tarayıcı ile doğrulayın. Birinin “etiketlerim eksik” demesinin en yaygın nedeni budur; oysa aslında her şey yolundadır (veya tam tersi — kaynakta mevcut ancak <body> içinde oluşturuldukları için bozuk).
Tüm kümeyi tarayın, tek bir URL’yi rastgele kontrol etmeyin. Karşılıklılık, sayfalar arasındaki bir ilişkidir, bu nedenle tek bir sayfayı kontrol etmek size neredeyse hiçbir şey söylemez. Tüm küme genelinde bir tarayıcı çalıştırın — Screaming Frog’un hreflang denetimi veya Ahrefs Site Audit — eksik geri dönüş etiketlerini, canonical olmayan hedefleri ve bozuk referansları ölçekte yakalamak için. Ahrefs Site Audit’in Hreflangs sekmesi, kümeyi bozuk bağlantılar kırmızı olacak şekilde bir grafik olarak çizer; bu, bir CSV’den çok daha kolay anlaşılır.
Gerçek SERP’leri &hl= ve &gl= ile doğrulayın. Bir Google arama URL’sine ana dil (&hl=) ve
coğrafi konum (&gl=) parametrelerini ekleyerek, belirli bir yerel ayarın sonuçlarının gerçekte nasıl
göründüğünü önizleyin; kendi konumunuzdan tahmin yürütmek yerine.
Doğrulama tek seferlik bir adım değildir. Yeni yerel ayarlar, URL/yönlendirme değişiklikleri ve geliştirme/hazırlık yapılandırmasının üretime sızması, lansman sonrası bozulmaların yinelenen nedenleridir. hreflang kontrollerini yalnızca lansman günü QA geçişine değil, regresyon testlerine ve yinelenen taramalara dahil edin. Konuşmalarımdan benim çerçevem: “maskelemeden geliştirme/test/hazırlık ortamlarından taşınan şeylere kadar herhangi bir sayıda şey bozulabilir.”
Emekliye ayrılmaya değer mitler
- “Site haritaları HTML etiketlerinden daha hızlı işlenir.” Yanlış. Her ikisi de tarama sırasında çözülür — bunu doğrudan çürüttüm. Site haritasının avantajı hız değil, bakım kolaylığı ve QA’dır.
- “Yandex, site haritalarında hreflang’i desteklemez.” Yanlış — Yandex’in kendi belgeleri site haritası hreflang desteğini doğrulamaktadır.
- “Ekstra sinyal için üç yöntemi de kullanın.” Google’a göre bir faydası yok ve bu yalnızca tutarsızlık riskini artırır.
- “Eksik bir
x-defaultkümeyi bozar.” Yanlış — isteğe bağlıdır; Google kendi algılamasına geri döner. - “Yanlış hreflang ceza getirir.” Yanlış — bu bir yönerge değil, bir ipucudur. Bozuk hreflang yok sayılır, cezalandırılmaz.
Sırada ne var
Bu makale, hreflang merkezinin altındaki nasıl yapılır derinliğidir — merkez, hreflang’in ne olduğunu, karşılıklılığın neden önemli olduğunu ve Bing’in bunun yerine ne yaptığını kapsar. x-default alt konusu, geri dönüş değeri hakkında derinlemesine bilgi verir. Bu stratejinin uyguladığı strateji için Uluslararası SEO temel direğine bakın — hreflang teknik katmandır, gerçek yerelleştirmenin yerine geçmez.
AI özeti
Gelişmiş sürümün yoğunlaştırılmış bir değerlendirmesi:
- Üç yöntem, tam olarak birini seçin (Google bunları eşdeğer kabul eder; birleştirmenin bir faydası
yoktur):
- HTML
<link>etiketleri<head>içinde — küçük/orta ölçekli siteler; iyi biçimlendirilmiş bir<head>içinde olmalıdır, asla<body>içinde değil; aynıhreflangöğesindemedia’i<link>gibi başka bir alternatif öznitelikle karıştırmayın. - HTTP
Link:başlıkları — HTML olmayan dosyalar (PDF’ler) için tek seçenek; sunucuda/CDN’de ayarlanır; her alternatif yanıt, her seferinde aynı eksiksiz seti taşımalıdır. - XML site haritası
<xhtml:link>— ölçekte en iyisi;xmlns:xhtml="http://www.w3.org/1999/xhtml"üzerinde<urlset>ad alanı gerekir; tüm grafik tek dosyada olduğu için QA yapması en kolay olanıdır; alt öğe sırası önemli değildir ve bu alt öğeler 50 000 URL’lik site haritası sınırına dahil değildir.
- HTML
- İki evrensel kural: kendine referans (her sayfa kendini listeler) ve karşılıklılık (A→B, B→A gerektirir, aksi takdirde çift yok sayılır). Dizine eklenmiş biçimle tam olarak eşleşen mutlak, tam nitelikli URL’ler kullanın.
- Kodlar: ISO 639-1 dil + isteğe bağlı ISO 3166-1 alpha-2 bölge (
en-GB,en-UKdeğil;ja,jpdeğil).x-defaultayrılmış geri dönüş değeridir — isteğe bağlıdır ancak en çok gözden kaçan öğedir (çalışmamda %56,3). - Tek bir doğruluk kaynağından otomatikleştirin. WordPress, WPML/Polylang gerektirir (yalnızca Yoast hiçbir şey yapmaz); Shopify Markets karşılıklı etiketleri otomatik oluşturur ancak genellikle yalnızca dil bazlıdır; özel/headless, hreflang’i çeviri tablosundan üretmelidir.
- Tarayıcıları coğrafi olarak otomatik yönlendirmeyin — Googlebot çoğunlukla ABD’den tarar, bu nedenle bölgesel kümelerin dizinden çıkarılmasına neden olabilir; kullanıcıları yönlendirin, asla botları değil.
- İşlenmiş başlığı doğrulayın, yalnızca kaynağı görüntülemekle kalmayın (JS ile eklenen etiketler
kaynakta görünmez); karşılıklılık için tüm kümeyi tarayın; yerel ayarları
&hl=/&gl=ile kontrol edin; her URL değişikliğinden sonra yeniden kontrol edin.
Resmi dokümantasyon
hreflang uygulamak için birincil kaynak belgeler.
- Sayfalarınızın yerelleştirilmiş sürümleri — birincil uygulama dokümanı: üç yöntemin tümü, kesin sözdizimi, karşılıklılık gereksinimi, geçerli kodlar, mutlak URL kuralı ve
x-default. - Çok bölgeli ve çok dilli siteleri yönetme — URL yapısı seçenekleri ve otomatik yönlendirme / gizleme uyarısı (tarayıcıları neden coğrafi yönlendirmemeniz gerektiği).
- Google’a yerelleştirilmiş sürümler hakkında bilgi verin (x-default blogu, 2013) —
x-default’un orijinal tanıtımı. - Uluslararası Hedefleme raporunun kullanımdan kaldırılması (Eylül 2022) — eski rapor kaldırıldı; hreflang etiketleri hâlâ çalışıyor.
Bing / Microsoft
- Bing Web Yöneticisi Yönergeleri — Bing’in rehberliği; Bing’in hreflang yerine
content-languageve<html lang>öğesine ağırlık verdiğini unutmayın. - Bingbot Serisi: Tarama Verimliliğini En Üst Düzeye Çıkarma — Bing’in uluslararası/çok dilli siteleri nasıl ele aldığına dair bağlam.
CMS / platform
- WPML — WordPress SEO (Yoast) ile WPML kullanımı — WPML’in hreflang’i nasıl çıkardığı (head vs. sitemap ayarı).
- Shopify — Temanıza hreflang etiketleri ekleyin — manuel
theme.liquid<link>deseni.
Kaynaktan alıntılar
Uygulamayla ilgili kayıtlı ifadeler. Her Google-docs bağlantısı, canlı sayfada alıntılanan pasaja atlayan derin bir bağlantıdır.
Google — üç yöntem
- “The three methods are equivalent from Google’s perspective and you can choose the method that’s the most convenient for your site.” (çeviri) «Üç yöntem Google’ın bakış açısından eşdeğerdir ve siteniz için en uygun olan yöntemi seçebilirsiniz.» — Google Search Central dokümanları. Alıntıya git
Google — yerleşim
- “The
<link>tags must be inside a well-formed<head>section of the HTML.” (çeviri) «<link>etiketleri HTML’in iyi biçimlendirilmiş bir<head>bölümünün içinde olmalıdır.» — Google Search Central dokümanları. Alıntıya git
Google — iki kural
- “Each language version must list itself as well as all other language versions.” (çeviri) «Her dil sürümü kendisini ve diğer tüm dil sürümlerini listelemelidir.» — Google Search Central dokümanları. Alıntıya git
- “If two pages don’t both point to each other, the tags will be ignored.” (çeviri) «İki sayfa birbirini işaret etmiyorsa, etiketler yok sayılır.» — Google Search Central dokümanları. Alıntıya git
- “Alternate URLs must be fully-qualified, including the transport method (http/https).” (çeviri) «Alternatif URL’ler, taşıma yöntemi (http/https) dahil tam nitelikli olmalıdır.» — Google Search Central dokümanları. Alıntıya git
Google — kodlar
- “The first code of the hreflang attribute is the language code (in ISO 639-1 format) followed by an optional second code that represents the region code (in ISO 3166-1 Alpha 2 format).” (çeviri) «hreflang özniteliğinin ilk kodu dil kodudur (ISO 639-1 biçiminde) ve ardından bölge kodunu temsil eden isteğe bağlı ikinci bir kod gelir (ISO 3166-1 Alpha 2 biçiminde).» — Google Search Central dokümanları. Alıntıya git
John Mueller, Google — bu bir ipucu, bir yönerge değil
- Öz-gönderimli etiketler hakkında: hreflang öz-gönderimleri isteğe bağlı ancak iyi bir uygulama olarak raporlanır. — John Mueller, Google, Ahrefs hreflang rehberim aracılığıyla aktarıldı.
- Doğruluğun sonucu garanti etmediği hakkında (Mayıs 2025, Bluesky): Mueller, hreflang’in dizinlemeyi garanti etmediğini, bu nedenle bir varyantın dizinlenmeyebileceğini ve aynı dildeki varyantların (ör.
fr-frvefr-be) genellikle birleştirildiğini belirtti. — Search Engine Journal kapsamı aracılığıyla aktarıldı.
Hangi uygulama yöntemini kullanmalıyım?
Yukarıdan aşağıya çalışın ve ilk eşleşmede durun.
1. Sayfalar HTML olmayan dosyalar mı (PDF’ler, dokümanlar, doğrudan sunulan görseller)?
→ Evet → HTTP Link: başlıkları. <head>’leri yoktur, bu yüzden tek seçeneğiniz budur. Başlığı sunucuda/CDN’de ayarlayın ve her dosyada tüm seti listeleyin.
→ Hayır → devam edin.
2. Bir avuçtan fazla yereliniz, mevcut bir sitemap hattınız veya headless/JAMstack derlemeniz mi var?
→ Evet → XML sitemap <xhtml:link>. Çeviri tablonuzdan programatik olarak oluşturun. Makine tarafından üretilen tek dosya, sayfa başına işaretleme yok, QA’sı en kolay.
→ Hayır → devam edin.
3. Küçük/basit site, az yerel, ve her şeyi sayfada görünür tutmayı mı tercih edersiniz?
→ <link> içinde HTML <head> etiketleri. Sadece bloğun tek bir doğruluk kaynağından üretildiğinden ve iyi biçimlendirilmiş bir <head> içine yerleştiğinden emin olun.
Ne seçerseniz seçin: onu tek başına kullanın. Google, yöntemleri birleştirmenin bir faydası olmadığını söylüyor ve her ekstra kopya, üçünün anlaşmazlığa düşebileceği bir yerdir.
x-default’a ihtiyacım var mı?
Açık yerellerinizden hiçbiriyle eşleşmeyen kullanıcılara hizmet veren bir sayfanız var mı — bir ülke/dil seçici veya küresel bir ana sayfa?
→ Evet → x-default ekleyin ve bu yedek sayfayı işaret edin.
→ Hayır → atlayabilirsiniz. İsteğe bağlıdır; Google kendi algılamasına geri döner. Kümeyi bozmaz (eksik bir karşılıklı etiketin aksine). Yine de eklemek iyi bir uygulamadır — çalışmamda en çok gözden kaçan tek öğeydi (%56,3).
Kullanıcıları konuma göre otomatik yönlendirmeli miyim?
IP/coğrafyaya göre yönlendirmeyi mi düşünüyorsunuz? → Yalnızca insan ziyaretçileri yönlendirin ve sert bir yönlendirme yerine müdahaleci olmayan bir banner’ı tercih edin. → Tarayıcıları asla coğrafyaya göre yönlendirmeyin. Googlebot çoğunlukla ABD’den tarar, bu nedenle bir tarayıcı coğrafi yönlendirmesi diğer bölgesel sürümlerinizin dizinden kaldırılmasına neden olabilir — ve gizleme sınıflandırması ile AB anti-coğrafi engelleme maruziyeti riski taşır. Botların her URL varyantına doğrudan erişmesine izin verin; yönlendirme sinyalini hreflang yapar.
Hangi CMS yolu bana uygun?
- WordPress? → Yoast tek başına hiçbir şey yapmaz. WPML veya Polylang kurun; hreflang yayarlar (WPML’in SEO ayarlarında head vs. sitemap çıktısını seçin).
- Shopify? → Markets karşılıklı etiketleri otomatik oluşturur — ancak genellikle yalnızca dil bazlıdır.
fr-FRvsfr-CAmı gerekiyor? Manueltheme.liquidetiketleri veya bir uygulama ekleyin ve ikisini karıştırmayın (çakışma riski). - Özel / headless? → Derleme/sunum zamanında çeviri-ilişki tablonuzdan
<xhtml:link>(veya head etiketleri) yayınlayın.
SOP: Sıfırdan bir hreflang kümesi yayınlayın
Yeni bir hreflang kümesi (veya mevcut birine yeni bir yerel) eklemek için tekrarlanabilir bir prosedür. Yukarıdan aşağıya çalıştırın.
1. Yerel matrisini oluşturun (tek doğruluk kaynağı).
Her URL’yi ve dil-bölge kodunu tek bir yerde listeleyin — bir veritabanı tablosu, bir CMS çeviri alanı veya bir elektronik tablo. Her URL’nin kurallı, dizinlenmiş biçimde olduğunu doğrulayın (doğru protokol, www, sondaki eğik çizgi, büyük/küçük harf). Bu tablo aşağıdaki her şeyin girdisidir; aşağı akışta hiçbir şey elle yazılmaz.
2. Karar Ağaçları merceğini kullanarak bir yöntem seçin. Yöntemleri birleştirmeyin.
3. Ek açıklamaları matristen oluşturun.
- HTML: matristen her sayfanın
<link>bölümüne<head>bloğunu ekleyin. - Sitemap:
<url>üzerindexmlns:xhtmlad alanıyla her<urlset>bloğunu ekleyin. - Başlıklar: matristen sunucu/CDN’de
Link:başlığını ekleyin.
4. Yayınlamadan önce iki kuralı programatik olarak doğrulayın. Her girdi (a) bir öz referans içermeli ve (b) kümedeki diğer tüm girdileri listelemelidir. Karşılıklılığı doğrulayın: her A→B için eşleşen bir B→A olduğundan emin olun.
5. Bir seçici veya genel yedek sayfanız varsa x-default ekleyin.
6. Yayınlayın, ardından oluşturulan çıktıyı doğrulayın (ayrıntılı doğrulama runbook’u için Playbooks lens’ine bakın): oluşturulan başlık (kaynak görünümü değil), karşılıklılık için tüm küme taraması ve bir &hl=/&gl= SERP nokta kontrolü.
7. Bunu sürekli kontrollere bağlayın. Gelecekteki bir URL değişikliğinin veya yeni bir yerel ayarın dönüş etiketini sessizce bozamaması için yinelenen bir tarama / regresyon testi ekleyin. Doğrulama tek seferlik bir görev değildir.
Daha sonra bir yerel ayar eklerken: yalnızca matrisi düzenlersiniz (adım 1) ve 3–6. adımları yeniden çalıştırırsınız. Bir yerel ayar eklemek için tek tek sayfaları elle düzenliyorsanız, gerçeğin kaynağınız yanlış — önce onu düzeltin.
Playbook: “hreflang’ım çalışmıyor” — doğrulama runbook’u
Bunları sırayla çalıştırın. Her adım ya sorunu bulur ya da bir şüpheliyi temizler.
Adım 1 — Etiketlerin gerçekten oluşturulduğunu doğrulayın. Sayfayı açın ve oluşturulan DOM’u görüntüleyin (GSC URL İnceleme → Canlı URL’yi Test Et → Test Edilen Sayfayı Görüntüle veya bir oluşturma tarayıcısı). Ctrl+U “Sayfa Kaynağını Görüntüle” seçeneğine güvenmeyin — hreflang JS ile enjekte ediliyorsa, canlı olsa bile orada görünmez.
- Oluşturulan başlıkta etiketler mevcut → Adım 3’e gidin.
- Oluşturulan başlıkta etiketler eksik → Adım 2.
Adım 2 — Etiketler <head> içinde mi yoksa <body> içinde mi?
Etiketler kaynakta mevcutsa ancak <body> içindeyse, geçersizdirler. Hatalı biçimlendirilmiş veya
enjekte edilmiş bir <p> etiketi veya bir iframe büyük olasılıkla <head>’i erken kapatmıştır.
<head>’in nerede kırıldığını bulmak için tarayıcı DOM kesme noktalarını kullanın, bu işaretlemeyi düzeltin, yeniden kontrol edin.
Adım 3 — URL’lerin mutlak ve kurallı olduğunu kontrol edin.
Her href tam nitelikli (https://…) ve dizine eklenen biçimle (protokol, www, sondaki eğik çizgi, büyük/küçük harf) bayt düzeyinde aynı olmalıdır. Hiçbirinin bir 301, 404,
noindex veya kurallı hale getirilmiş bir URL’ye işaret etmediğini doğrulayın.
Adım 4 — Tüm küme genelinde karşılıklılığı kontrol edin. Tüm kümeyi tarayın (Screaming Frog / Ahrefs Site Audit). Her A→B için eşleşen bir B→A’nın var olduğunu ve her sayfanın kendine referans verdiğini doğrulayın. Çoğu kırılma burada yaşanır — tek bir eksik dönüş etiketi çifti düşürür.
Adım 5 — Kodları doğrulayın.
ISO 639-1 dil + ISO 3166-1 alpha-2 bölge kodlarını doğrulayın. Özellikle
en-UK (→ en-GB), jp (→ ja), üç harfli kodlar ve yalnızca bölge kodlarına bakın.
Adım 6 — Coğrafi yönlendirmeleri eleyin. Tarayıcıların coğrafi olarak yönlendirilmediğini doğrulayın. Googlebot (ABD’den tarama yapan) ABD sürümünüze yönlendirilirse, diğer bölgesel URL’lerinize asla ulaşılamayabilir.
Adım 7 — Küme teknik olarak doğruysa beklentileri sıfırlayın.
Yukarıdakilerin tümü doğruysa ve aynı dildeki varyantlar (ör. fr-fr / fr-be)
raporlamada hâlâ birleştiriliyorsa, bu beklenen bir durumdur — Google, uygulamadan bağımsız olarak
neredeyse aynı olan aynı dildeki varyantları birleştirebilir. Bu bir ipucudur, bir
talimat değildir; yanlış veya yok sayılan hreflang bir ceza değildir. Bunu bir hata olarak kovalamayı bırakın.
Uygulama anti-desenleri
Somut hatalar, neden yanlış oldukları ve bunun yerine ne yapılması gerektiği.
1. hreflang’ı sayfa başına elle yönetmek. Neden yanlış: bir şablon veya yerel ayar saptığı anda, dönüş etiketleri kaybolur ve çiftler düşer — ölçekte karşılıklılık çürümesi. Bunun yerine: tüm ek açıklamaları tek bir gerçek kaynağından (çeviri tablosu, CMS alanı veya küçük siteler için Sheets şablonu) oluşturun, böylece tüm küme düzenlenmek yerine yeniden oluşturulur.
2. “Ekstra sinyal” için üç yöntemi de kullanmak. Neden yanlış: Google’ın faydası olmadığını söylüyor ve gerçeğin üç kopyası, anlaşmazlık için üç şans demektir. Bunun yerine: bir yöntem seçin ve yalnızca onu kullanın.
3. Tarayıcıları coğrafi/IP’ye göre otomatik yönlendirme. Neden yanlış: Googlebot çoğunlukla ABD’den tarar, bu nedenle bir tarayıcı coğrafi yönlendirmesi diğer bölgesel kümelerinizin tamamını dizinden çıkarabilir — ayrıca cloaking ve AB anti-geoblocking maruziyeti. Bunun yerine: yalnızca kullanıcıları yönlendirin (veya daha iyisi, banner ile isteyin); asla tarayıcıları değil. Botların her URL’ye doğrudan erişmesine izin verin ve sinyali hreflang taşısın.
4. hreflang’ı canonical olmayan, yönlendirilmiş veya noindex’li URL’lere yöneltmek.
Neden yanlış: geri dönüş bağlantısı bir 301/404/noindex’li sayfaya çözümlenir, bu nedenle çift bozulur (çalışmamda %16,9’u bozuk/yönlendirilmiş sayfalara, %8,0’ı canonical olmayan sayfalara atıfta bulundu).
Bunun yerine: her varyant kendine canonical olur; hreflang yalnızca canlı, canonical ve dizine eklenebilir URL’lere işaret eder — URL’ler her değiştiğinde yeniden üretilir.
5. Göreli veya protokol-göreli URL’ler.
Neden yanlış: Google tam nitelikli URL’ler gerektirir; /foo ve //example.com/foo geçersizdir ve mutlak ama eşleşmeyen biçimler (yanlış eğik çizgi/www/büyük-küçük harf) karşılıklılık eşleşmesinde başarısız olur.
Bunun yerine: her zaman https://example.com/foo kullanın ve dizine eklenmiş biçimle birebir eşleşsin.
6. Doğrulama olarak “View Page Source”a güvenmek.
Neden yanlış: JS ile eklenen hreflang ham kaynakta görünmez, bu nedenle ya eksik olduğunu düşünürsünüz (değildir) ya da <body> içinde render edildiğini kaçırırsınız (geçersiz).
Bunun yerine: render edilmiş DOM’u GSC URL Inspection veya bir render tarayıcısı ile doğrulayın.
7. Yanlış veya uydurma yerel kodlar.
Neden yanlış: en-UK, jp, ger ve yalnızca bölge kodları geçersizdir ve yok sayılır.
Bunun yerine: ISO 639-1 dil + isteğe bağlı ISO 3166-1 alpha-2 bölge — en-GB, ja, de, es-MX.
Öncesi / sonrası
1. Eksik karşılıklı etiket (klasik). Önce: ABD sayfası ABD + Birleşik Krallık + Almanya’yı listeler, ancak Almanca sayfanın şablonu yalnızca Almanya + ABD’yi listeler — Birleşik Krallık geri dönüş bağlantısını unutur. Google, Almanya↔Birleşik Krallık çiftini düşürür. Sonra: Almanca sayfanın bloğu Almanya + ABD + Birleşik Krallık’ı listeler (tümü kendine referanslı ve karşılıklı). Yerel tablodan yeniden üretilir, böylece tekrar sapamaz.
2. Göreli URL’ler.
Önce: <link rel="alternate" hreflang="de" href="/de/" /> — göreli, bu nedenle geçersiz ve yok sayılır.
Sonra: <link rel="alternate" hreflang="de" href="https://example.com/de/" /> — tam nitelikli ve dizine eklenmiş biçimle eşleşiyor.
3. Yanlış Birleşik Krallık kodu.
Önce: <link rel="alternate" hreflang="en-uk" href="https://example.com/uk/" /> — uk Ukraynaca’dır; ek açıklama geçersizdir.
Sonra: <link rel="alternate" hreflang="en-gb" href="https://example.com/uk/" />.
4. Site haritasında ad alanı eksik.
Önce: <xhtml:link> girdileri kullanan ancak yalnızca temel site haritası ad alanını bildiren bir <urlset> içeren bir site haritası — her <xhtml:link> geçersizdir.
Sonra: <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"> — xhtml ad alanı bildirilir, böylece ek açıklamalar doğrulanır.
Kopyalamaya hazır yapay zeka istemleri
Yer tutucuları uyarlayın, ardından seçtiğiniz asistana yapıştırın. Çıktıyı her zaman gerçek bir taramaya karşı doğrulayın — bir LLM makul görünen ama yanlış kodlar üretebilir veya bir geri dönüş bağlantısını kaçırabilir.
Bir yerel ayar matrisinden bir HTML <head> bloğu oluşturun
I have these language/region page variants:
- en-US: https://example.com/us/
- en-GB: https://example.com/uk/
- de: https://example.com/de/
- global fallback / selector: https://example.com/
For EACH page above, output the complete hreflang <link> block that belongs in its
<head>. Every block must (a) self-reference, (b) list all other variants, and
(c) include an x-default pointing at the fallback. Use fully-qualified https URLs
exactly as given. Validate the codes as ISO 639-1 language + ISO 3166-1 alpha-2
region and flag any that look wrong.Convert the same matrix into an XML sitemap block
Using the same variant list, output an XML sitemap that uses <xhtml:link> hreflang
annotations. Requirements: declare xmlns:xhtml="http://www.w3.org/1999/xhtml" on
<urlset>; give every <url> block a full self-referencing + all-alternates set; use
the exact URLs provided. Do not add any URL not in my list.Audit a pasted cluster for reciprocity + code errors
Here are the hreflang tags from each page in my cluster: [paste each page's URL and
its hreflang tags]. Check for: missing self-reference, missing reciprocal (A->B
without B->A), invalid ISO codes, relative/protocol-relative URLs, and any URL that
appears with inconsistent formatting (trailing slash / www / case). List each issue
with the exact page and tag it's on. Do not assume tags I didn't paste. Çıkarma, konsol ve oluşturma parçacıkları
Hreflang oluşturmak ve kontrol etmek için pratik tek satırlık komutlar. Çalıştırmadan önce URL’leri ayarlayın.
Chrome DevTools Konsolu — geçerli sayfadaki hreflang etiketlerini listeleyin Herhangi bir sayfada Konsol’a (F12 → Konsol) yapıştırın ve tarayıcının gerçekte ne işlediğini görün — bu, “Kaynağı Görüntüle”nin kaçırdığı JS ile eklenen etiketleri yansıtır:
[...document.querySelectorAll('link[rel="alternate"][hreflang]')]
.map(l => ({ hreflang: l.hreflang, href: l.href,
inHead: !!l.closest('head') }));inHead bayrağı, <head>-kırılma hatasının göstergesidir: inHead: false gösteren herhangi bir etiket <body> içinde işleniyor ve geçersizdir.
Yer imi — aynı kontrol, tek tıkla Bu URL ile bir yer imi olarak kaydedin, ardından herhangi bir sayfada tıklayın:
javascript:(()=>{const t=[...document.querySelectorAll('link[rel="alternate"][hreflang]')].map(l=>`${l.hreflang} ${l.href} ${l.closest('head')?'(head)':'(BODY - INVALID)'}`);alert(t.length?t.join('\n'):'No hreflang tags found');})();XPath — head içindeki hreflang bağlantılarını seçin (bir tarayıcı / tarayıcı denetçisi için)
//head/link[@rel='alternate' and @hreflang]Bir tarayıcı link[@hreflang] altında //body eşleşmeleri bulursa, bu head-kırılma hatasıdır.
Regex — ham HTML’den hreflang kodunu + URL’yi çekin (hızlı grep, gerçek bir ayrıştırıcı değil)
<link[^>]*rel=["']alternate["'][^>]*hreflang=["']([^"']+)["'][^>]*href=["']([^"']+)["']Yakalama grubu 1 koddur, grup 2 URL’dir. Yalnızca hızlı bir sağlık kontrolü grep’i için kullanın — gerçek HTML’yi regex ile değil, bir DOM kitaplığıyla ayrıştırın.
curl — HTTP Link: yanıt başlıklarında hreflang olup olmadığını kontrol edin (PDF / HTML olmayan durum)
curl -sI https://example.com/file.pdf | grep -i '^link:'Python — generate a self-consistent hreflang <head> block from a matrix
variants = {
"en-us": "https://example.com/us/",
"en-gb": "https://example.com/uk/",
"de": "https://example.com/de/",
"x-default": "https://example.com/",
}
# Every page gets the SAME full block (self-reference + all alternates),
# which is exactly what satisfies reciprocity.
block = "\n".join(
f'<link rel="alternate" hreflang="{code}" href="{url}" />'
for code, url in variants.items()
)
print(block) Kendinizi test edin: Hreflang uygulama
Bir hreflang kümesini doğru şekilde oluşturmayla ilgili beş hızlı soru. Her biri için bir yanıt seçin, ardından kontrol edin.
Zaman ayırmaya değer kaynaklar
İlgili yazılarım
- Hreflang: Yeni Başlayanlar İçin Kolay Rehber — üç yöntemin tümünü, dokuz yaygın uygulama sorununu ve çözümlerini ve ölçekte yarı otomatik hreflang oluşturma için Google Sheets şablonunu içeren Ahrefs rehberim.
- Hreflang Kullanan Alan Adlarının %67’sinden Fazlasında Sorun Var — şimdiye kadar yapılmış en büyük çalışma olan 374 756 alan adı üzerindeki araştırmam ve hata oranı dökümünün kaynağı (eksik x-default %56,3, eksik kendine referans %18,0, bozuk/yönlendirilmiş hedefler %16,9, eksik karşılıklılık %15,3, kanonik olmayan %8,0, hatalı kodlar %4,6).
Konuşmalarım
- International SEO: The Weird Technical Parts — Pubcon Vegas 2019 — en zengin uygulama kaynağı:
<head>-break hatası (iframe’ler/hatalı işaretleme nedeniyle etiketlerin<body>içine zorlanması) ve DOM-breakpoint hata ayıklama, “sitemaps are faster” efsanesinin nedeni, geo-redirect dizinden çıkarma riski ve&hl=/&gl=SERP-kontrol tekniği. - Hreflang Study and Interesting Issues — Brighton SEO 2023 — çalışmanın arkasındaki sunum ve Google’ın en spesifik eşleştirme sırası (dil+ülke → dil → x-default) ile veri setindeki en yaygın kod hataları.
- You’re Going To Screw Up International SEO — Pubcon Vegas 2017 — uygulama kaosunun ekosistemi: yanlış bilgi raporlayan araçlar, dizine eklenenden farklı URL’lerden sunulan içerik, yinelenen sayfa tuzakları.
Sektörden
- Google’ın Localized versions of your pages — birincil uygulama dokümanı; üç yöntemin tümü için tam sözdizimi, karşılıklılık/öz-referans kuralları, geçerli kodlar ve mutlak URL gereksinimi. Oluşturmadan önce tamamını okuyun.
- Google’ın Managing multi-regional and multilingual sites — URL yapısı seçenekleri ve “redirect users, not crawlers” arkasındaki otomatik yönlendirme / cloaking uyarısı.
- WPML — Using WordPress SEO (Yoast) with WPML — WordPress’in hreflang’i gerçekte nasıl çıkardığı (yalnızca Yoast çıkarmaz) ve head-vs-sitemap çıktı ayarı.
- Shopify — Add hreflang tags in your theme — Shopify Markets’in yalnızca dil etiketleri yeterince spesifik olmadığında manuel
theme.liquid<link>deseni. - Screaming Frog — How To Audit & Test Hreflang — tek bir URL’yi nokta kontrolü yapmak yerine tüm bir küme genelinde karşılıklılığı doğrulamak için tarama tabanlı iş akışı.
- Google Reminds That Hreflang Tags Are Hints, Not Directives — Search Engine Journal, Mayıs 2025, Mueller’ın aynı dilde birleştirme açıklaması üzerine (teknik olarak mükemmel bir kümenin neden hâlâ birleştirilebileceği).
- r/TechSEO — bozuk hreflang kümelerinde hata ayıklama topluluğu.
Hreflang kümesinin gerçekten yayınlandığını kanıtlayın
Hreflang sessizce başarısız olur: etiketler mevcut, iyi biçimlendirilmiş ve yine de dönüş ayağı eksikse yok sayılabilir. “Kodda var” test değildir — tüm küme genelindeki karşılıklılık testtir. Bir dil/bölge seti dağıttıktan sonra bunları çalıştırın.
Test 1 — Her çift etiketi döndürür (karşılıklılık)
- Test to run — Crawl the whole cluster with returntag (it checks that every page A points to actually points back at A), or run Screaming Frog’s hreflang report across the set.
- Expected result — 0 non-reciprocal pairs and every URL self-references. Zero errors, not “a few.”
- Failure interpretation — A one-way pair (A → B but B doesn’t → A) means Google drops that pair — the most common real-world failure, and invisible if you only spot-check one URL’s view-source.
- Monitoring window — Immediate for the rendered tags; the checker reads what’s live now.
- Rollback trigger — Any non-reciprocal pair, or a tag pointing at a URL that 301s or 404s — fix the source of truth and redeploy before waiting on Google.
Test 2 — Google bunu temiz bir şekilde işliyor
- Çalıştırılacak test — Google, Eylül 2022’de Search Console’daki eski Uluslararası Hedefleme raporunu kullanımdan kaldırdı, bu yüzden ona güvenmeyin — kümedeki her yerel ayar için Sayfa Dizine Ekleme’yi kontrol edin ve örnek sayfalarda URL İnceleme ile “Google tarafından seçilen kanonik” ve dizine ekleme durumunun o yerel ayar için beklediğinizle uyumlu olduğunu doğrulayın.
- Beklenen sonuç — Her yerel ayarın amaçlanan sayfaları dizine eklenir (farklı dil sürümlerini tek bir sürüme indirgeyecek şekilde “Yinelenen, Google farklı bir kanonik seçti” değil) ve URL İnceleme beklediğiniz alternatifi gösterir.
- Başarısızlık yorumu — Farklı bir yerel ayarın kanonik sayfasının yineleneni olarak görünen veya kümelenmiş/birleştirilmiş dizine ekleme gösteren sayfalar genellikle bozuk bir dönüş ayağına (Test 1’i yeniden kontrol edin) işaret eder, hreflang’in kendisine değil — hreflang bir ipucudur, bir yönerge değildir, bu yüzden teknik olarak kusursuz bir küme, Google içeriği neredeyse aynı olarak değerlendirirse yine de birleştirilebilir.
- İzleme penceresi — 2–4 hafta — Search Console kümeyi anında değil, zaman içinde yeniden tarar ve raporlar.
- Geri alma tetikleyicisi — Bir yerel ayarın sayfaları sürekli olarak yanlış kanonik altında dizine ekleniyorsa veya bir sorgu için yanlış bölgesel URL görünüyorsa — önce karşılıklılığı yeniden denetleyin; dönüş ayağı asıl eksiklikken etiketlerin “çalışmadığını” varsaymayın.
Değişiklik günlüğü
8 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
8 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
25 Tem 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
18 Tem 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.