İçeriğe geç
Approvalens

Okuma odası · 7 dk okuma

XML Site Haritası Hataları: Ölü Adres, Bozuk Dosya, Sahte lastmod

Taramayı boşa harcatan site haritası sorunlarını düzelt: okunmayan dosya, listedeki yönlendirme ve noindex sayfalar, etiket şişkinliği, değişmeyen lastmod.

Approvalens ekibi

Şu rapor bulgularını düzeltir

  • XML site haritası
  • Site haritasında ölü adresler
  • Site haritası hataları
  • robots.txt içinde site haritası
  • Liste sayfalarıyla dolu site haritası
  • Site haritasında olmaması gereken adresler
  • Değişmeyen güncelleme tarihleri

XML site haritası, Google'ın bulmasını ve dizine eklemesini istediğin adreslerin listesidir. Zorunlu değil; Google'ın deyişiyle göndermek de yalnızca bir ipucu ("merely a hint"). Ama yönlendirmeler, 404'ler, noindex sayfalar ya da yüzlerce etiket arşivi içeren bir harita Google'a kastettiğinin tersini söyler. Her derlemede bütün lastmod tarihleri değişen bir harita da Google'a tarihlerini görmezden gelmeyi öğretir. İyi bir site haritası kısa ve sıkıcıdır: her kayıt 200 döner, dizine eklenebilir ve canonical olarak kendini gösterir.

Google'ın gerçekten yazdığı kurallar

İnternetteki site haritası tavsiyelerinin çoğu kulaktan dolma. Google'ın site haritası oluşturma ve genel bakış sayfalarında belgelediği kısımlar şunlar:

Konu Google ne diyor
Boyut Tek bir harita en fazla 50 MB (sıkıştırılmamış) ya da 50.000 adres olabilir. Büyük siteler birkaç dosyaya ve bir dizin dosyasına böler.
Adresler Tam, mutlak adres kullan ("fully-qualified, absolute URLs").
Ne yazılır Google arama sonuçlarında görmek istediğin adresler.
lastmod Yalnızca tutarlı ve doğrulanabilir biçimde doğruysa kullanılır
priority, changefreq "Google ignores <priority> and <changefreq> values."
Kodlama ve konum UTF-8; kök dizindeki harita sitedeki bütün dosyaları kapsayabilir
Gerekli mi? Site yaklaşık 500 sayfa ya da daha küçükse ve iç linkleri iyiyse gerekmeyebilir
Garanti Yok. Haritadaki her şeyin taranıp dizine ekleneceğini garanti etmez.

Canonical kuralı başka bir belgede: site haritasındaki bütün sayfalar canonical adayı olarak önerilmiş sayılır ("All pages listed in a sitemap are suggested as canonicals", birleştirme rehberi). Canonical'ı başka yeri gösteren bir adresi listelemek doğrudan çelişkidir.

Senin site haritan hangi dosya?

Bir şeyi düzeltmeden önce hangi üreticinin gerçekten yayında olduğunu bul. Aynı anda çalışan iki üretici, birbiriyle çelişen iki harita çıkarır.

Platform Adres Not
WordPress çekirdeği /wp-sitemap.xml 5.5 ile geldi; dosya başına en fazla 2.000 adres; yazar arşivlerini de içerir; "Discourage search engines" açıkken kapanır (duyuru)
Yoast SEO /sitemap_index.xml Yoast SEO → Settings → Site features → "XML sitemaps" (Yoast); yoast.com'da /wp-sitemap.xml buraya yönleniyor
Rank Math /sitemap_index.xml Rank Math SEO → Sitemap Settings; her yazı türü ve taksonomi için "Include in Sitemap" (Rank Math)
Blogger /sitemap.xml ve /sitemap-pages.xml Yazılar ilkinde, sabit sayfalar ikincisinde (Google'ın kendi Blogger bloglarında gördük)
Next.js app/sitemap.ts ile /sitemap.xml Büyük listeler generateSitemaps ile bölünür, /…/sitemap/[id].xml adresinde sunulur

Kontrol ettiğimiz Blogger bloglarında varsayılan robots.txt yalnızca /sitemap.xml dosyasını anıyor; sabit sayfaların haritası bu yüzden kolay unutuluyor. Search Console'a ikisini de gönder.

Haritaya ne girer, ne girmez?

Her kayıt için aynı dört kontrolü yap:

Altı adreslik tablo: ikisi bütün kontrolleri geçip kalıyor; 301, 404, noindex etiket sayfası ve canonical'ı başka yeri gösteren parametreli adres çiziliyor; yanında durum, dizin, canonical ve ziyarete değer kontrolleri
Açıklama: Bir adres haritada ancak 200 dönüyorsa, dizine eklenebiliyorsa, canonical olarak kendini gösteriyorsa ve birinin inmek isteyeceği bir sayfaysa yer hak eder.

Yönlenen adreslerin yerine son durağını yaz. Silinen yazıları çıkar; onlara hâlâ giden iç linkleri de düzelt (kırık linkler ve soft 404). Noindex yaptığın bir etiket sayfasının haritada işi yok. Yoast, aramada gösterilmeyecek şekilde ayarlanmış yazı türlerini haritadan otomatik çıkardığını söylüyor; dosyayı değil ayarı düzeltmen için bir neden daha. Bir adresin canonical'ı başka yeri gösteriyorsa canonical adresi listele. O canonical'ın neden yanlış olabileceğini canonical etiketi sorunları, olmaması gerekirken noindex olan sayfaları yanlışlıkla noindex rehberi anlatıyor.

Liste sayfaları daha yumuşak bir sorun. Gerçek bir giriş yazısı olan ana kategoriler kalabilir. Yüzlerce etiket, yazar, tarih ve sayfa numarası adresi haritayı çoğunlukla listeden ibaret hâle getirir. Rank Math'te taksonomi bazındaki "Include in Sitemap" anahtarı, Yoast'ta Settings → Categories & tags ekranı bunları kapattığın yer. Blogger'da etiket sayfaları haritada yok ama tek yazılık çok sayıda etiket yine zayıf sayfalar üretir; daha iyi bir yapı için site menüsü rehberine bak.

Dosyanın kendisi bozuksa

Haritayı tarayıcıyla değil curl ile aç; tarayıcılar XML'i güzelleştirip ayrıntıyı saklar:

$ curl -s -D - -o sm.xml https://ornekblog.com/sitemap_index.xml | head -2
HTTP/2 200
content-type: text/html; charset=UTF-8
$ head -c 80 sm.xml
<!DOCTYPE html><html lang="tr"><head><title>Just a moment...</title>

Bu, XML yerine sunulmuş bir bot doğrulama sayfası. Belirtiye göre olası nedenler:

Ne geliyor Olası neden
HTML sayfa (doğrulama, giriş, tema 404'ü) Güvenlik duvarı ya da CDN doğrulaması, bakım modu eklentisi ya da kapatılmış harita modülü
Ayrıştırılamayan XML <?xml satırından önce gelen metin; çoğu zaman bir PHP uyarısı ya da temanın functions.php dosyasındaki boş satır
404 ya da 500 Eski üretici kaldırılmış, kalıcı bağlantı kuralları yenilenmemiş ya da robots.txt hâlâ eski dosyayı gösteriyor
Boş urlset İçerik türleri hariç tutulmuş ya da site dizine eklemeyi engelleyecek şekilde ayarlı

Sorun bir CDN doğrulamasıysa doğrulanmış botları içeri almanın yolu Cloudflare rehberinde. Site botlara bütünüyle hata veriyorsa site kapalı veya kullanılamıyor rehberiyle başla.

robots.txt'deki Sitemap satırı

Google üç gönderim yolu sayıyor: Site haritaları raporu, Search Console API'si ya da robots.txt'nin herhangi bir yerine eklenen bir satır. Birden fazla satır yazabilirsin:

User-agent: *
Disallow: /wp-admin/

Sitemap: https://ornekblog.com/sitemap_index.xml

Canlı alan adını ve şemayı kullan; eklenti değiştirdiğinde satırı da güncelle. WordPress çekirdeğinin ürettiği robots.txt kendi haritasını otomatik anar; sunucuda gerçek bir robots.txt dosyası varsa o çıktının yerine geçer. Next.js'te app/robots.ts bir sitemap alanı alır. robots.txt test aracı robots.txt dosyanın bildirdiği haritaları listeler; dosyanın geri kalanı robots.txt rehberinde.

lastmod: yalnızca dürüst tarihler

Google'ın kuralı kısa: değer sayfadaki son önemli güncellemenin tarihini yansıtmalı. Ana içerikte, yapılandırılmış veride ya da linklerde değişiklik genelde önemli sayılır; telif yılını güncellemek sayılmaz ("an update to the copyright date is not"). Gary Illyes 2023 tarihli yazısında sonucu açıkça söylüyor: sayfa yıllar önce değiştiği hâlde lastmod dün diyorsa "eventually we're not going to believe you anymore", yani bir noktada tarihlerine inanmayı bırakırlar. Aynı yazıya göre tarihini bilmediğin sayfalarda lastmod'u hiç yazmamak sorun değil.

İki site haritası kesiti: solda bütün adreslerde aynı derleme saati; sağda her adresin kendi içerik tarihi var, birinde lastmod yok
Açıklama: Bütün haritada birebir aynı saat, her şeyini aynı anda değiştirmiş bir site değil, bir üretici ayarıdır.

Sorunun yaygın kaynağı üretilme anını basan kod. Next.js site haritası belgesindeki örnek lastModified: new Date() kullanıyor; demo için sorun yok ama olduğu gibi kopyalanınca her adres derleme saatini alıyor. İçeriğin kendi tarihini kullan:

// app/sitemap.ts
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const yazilar = await getPosts()
  return yazilar.map((y) => ({
    url: `https://ornekblog.com/blog/${y.slug}`,
    lastModified: y.updatedAt, // metin gerçekten değişince güncellenir
  }))
}

WordPress'te 5.5 ile gelen ilk çekirdek haritada lastmod hiç yoktu; make.wordpress.org'daki güncel çekirdek haritası her yazı için bir lastmod listeliyor. Yazı tarihlerini belli aralıklarla "tazeleyen" eklentiler aynı sorunun sayfa düzeyindeki hâlini üretir. Google'ın faydalı içerik soruları da tam bunu soruyor: içerik esaslı biçimde değişmediği hâlde taze görünsün diye sayfa tarihlerini mi değiştiriyorsun? (faydalı içerik)

Taradığımız bir sitede tam bu desen vardı: haritadaki 790 adresin 790'ı milisaniyesine kadar aynı saati taşıyordu.

Approvalens raporunda "Değişmeyen güncelleme tarihleri" kartı; 790 adresin 790'ında aynı lastmod değeri
Açıklama: Gerçek bir rapordan kesit: kanıt satırı ortak lastmod değerini ve kaç adresin onu taşıdığını gösteriyor.

Approvalens neye bakıyor?

Haritaları önce robots.txt'deki Sitemap: satırlarında, sonra /sitemap.xml, /sitemap_index.xml, /wp-sitemap.xml, /sitemap-index.xml ve /sitemap.txt adreslerinde ararız. Dizin dosyalarını en yeni alt dosyadan başlayarak izler, en fazla 12 dosya ve 60.000 adres okuruz.

  • structure.sitemap: hiçbir dosya en az bir adresle 200 dönmüyorsa kalır. structure.sitemap_robots: harita bulduk ama robots.txt hiçbirini anmıyorsa çıkan bir öneri.
  • structure.sitemap_errors: HTML, geçersiz XML ya da bozuk gzip olarak gelen, ya da robots.txt'de adı geçip 200 dönmeyen dosyaları sayar.
  • structure.sitemap_bloat: haritadaki adreslerin %40'ından fazlası ve toplamda 20'den fazlası liste sayfasına benziyorsa çıkar: etiket, kategori, yazar, tarih, arama, feed ya da sayfa numarası adresleri ve sorgu parametreli adresler.
  • structure.sitemap_dead: haritada olup taradığımızda 200 dönmeyen sayfaları listeler.
  • seo.sitemap_quality: taramadığımız harita adreslerinden en fazla 15'lik bir örneği hata ve yönlendirme için, taranan her harita adresini de noindex ve başka yeri gösteren canonical için kontrol eder.
  • content.fake_freshness: iki tetikleyicisi olan bir tahmin. Ya en az 20 lastmod değerinin %95'i aynı ve son iki güne ait; ya da tarihli en az 5 yazının %70'i veya fazlası son iki günde "güncellenmiş" ama en az 60 gün önce yayımlanmış. Tarihleri yapılandırılmış veriden, Open Graph etiketlerinden ya da <time> öğelerinden okuruz.

Listenin tamamı metodoloji sayfasında.

Gönder ve raporu oku

Search Console'da Site haritaları raporunu aç, adresi "Add a new sitemap" kutusuna yapıştırıp gönder (rapor yardımı). Tabloda tür, gönderilme tarihi, son okunma, durum ve bulunan sayfa sayısı görünür. "Success" okunduğunu, "Couldn't fetch" Google'ın dosyayı alamadığını söyler; "Sitemap had X errors" neyi düzeltmen gerektiğini listeler. Türkçe arayüzde bu etiketler çevrilmiş görünür. Rapor yalnızca orada ya da API ile gönderdiğin haritaları gösterir, robots.txt üzerinden bulunanları göstermez. Tek bir adres için URL Denetimi'ndeki "Sitemaps" alanı o adresi içeren haritaları listeler.

Ücretsiz tarama haritalarını aynı şekilde okur; ölü kayıtları, yönlendirmeleri, noindex ve canonical dışı adresleri, liste şişkinliğini ve hiç değişmeyen lastmod değerlerini listeler.

Sık sorulan sorular

AdSense için site haritası şart mı?

Hayır. AdSense istemiyor; Google da küçük ve iyi bağlantılı sitelerin buna ihtiyaç duymayabileceğini söylüyor. Yine de Google'ın her yazını bulmasına yardım eder; bir incelemeci siteye baktığında bu işine yarar.

En iyi yazılarıma priority 1.0 vereyim mi?

Google için fark etmez; priority ve changefreq değerlerini yok sayıyor.

Kategori sayfaları haritada olmalı mı?

Yazılı bir girişi olan ana kategoriler olabilir. Zayıf etiketler, yazar ve tarih arşivleri, listelerin 2., 3., 4. sayfaları dışarıda kalsın.

Haritayı güncelleyince Google'a ping atmak işe yarar mı?

Google aynı 2023 yazısında site haritası ping uç noktasının kaldırılacağını duyurdu. Onun yerine robots.txt satırına ve Search Console gönderimine güven.

Eskimiş ya da yanlış bir şey mi gördün? Bize yaz, düzeltelim.

Bu rehberi İngilizce oku →

Kendi sitende kontrol et. Ücretsiz, kayıt yok.

Bunun için ücretsiz araçlar

Ücretsiz tarama

Kendi siteni kontrol et

Ücretsiz tarama: uygunluk puanı ve tüm sorunlar, genelde birkaç dakikada.

Ücretsiz tarama · puan ve bulunan tüm sorunlar · üyelik yok

Tüm rehberler →