İçeriğe geç
SEO

JavaScript SEO: SPA ve SSR Siteler İçin Rehber 2026

Yayın tarihi 6 Temmuz 2026 Yazar Kerem Kırbıyık 8 dk okuma Güncellendi:
JavaScript SEO kavramını, SPA ve SSR rendering farklarını anlatan teknik SEO illüstrasyonu

JavaScript SEO, sayfanın içerik, bağlantı ve meta verilerinin taranabilir ve doğru işlenebilir olmasını denetler. Bu yüzden framework adına veya sayfanın tarayıcıda sorunsuz çalışmasına değil, Google’ın gördüğü çıktıya bakın. Bu sayfa rendering mimarisi ve denetim akışına odaklanır; eski botlara özel prerender kurulumlarını ise aşağıdaki dynamic rendering bölümünde ele alıyoruz.

Google’ın işlemesini doğru yorumlayın

Google JavaScript sayfalarını tarama, rendering ve indeksleme süreçlerinden geçirir. Google, tarama izni olan ve 200 dönen sayfaları render kuyruğuna alır; kuyruğun ne zaman işleneceği kaynaklara bağlıdır ve sabit gün/hafta takvimi verilmez. noindex yönergesi Google’ın rendering adımını atlamasına yol açabilir. Render edilmiş olmak da indekslenmeyi garanti etmez. Google JavaScript SEO temelleri bu aşamaları ve sınırlamaları açıklar.

İlk HTML, kaynak erişimi ve render sonrası DOM’u karşılaştırın. Dizine eklenmeme raporu yalnız JavaScript hatası kanıtı değildir; erişim, canonical, içerik ve indeksleme politikası da incelenmelidir.

Mimari seçimi: sayfa ihtiyacını esas alın

Modelİçerik nerede hazırlanır?İncelenecek risk
CSRTarayıcıda JavaScript ileKaynak/veri erişimi, etkileşim bağımlılığı, ilk içerik
SSRİstek sırasında sunucudaTTFB, önbellek, kişisel veri ve hydration tutarlılığı
SSGDerleme sırasındaYeniden yayın gereği ve eski içerik
Yeniden üretim/hibritPlatforma göreCache invalidation, içerik güncelliği, gerçek adapter desteği

SEO açısından tek evrensel kazanan yoktur. İlk HTML’de hazır kritik içerik erişim bağımlılığını azaltabilir; bütün metrikleri veya indekslemeyi otomatik iyileştirmez. CSR kullanılabilir; davranış ve kaynak erişimi doğrulanmalıdır. Giriş gerektiren paneli indeksleme hedefiyle karıştırmayın.

SSG’de içerik güncelliğini, SSR’de ilk yanıt süresini ayrıca ölçün. Fiyat/stok değişen ürün, yayımlanmış blog ve kişisel hesap ekranı için aynı cache kuralını uygulamayın. Framework sürümü ve hosting adapter’ına göre destek değişir; örneğin Astro’da istek anında SSR için uyumlu bir server adapter gerekir. Eski Pages Router kodunu App Router örneği olarak vermeyin.

Denetim kayıt tablosu

BoyutHTML ve DOM’da karşılaştırılacak bilgi
İçerikAna başlık, kullanıcı işini çözen metin, ürün bilgisi
KeşifGerçek a href bağlantıları ve hedef durumları
KimlikURL, canonical, title, dil alternatifi
İndeks politikasıHTTP durum, robots meta/header ve kaynak engeli
İstemci geçişiDoğrudan URL açılışı ile router geçişi aynı içeriği veriyor mu?

JavaScript’in ürettiği gerçek a href bağlantıları render sonrası keşfedilebilir. Yalnız onclick içeren öğeyi aynı kabul etmeyin. Google bağlantı kuralları açısından sonuç HTML’ini inceleyin; bileşen adı yeterli değildir.

Üç somut test senaryosu

  1. Bir kategori alt sayfasını yeni sekmede doğrudan açın. Uygulama yalnız ana sayfadan router geçişinde çalışıyorsa sunucu fallback/rota davranışını araştırın. Bulunmayan rota, bütün sitede kullanılan boş uygulama kabuğunu (shell) 200 koduyla döndürmesin.
  2. Infinite scroll’un ikinci içerik grubuna ayrı URL ve gerçek href üzerinden ulaşın. Yalnız bir “Daha fazla” butonu bulunması, arama motorunun ona tıklayacağı anlamına gelmez; sayfalama hedeflerini HTML’de ve sitemap politikasında değerlendirin.
  3. Görünür içerikle canonical/robots değerlerini ilk yanıtta ve render sonrasında karşılaştırın. İlk yanıttaki noindex’i JavaScript ile kaldırmayı güvenilir indeksleme stratejisi saymayın.

Google’ın sayfayla etkileşim yapmasını gerektiren içerikleri ayrıca değerlendirin. Lazy loading görsel için uygun olabilir; kritik metni tıklama veya kaydırma (scroll) arkasına koymak erişim bağımlılığı yaratır. Her durumu otomatik görünmez ilan etmeden gerçek çıktı ve Google test kanıtını inceleyin.

SPA’de bulunmayan rota ve soft 404

İstemci tarafı router bilinmeyen bir adres için uygulama kabuğunu 200 ile döndürüp sayfada yalnız “bulunamadı” yazarsa gerçek 404 yerine soft 404 oluşabilir. Tercih edilen çözüm, sunucunun bulunmayan rotaya anlamlı 404 yanıtı vermesidir. CSR mimarisi bunu pratik biçimde üretemiyorsa Google, iki alternatif tarif eder: kullanıcıyı sunucuda 404 dönen bir adrese yönlendirmek veya hata görünümü belirlendiğinde JavaScript ile noindex eklemek. Bunlar mimariye bağlı seçeneklerdir; her SPA’ya körlemesine aynı kuralı uygulamayın.

DurumBeklenen kontrol
Geçerli ve indekslenmesi amaçlanan rotaDoğru içeriği, kendi URL’sini gösteren canonical’ı ve indeksleme iznini doğrula. İlk HTML’deki noindex değerini JavaScript ile sonradan kaldırmaya güvenme; Google bu yönergeyi görünce rendering’i atlayabilir.
Gerçekten bulunmayan rotaSunucu 404’ünü doğrula. Sunucu bunu üretemiyorsa, uygulanan redirect veya JavaScript noindex seçeneğini ve son DOM’u ayrı kaydet; hata rotasını geçerli sayfa gibi canonical/sitemap’e ekleme.
API/geçici veri hatasıÜrünün gerçekten kaldırıldığını varsayma. Kullanıcıya hata/yeniden deneme göster; noindex veya 404 kararını yalnız iş kuralı bu URL’nin artık geçerli olmadığını belirliyorsa ver.

Kabul testinde hem geçerli bir detay URL’sini hem bulunmayan bir rotayı doğrudan açıp yenileyin. İlk HTTP yanıtı, ilk HTML robots/canonical değerleri ve son DOM’u karşılaştırın. Geçersiz ürün kimliğinde yalnız istemci tarafı görünümü uygulayan örnek, gerçek Seobify davranış testi sayılmaz.

Rota ve hydration kontrolü

SSR çıktısı olsa bile hydration sırasında başlık, ürün verisi veya bağlantılar değişebilir; bu yüzden ilk yanıtı ve son DOM’u aynı URL için kaydedin. Bu karşılaştırma uygulamanın kendi tutarlılığını gösterir; Google’ın seçtiği canonical veya indeks durumunu ayrıca doğrulayın.

TestYapılacak kontrolKabul kaydı
Canonical tutarlılığıİlk HTML’deki canonical’ı DOM’daki değerlerle karşılaştır. Mevcut canonical’ı JavaScript ile başka bir hedefe değiştirme; JS ile ekleniyorsa tek bir canonical üret.İlk ve son değerler, etiket sayısı, farkın nedeni
Ayrı sayfa rotasıAyrı içerik için yalnızca /#/urun gibi fragment rotasına dayanma. Gerçek href ve History API ile URL üret; aynı URL’nin doğrudan açılışını ve yenilenmesini de kontrol et.İlk HTTP durumu, başlık/içerik ve router geçişi sonucu
Hydration sonrası içerikKritik metin, href, robots ve canonical’ı script çalışmadan önce ve sonra kaydet.Alan bazında önce/sonra karşılaştırması ve tarayıcı hata kaydı
Kaynak erişimiİçeriği oluşturan JS ve veri isteklerinin başarısını incele; robots engellerini ayrı kaydet. Bir kaynak tarayıcıda açılıyor diye Google tarafından erişilebilir yazma.Kaynak URL, HTTP sonucu, robots politikası ve Google test sonucu varsa bağlantısı

Google’ın JavaScript SEO belgesi, canonical tutarlılığı ve ayrı içerik için fragment yerine History API kullanımını açıklar. Bölüm içi normal #başlık bağlantıları ayrı sayfa rotası değildir.

Kısa kontrol listesi:

  • Temsilî bir detay sayfası, bir liste sayfası ve var olmayan bir adres seçin.
  • Her biri için ilk HTML’i; adresi doğrudan açınca, site içinden tıklayarak gidince ve sayfayı yenileyince görülen sonucu karşılaştırın.
  • Beklenen metni, başlığı, canonical ve robots değerlerini kaydedin.
  • Var olmayan adreste gerçek 404 mü, 404 dönen bir adrese yönlendirme mi, yoksa JavaScript ile eklenen noindex mi uygulandığını belirleyin.
  • Testin ortamını ve zamanını not edin; Search Console erişiminiz yoksa Google’daki dizin durumunu ve seçilen canonical’ı “bilinmiyor” olarak bırakın.

Dynamic rendering: eski kurulumu denetleme ve çıkış planı

Dynamic rendering, bot isteklerine sunucuda render edilmiş HTML, kullanıcılara istemci uygulaması sunan bir geçici çözümdür. Google dynamic rendering belgesi bunu uzun vadeli çözüm olarak önermez; ek karmaşıklık ve kaynak gerektiren bir ara çözüm olarak tanımlar ve yerine SSR, statik rendering veya hydration önerir. Benzer içerik sunan dynamic rendering genellikle cloaking sayılmaz; bu, her bot ayrımının veya her prerender servisinin otomatik onaylandığı anlamına gelmez.

Dynamic rendering, SSR veya edge üzerinde HTML üretimiyle aynı şey değildir. SSR/SSG’de içerik herkese hazır HTML olarak sunulur; edge yalnızca HTML’in üretildiği yerdir. Dynamic rendering’de ise isteği yapanın bot olup olmamasına göre sunum yolu değişir ve iki yolun eşitliği ayrıca doğrulanmalıdır.

Hâlâ botlara özel bir prerender proxy’si çalışıyorsa temsilî URL’lerde şunları kaydedin:

KontrolKaydedilecek kanıt
İçerik eşitliğiAynı URL’de başlık, ana metin, ürün fiyatı/stok ve bağlantı farkları
Meta eşitliğiCanonical, robots, hreflang ve JSON-LD farkları
CacheBot/kullanıcı varyantları ve kişisel içerik izolasyonu
Hata yönetimiTimeout, origin hatası ve geçersiz URL durumları
GüncellikYayın sonrası prerender cache yenilemesi
MaliyetRender sayısı, kuyruk, gecikme ve işletim ihtiyacı

Google, dynamic rendering sırasında oluşan hata sayfalarını cloaking saymaz ve diğer hata sayfaları gibi ele alır. Bu, hatalı yanıtı başarılı sayfa gibi döndürmenin gerekçesi değildir: geçerli bir URL’nin renderer timeout’u yüzünden boş bir 200 sayfaya dönüşmediğini, kaldırılmış bir URL’nin de eski prerender cache’inden içerik sunmadığını doğrulayın.

User-Agent metni kimlik doğrulama değildir; bot string’i eşleşti diye özel içeriğe erişim vermeyin. Prerender servisine cookie, Authorization veya tüm gelen başlıkları otomatik iletmeyin ve oturum gerektiren sayfaları kamuya açık render cache’ine almayın.

Kademeli çıkış planı:

  1. Kamuya açık şablonların ve gerçek render sorunlarının envanterini çıkarın.
  2. Bir temsilci URL grubunda herkese tutarlı ilk HTML sunan SSR veya SSG seçeneğini uygulayın.
  3. Eski ve yeni HTML/DOM, HTTP yanıtı ve temel kullanıcı akışını karşılaştırın.
  4. Veri güncelliğini ve cache yenilemesini kontrollü bir değişiklikle test edin.
  5. Botlara özel yolu yalnız kabul edilen grup için kaldırın; geri alma kuralını hazır tutun.

Taşıma sırasında URL’leri gereksiz yere değiştirmeyin. Sorun veri erişimi, taranamayan bağlantılar veya şablon hatasıysa yeni bir prerender servisine geçmeden önce onu çözün.

Seobify kaynak örneği ve sınırı

Bu projede bloglar Astro içerik kaynağından üretiliyor; yayın filtresi gelecekteki tarihleri production çıktısından çıkarıyor. Dolayısıyla astro dev’de görünmesi yayında olduğunun kanıtı değildir. Build çıktısındaki gerçek HTML ve rota kontrol edilir. Yeni bir yayın için yeniden build/deploy gerekir.

Bu mimari gözlem, alan performansı veya Googlebot canlı test sonucu değildir. Astro’da eklenen scriptler ve istemci adaları ayrıca incelenir. Core Web Vitals rehberi performans kabulünü ayrı ele alır.

Sık sorulan sorular

SSR’ye geçmek zorunlu mu?

Hayır. Önce gözlenen sorunu bulun. Kritik içeriği hazır HTML’de sunmak seçeneklerden biridir; taşıma maliyeti ve güncellik ihtiyacı hesaba katılır.

Rich Results Test indekslemeyi kanıtlar mı?

Hayır. Desteklenen yapılandırılmış veri ve render incelemesine yardımcı olabilir; Search Console indekslenmiş URL durumu ve canlı test de ayrı kontrollerdir.

JS yönlendirmesi her zaman yanlış mı?

Sunucu yönlendirmesi mümkünse daha doğrudan sinyaldir. İstemci yönlendirmesinin işlenmesi rendering’e bağlı olabilir; HTTP yöntemi ve kalıcı/geçici kararını ihtiyaca göre seçin.

Taşıma planı gerekiyorsa site taşıma (migration) rehberine, hizmet kapsamı için SEO danışmanlığına geçin.

Bu yazı faydalı oldu mu?

Seobify ile çalışın

Bu konuda destek almak ister misiniz?

Sitenizin Google'da neden geride kaldığını bulur, düzeltmeleri kodda ve içerikte biz uygularız. Ücretsiz ön değerlendirme ile başlayın.

Hızlı Teklif Alın

Bilgilerinizi yalnız bu talebe yanıt vermek için kullanırız. KVKK Aydınlatma Metni