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:

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.

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 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.