11 Dilde Aynı İçerik 'Kopya' Sayılıyordu: Canonical Etiket Eksikliği
11 Dilde Aynı İçerik 'Kopya' Sayılıyordu: Canonical Etiket Eksikliği
Sorunun Fark Edilişi: Google Search Console'da Garip Bir Düşüş
AICompatible.com'u 11 dilde yayına aldıktan yaklaşık 6 hafta sonra, Google Search Console'da tuhaf bir şey fark ettik: İngilizce sayfalarımız normal şekilde indekslenirken, Almanca, Fransızca ve İspanyolca versiyonlarımızın bir kısmı "Duplicate, Google chose different canonical than user" uyarısıyla işaretlenmişti. Daha da kötüsü, bazı Türkçe sayfalarımız hiç indekslenmemişti.
İlk başta hreflang etiketlerimizde bir sorun olduğunu düşündük. Ancak hreflang validator'ları her şeyin doğru olduğunu gösteriyordu. Asıl sorun başka bir yerdeydi: 1200'den fazla sayfamızda canonical etiketi hiç yoktu.
Teşhis: Canonical Eksikliğinin Yarattığı Kaos
Sorunu anlamak için önce bir İngilizce ve Almanca sayfa çiftini karşılaştırdık:
https://aicompatible.com/en/tools/chatgpthttps://aicompatible.com/de/tools/chatgpt
Her iki sayfanın kaynak koduna baktığımızda şunu gördük:
<head>
<title>ChatGPT - AI Tool Directory</title>
<link rel="alternate" hreflang="en" href="https://aicompatible.com/en/tools/chatgpt" />
<link rel="alternate" hreflang="de" href="https://aicompatible.com/de/tools/chatgpt" />
<link rel="alternate" hreflang="tr" href="https://aicompatible.com/tr/tools/chatgpt" />
<!-- ... diğer diller -->
<!-- ❌ Canonical etiketi YOK -->
</head>
Hreflang etiketleri mevcuttu, ancak canonical etiketi tamamen eksikti. Bu durumda Google şunu yapıyordu:
- 11 farklı dilde aynı içeriği (AI araç açıklamaları) görüyordu
- Hangi versiyonun "orijinal" olduğunu bilemiyordu
- Kendi başına bir canonical seçmeye çalışıyordu (genellikle İngilizce)
- Diğer dil versiyonlarını ya "duplicate content" olarak işaretliyor ya da indekslemiyordu
Screaming Frog ile tam bir tarama yaptığımızda durum daha da netleşti: 1247 HTML sayfanın hiçbirinde canonical etiketi yoktu. Sitemizdeki her araç sayfası, her kategori sayfası, her blog yazısı—11 dilde çarpı yüzlerce sayfa—hepsi canonical'sız duruyordu.
Teknik Çözüm: 1200+ Sayfaya Toplu Canonical Ekleme
Manuel olarak 1200+ sayfayı düzenlemek imkansızdı. FTP üzerinden otomatik bir çözüm geliştirdik. İşte adım adım uyguladığımız yöntem:
1. Mevcut Yapının Analizi
Tüm HTML dosyalarımız şu yapıdaydı:
/public_html/
├── en/
│ ├── tools/
│ │ ├── chatgpt.html
│ │ └── midjourney.html
│ └── blog/
├── de/
│ ├── tools/
│ └── blog/
└── tr/
├── tools/
└── blog/
2. Self-Referencing Canonical Mantığı
Her sayfa kendi URL'sine işaret eden bir canonical içermeliydi. Yani:
/en/tools/chatgpt.html→ canonical:https://aicompatible.com/en/tools/chatgpt/de/tools/chatgpt.html→ canonical:https://aicompatible.com/de/tools/chatgpt/tr/tools/chatgpt.html→ canonical:https://aicompatible.com/tr/tools/chatgpt
Önemli: Çok dilli sitelerde yaygın bir hata, tüm dillerin canonical'ını İngilizce versiyona yönlendirmektir. Bu tamamen yanlış! Her dil kendi canonical'ına sahip olmalı, hreflang etiketleri zaten diller arası ilişkiyi tanımlar.
3. Python Script ile Toplu Güncelleme
FTP'ye bağlanıp tüm HTML dosyalarını güncelleyen bir Python scripti yazdık:
import os
import re
from ftplib import FTP
def add_canonical(html_content, file_path):
# Dosya yolundan URL'yi oluştur
# Örnek: /public_html/tr/tools/chatgpt.html → /tr/tools/chatgpt
url_path = file_path.replace('/public_html', '').replace('.html', '')
canonical_url = f'https://aicompatible.com{url_path}'
# Canonical etiketini oluştur
canonical_tag = f' <link rel="canonical" href="{canonical_url}" />\n'
# <head> etiketinden sonra ekle (title'dan önce)
pattern = r'(<head>\s*\n)'
replacement = r'\1' + canonical_tag
return re.sub(pattern, replacement, html_content, count=1)
# FTP bağlantısı
ftp = FTP('ftp.aicompatible.com')
ftp.login('username', 'password')
# Tüm HTML dosyalarını tara
languages = ['en', 'de', 'tr', 'fr', 'es', 'it', 'pt', 'pl', 'nl', 'ja', 'ko']
updated_count = 0
for lang in languages:
ftp.cwd(f'/public_html/{lang}')
for root, dirs, files in os.walk(f'./{lang}'):
for file in files:
if file.endswith('.html'):
file_path = os.path.join(root, file)
# Dosyayı indir
with open('temp.html', 'wb') as f:
ftp.retrbinary(f'RETR {file_path}', f.write)
# İçeriği oku ve canonical ekle
with open('temp.html', 'r', encoding='utf-8') as f:
content = f.read()
# Canonical zaten varsa atla
if 'rel="canonical"' not in content:
updated_content = add_canonical(content, file_path)
# Güncellenmiş dosyayı yükle
with open('temp.html', 'w', encoding='utf-8') as f:
f.write(updated_content)
with open('temp.html', 'rb') as f:
ftp.storbinary(f'STOR {file_path}', f)
updated_count += 1
print(f'✓ {file_path}')
print(f'\n✅ {updated_count} dosya güncellendi.')
ftp.quit()
4. Sonuç: Doğru Canonical Yapısı
Script çalıştıktan sonra her sayfa şu yapıya kavuştu:
<head>
<link rel="canonical" href="https://aicompatible.com/tr/tools/chatgpt" />
<title>ChatGPT - Yapay Zeka Araç Rehberi</title>
<link rel="alternate" hreflang="en" href="https://aicompatible.com/en/tools/chatgpt" />
<link rel="alternate" hreflang="de" href="https://aicompatible.com/de/tools/chatgpt" />
<link rel="alternate" hreflang="tr" href="https://aicompatible.com/tr/tools/chatgpt" />
<!-- ... -->
</head>
Sonuç ve Öğrendiklerimiz
Canonical etiketlerini ekledikten 2 hafta sonra Google Search Console'daki "duplicate content" uyarıları %87 azaldı. Almanca ve Fransızca sayfalarımız düzgün şekilde indekslenmeye başladı. Organik trafiğimiz 3 hafta içinde %34 arttı.
Bu sorun sadece bizde değil: Çok dilli sitelerin çoğunda canonical etiketleri ya tamamen eksik ya da yanlış yapılandırılmış. Özellikle şu hatalar çok yaygın:
- Tüm dillerin canonical'ı tek bir dile (genellikle İngilizce) yönlendiriliyor
- Canonical var ama self-referencing değil (başka bir sayfaya işaret ediyor)
- Canonical URL'leri http/https veya www/non-www tutarsızlığı içeriyor
Kendi sitenizi kontrol etmek için: Tarayıcınızda bir sayfanın kaynak kodunu açın (Ctrl+U) ve <link rel="canonical" araması yapın. Etiket yoksa veya yanlış URL'ye işaret ediyorsa, arama motorları sayfalarınızı doğru değerlendiremiyordur.
AICompatible.com'un otomatik tarayıcısı, sitenizdeki tüm sayfaları tarayarak canonical etiketlerinin varlığını, doğruluğunu ve hreflang etiketleriyle uyumunu kontrol eder. Çok dilli siteler için özel olarak tasarlanmış raporlar, hangi sayfalarda hangi SEO etiketlerinin eksik veya hatalı olduğunu gösterir—böylece bizim gibi 1200 sayfayı manuel kontrol etmek zorunda kalmazsınız.