HTTP isteklerinin içinde, görünmez ama etkili bir başlık taşınır: Accept-Language. Tarayıcı bu başlığı sunucuya gönderir ve hangi dil ya da dilleri tercih ettiğini bildirir. Türkçe dil ayarlı bir Chrome, Accept-Language: tr-TR,tr;q=0.9,en;q=0.8 gibi bir değer iletir. Sunucu bu değeri okur ve kullanıcıyı doğru dil sürümüne yönlendirir — pratikte sık kullanılan, kullanıcı dostu bir mekanizma.
Kullanıcı açısından deneyim temizdir. Bağlantıyı açar, dil seçmesi gerekmez, sayfayı kendi dilinde okur. Pek çok geliştirici bu sistemi "SEO dostu" olarak tanımlar çünkü her dil sürümü ayrı bir URL'de yaşıyor, içerikler kopyalanmıyor, yönlendirmeler tutarlı çalışıyor. Ama bu değerlendirme, kritik bir aktörü denklemin dışında bırakır: Googlebot.
Arama motorları bu başlığı insanlardan farklı gönderir; çoğu durumda hiç göndermez ya da anlamsız bir değer iletir. Bu küçük teknik gerçek, Accept-Language tabanlı yönlendirmelerin bütün SEO mantığını çökertir. Sorunun cevabı "evet" ya da "hayır" değil; hangi koşulda nasıl bozduğunu anlamaktan geçiyor.
Sunucu, başlığı okuyunca ne yapıyor?
Accept-Language tabanlı yönlendirme genellikle şöyle çalışır: ziyaretçi example.com/products adresine gelir, sunucu isteğin başlığını okur, değer tr içeriyorsa kullanıcıyı example.com/tr/products adresine yönlendirir. Yönlendirme çoğunlukla 302'dir; bazı uygulamalarda 301 kullanılır, bazen de JavaScript ile sayfa yüklendikten sonra gerçekleştirilir.
Sunucu taraflı uygulamada Apache veya Nginx yapılandırması, bir middleware katmanı ya da CDN kuralları bu işi üstlenir. İstemci taraflı uygulamada ise JavaScript, navigator.language değerini okuyarak yönlendirme yapar — bu durumda Googlebot JavaScript'i işlemeden önce başka bir sayfayla karşılaşır. Her iki uygulama da arama motorları açısından farklı sorunlar üretir; ama ikisinin de ortak zayıf noktası aynıdır: Googlebot'un ne gönderdiği.
Teknik katman ne kadar sağlam kurulmuş olursa olsun, bu sistemin çalışması tamamen gelen isteğin Accept-Language başlığına bağlıdır. Başlık yoksa veya beklenen bir değer içermiyorsa sistem genellikle varsayılan bir sürüme — çoğu durumda İngilizce — düşer. İşte sorun burada başlar.
Googlebot bu başlığı nasıl gönderiyor?
Google'ın resmî belgeleri bu konuda açıktır: Googlebot, Accept-Language başlığını tutarsız biçimde gönderir. Çoğu tarama isteğinde başlık ya yoktur ya da en-US değeri taşır. Bunun birkaç teknik nedeni vardır. Googlebot farklı veri merkezlerinden, farklı IP aralıklarından tarama yapar ve her seferinde aynı tarayıcı davranışını taklit etmez. Dil tercihi gibi kişiselleştirilmiş sinyaller, arama botunun hedeflediği tarama profiliyle uyuşmaz.
Pratik sonuç şudur: Accept-Language yönlendirmesi olan bir sitede Googlebot, büyük ihtimalle her zaman İngilizce sürüme ya da tanımsız varsayılan sürüme yönlendirilir. Türkçe, Almanca veya Japonca URL'ler teknik olarak var olsa da bu URL'lere Googlebot iç linkler veya sitemap aracılığıyla ulaşmadıkça, giriş noktasından taranma ihtimalleri düşer. Yönlendirme mekanizması onları aktif olarak dışarıda bırakır.
Bu, locale-adaptive sayfaların ürettiği sorunla yapısal olarak aynıdır; tek fark mekanizmada. Locale-adaptive'de URL değişmez, içerik değişir. Accept-Language yönlendirmesinde URL değişir ama Googlebot yine tek bir noktada takılır. Her iki durumda da hedef dil sürümleri Googlebot'un radarında değildir.
Redirect zinciri canonical'ı nasıl etkiliyor?
Accept-Language yönlendirmesinin en az konuşulan hasarı canonical yapısında ortaya çıkar. Senaryo şöyle gelişir: example.com/products adresi tüm dillerde giriş noktası olarak tanımlanmıştır. Hreflang etiketleri bu URL'yi x-default olarak işaretler. Ama bu adrese gelen her istek, başlık değerine göre başka bir URL'ye yönlendirilir.
Googlebot İngilizce isteğiyle gelir, example.com/en/products'a yönlendirilir. O sayfanın canonical'ı kendisini işaret ediyor olmalıdır. Ama orijinal URL olan example.com/products hreflang setinde x-default olarak duruyor. Canonical ile hreflang'ın işaret ettiği adresler birbirinden ayrışmaya başlar. Çok dilli sitelerde canonical yönetimi zaten karmaşıkken, üstüne bir redirect katmanı eklenmesi bu karmaşıklığı katlar.
Bir de daha kötü senaryo vardır: bazı uygulamalarda example.com/products sayfasının canonical'ı yönlendirilen hedef URL'yi değil, kendisini işaret eder. Google bu durumla karşılaştığında hangi adresi esas alacağını bilemez. Hangi URL indeksleneceğine algoritma karar verir — ve bu karar çoğu zaman öngörülemez. Hreflang hata tespitinde karşılaşılan canonical çatışmalarının önemli bir bölümü, tam da bu redirect katmanının yarattığı tutarsızlıktan kaynaklanır.
302 ile 301 arasındaki fark bu bağlamda neden önemli?
Yönlendirme türü, Accept-Language tabanlı sistemlerde ekstra bir karmaşıklık katmanı ekler. 302 geçici yönlendirme anlamına gelir; Google bunu "kaynak URL hâlâ geçerli" şeklinde yorumlar ve kaynak adresi indeksde tutmaya devam eder. Bu, teorik olarak daha az zararlı görünür. Ancak pratikte 302 kullanmak, Googlebot'un her tarama döngüsünde kaynak URL'ye gelmesi, oradan yönlendirilmesi ve döngünün tekrarlanması demektir. Tarama bütçesi bu işlemsiz döngüye harcanır.
301 kalıcı yönlendirme ise farklı bir sorun üretir. Google, yeterli süre geçtikten sonra kaynak URL'yi indeksten düşürmeye başlar ve tüm sinyali hedef URL'ye aktarır. Accept-Language senaryosunda bu, giriş noktası URL'nin (example.com/products) zamanla indeksten kaybolması, yerini yönlendirilen dil URL'lerinden birinin alması anlamına gelir. Hreflang setinin x-default olarak tanımladığı adres artık indekste yoktur. Yapı ayakta duruyormuş gibi görünür ama temeli çürüktür.
İkisinden hangisi daha az zararlıdır sorusunun net bir yanıtı yoktur — her ikisi de Accept-Language yönlendirmesiyle birleşince öngörülemeyen sonuçlar üretir. Zararsız bir yapı kurmak için yönlendirme türünü değil, yönlendirme mantığını değiştirmek gerekir.
Hreflang ile yönlendirmenin çakıştığı nokta
Hreflang etiketi, her dil sürümü için kararlı ve tahmin edilebilir bir URL gerektirir. Bir URL kümesi tanımlanır, her URL diğerlerine karşılıklı olarak işaret eder, Google bu kümeyi bir bütün olarak işler. Hreflang'ın doğru çalışması için bu URL'lerin taranabilir ve indekslenebilir olması şarttır.
Accept-Language yönlendirmesi olan bir yapıda bu kararlılık sarsılır. Giriş noktası URL (example.com/products) hreflang setinde x-default olarak yer alır ama bu adres fiilen hiç içerik sunmaz — her zaman başka bir yere yönlendirir. Google bu URL'yi taradığında boş bir el sıkışmayla karşılaşır: hreflang etiketi burada, ama sayfa kendisi değil. Dil seçici ve otomatik yönlendirme hatalarının incelendiği senaryolarda bu yapı sıklıkla karşılaşılan bir anti-pattern'dir.
Buna ek olarak, hreflang setindeki dil URL'leri (/tr/products, /de/products gibi) doğru kurulmuş olsa bile, bu URL'lere Googlebot'un ulaşması için başka bir giriş noktasına ihtiyaç vardır: iç linkler veya XML sitemap. Yalnızca giriş noktası URL'si biliniyorsa ve o URL her zaman başka bir yere yönlendiriyorsa, dil URL'leri zamanla tarama kapsamı dışında kalabilir. Sitemap bu boşluğu kısmen kapatır ama tek başına yeterli değildir; özellikle büyük kataloglarda tarama bütçesi yönetimi kritik hale gelir.
Bu yönlendirmeyi çalışır hale getirmek mümkün mü?
Accept-Language tabanlı yönlendirmenin tamamen kullanılmaz olduğu söylenemez; ama çalıştığı pencere oldukça dardır. Arama motorlarından bağımsız olarak işleyen, yalnızca kullanıcı deneyimine odaklanan bir katmanda bu mekanizma kabul edilebilir. Ancak bunun için iki ön koşul şarttır.
Birincisi: yönlendirme asla Googlebot'u etkilememeli. Bu, yönlendirme kararının sunucu tarafında değil, tarayıcıda — JavaScript aracılığıyla, sayfa yüklendikten sonra — alındığı anlamına gelir. Googlebot sayfayı JavaScript işlemeden okur; içeriği görür, indeksler, hreflang etiketlerini işler. Gerçek ziyaretçi ise sayfa yüklendikten sonra JavaScript'in okuduğu dil tercihine göre yönlendirilir. Bu yapıda SEO katmanı ile kullanıcı deneyimi katmanı birbirinden ayrışır.
İkincisi: her dil sürümü, Googlebot'un bağımsız olarak ulaşabileceği kararlı bir URL'de yaşamalıdır. Bu URL'ler iç linklerle birbirine bağlanmalı, XML sitemap'te listelenmiş olmalı ve hreflang setinde karşılıklı olarak referans vermelidir. Accept-Language mantığı bu URL'lere gerçek kullanıcıları yönlendirmek için kullanılabilir; ama URL'lerin varlığı ve taranabilirliği bu mekanizmadan bağımsız olmalıdır.
Daha temiz bir alternatif, yönlendirme yerine tercih katmanı kurmaktır. Ziyaretçi giriş noktasına gelir, sayfa kendi dilinde yüklenir, küçük bir bildirim alanı "Sizi Türkçe sürüme yönlendirelim mi?" diye sorar. Karar kullanıcıya bırakılır. SEO açısından her URL bağımsız olarak taranır ve indekslenir; kullanıcı deneyimi açısından tercih korunur. Teknik SEO denetimlerinde bu yaklaşım, yönlendirme tabanlı sistemlere göre çok daha az sorun üretir.
Accept-Language başlığı, çok dilli bir sitede kullanıcı deneyimini kişiselleştirmek için meşru bir araçtır. Sorun bu başlığın doğrudan sunucu taraflı yönlendirmeyle eşleştirilmesinden kaynaklanır. Kullanıcı deneyimi ile indeksleme mantığı aynı mekanizmayı paylaşmaya başladığında, ikisi de birbirini kısıtlar.
Pratikte en güvenilir yapı, iki katmanı birbirinden ayıran sistemdir: Googlebot her dil URL'sine bağımsız olarak ulaşır, içerikleri ayrı ayrı indeksler, hreflang kümesini tutarlı okur. Gerçek ziyaretçiler ise sayfa yüklendikten sonra tercihlerine göre yönlendirilir. Bu ayrımı kurmak, başta ekstra çaba gibi görünür; ama Accept-Language tabanlı bir yönlendirmenin sonradan ürettiği indeksleme kargaşasını temizlemek çok daha maliyetlidir.