Astro ile SEO

Astro, SEO için en güçlü framework'lerden biridir — sayfaları varsayılan olarak statik HTML biçiminde önceden oluşturur ve yalnızca istediğiniz yerlerde JS gönderir; ayrıca güçlü Core Web Vitals sonuçları sunar. Ancak varsayılanlar garanti değildir ve Astro meta etiketlerinizi, site haritanızı veya canonical etiketlerinizi sizin yerinize yazmaz. Kendi Astro sitemi nasıl yönettiğimi ve mimariyi nasıl doğru kuracağınızı burada anlatıyorum.

İlk yayın tarihi: 26 Haz 2026 · Son güncelleme: 9 Ağu 2026 · Advanced
Diller

Astro, varsayılan olarak statik HTML biçiminde önceden oluşturma yaptığı için SEO açısından en güçlü framework seçeneklerinden biridir — içeriğiniz, ilgili route ilk kez tarandığında ham HTML'in içinde yer alır ve beklenmesi gereken bir oluşturma kuyruğu yoktur. Islands, yalnızca bir client direktifiyle işaretlediğiniz bileşenleri hydrate eder; bu nedenle sayfanın büyük bölümü kendi hydration JS'i olmadan gönderilir (Astro yine de başka yerlerde sayfa script'leri ve router JS'i ekleyebilir). Bunların hiçbiri tek başına taranabilirliği, dizine eklenmeyi veya sıralamaları garanti etmez; bu yüzden dağıtılmış route'ları doğrulayın. Astro siteleri ayrıca güçlü Core Web Vitals sonuçları gösterir. Ancak Astro temiz HTML üretse de meta etiketlerinizi, canonical etiketlerinizi, site haritanızı veya yapılandırılmış verinizi yazmaz — bunlar bilinçli derleme adımlarıdır. Site haritası keşfi de statik olarak oluşturulan route'ları hedeflediğinden yalnızca çalışma zamanında var olan URL'lerin açıkça ele alınması gerekir. Bir adapter gerektiren Server Islands ve View Transitions, tarayıcıların gerçekte ne aldığını anladığınızda SEO açısından güvenlidir. patrickstox.com'u Astro ile çalıştırıyorum; yani bu, gerçekten kullandığım teknoloji yığını.

TL;DR — Astro, mimari açıdan SEO için iyi hazırlanmıştır: sayfalar ve endpoint’ler varsayılan olarak statik HTML biçiminde önceden oluşturulur; dolayısıyla bu içerik için bir oluşturma kuyruğu dalgasını beklemek gerekmez. Ancak bu yalnızca varsayılandır, evrensel bir garanti değildir; statik/sunucu HTML’si tek başına üretim URL’lerinizin taranabilirliğini, dizine eklenmesini, sıralamalarını veya Core Web Vitals sonuçlarını kanıtlamaz. Islands mimarisi yalnızca client:* direktifiyle işaretlediğiniz bileşenleri hydrate eder — diğer her şey kendi hydration JS’i olmadan HTML gönderir; ancak sayfa script’leri, diğer island’lar ve router geliştirmeleri sayfanın başka yerlerine yine de JavaScript ekleyebilir. Astro meta etiketleri, canonical’ları, site haritalarını veya yapılandırılmış verileri otomatik oluşturmaz — bunları açıkça bağlayın; tercihen Content Collections + Zod ile doğrulayın. Bir adapter gerektiren Server Islands, statik kabuğu ilk belgede fallback içeriğiyle sunar ve ertelenmiş içeriği sonrasında bağımsız olarak getirir — varsayımda bulunmak yerine belirli bir tarayıcının gerçekte ne aldığını doğrulayın. View Transitions, history.pushState kullanır ve SEO açısından güvenlidir; Google alttaki MPA sayfalarını normal biçimde tarar. patrickstox.com’u Astro üzerinde çalıştırıyorum ve aşağıdaki özellikler gerçekten kullandıklarımdır — yalnızca yerel geliştirmede değil, dağıtılmış sitede doğrulanmıştır. Evidence for this claim Astro prerenders pages as static HTML by default and only sends client JavaScript for explicitly hydrated components. Scope: Astro default static output and islands architecture. Confidence: high · Verified: Astro: Why Astro

Astro, JavaScript oluşturma sorununu neden tamamen aşar?

JavaScript SEO’nun zor olmasının temel nedeni ikinci dalgadır. Google önce ham HTML’nizi alır, ardından sayfayı daha sonra headless Chromium’da oluşturulmak üzere kuyruğa koyar — risk de bu kuyruktur. Google’ın kendi dokümanları bunu şöyle açıklar: “Googlebot queues all pages with a 200 HTTP status code for rendering unless a robots meta tag tells Google not to index the page. The page may stay on this queue for a few seconds, but it can take longer than that.” İstemci tarafında oluşturulan bir SPA’da içeriğiniz, bu oluşturma dalgası çalışana kadar mevcut değildir.

Astro’nun varsayılan çıktı modu static’tir: sayfalar ve endpoint’ler derleme zamanında eksiksiz bir HTML dosyası olarak önceden oluşturulur. Dolayısıyla bu varsayılanı kullanan bir route için ham HTML, oluşturulmuş sayfanın kendisidir. Bu route’ta çalıştırılacak hiçbir şey kalmadığından beklenmesi gereken ikinci bir dalga yoktur. Googlebot ilk istekte tüm içeriği görür. Joost de Valk’ın (Yoast’ın kurucusu) ifadesiyle, “From an SEO perspective, static HTML on a CDN is a better starting point than most CMSes will ever give you.” Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering

Ancak bu varsayılandır — her route’un evrensel bir özelliği değildir. output: 'server' ayarladığınızda varsayılan, isteğe bağlı oluşturmaya geçer (aşağıda daha fazlası var); statik varsayılanlı bir projede bile adapter, tek bir route’un export const prerender = false ile bunun dışında kalmasına olanak tanır. Bunların hiçbiri yalnızca mimari tarafından garanti edilmez: statik veya sunucu HTML’si, island’lar ve adapter’lar kendi başlarına taranabilirliği, dizine eklenmeyi, sıralamaları veya Core Web Vitals sonuçlarını garanti etmez — bunlar dağıtılmış route’a ve belirli tarayıcıya bağlıdır; bu nedenle framework’ün bunları hallettiğini varsaymak yerine doğrulayın.

Bu, hiç oluşturma yapamayan tarayıcılara da yardımcı olur. Google açıkça “not all bots can run JavaScript” diyor — çoğu AI tarayıcısı ve birçok üçüncü taraf araç açısından 2026 gerçeği de budur. Astro’nun HTML öncelikli çıktısı, yalnızca Googlebot tarafından değil, gerçekten önceden oluşturulduğu yerlerde bunların tümü tarafından okunabilir. (Headless CMS için SEO yazımda da aynı noktayı vurguluyorum: oluşturma modu ürünün kendisidir.)

Islands mimarisi: Yalnızca istediğiniz yerde JS

Astro bileşenlerinizi HTML’ye dönüştürür ve kendi ifadesiyle “just HTML & CSS, stripping out all client-side JavaScript automatically.” Etkileşim isteğe bağlıdır. Bir bileşeni client:* direktifiyle — client:load, client:idle veya client:visible — işaretlersiniz ve JavaScript ile yalnızca o island hydrate edilir. Diğer her şey statik HTML olarak kalır. Evidence for this claim Astro client directives selectively hydrate interactive islands while other components remain static HTML. Scope: Astro islands and client directives. Confidence: high · Verified: Astro: Islands

SEO açısından bu ideale yakındır. Googlebot’un dizine eklemesi gereken içerik düz HTML’dir ve etkileşimli widget’larınız onu yavaşlatmaz. client:visible özellikle kullanışlıdır: ekranın ilk görünümünün altındaki bir bileşen, görünür alana kaydırılana kadar hydrate edilmeye başlamaz; dolayısıyla LCP’nizi hiçbir zaman engellemez. Kavram, Preact’in yaratıcısı Jason Miller’dan gelir; seçici hydration için “rendering HTML pages on the server, and inject[ing] placeholders or slots around highly dynamic regions” ifadesini kullanmıştır.

Rakip içeriklerde birbirine karıştırılma eğilimi gösterdikleri için iki ayrımı netleştirmekte yarar var:

  • client:only farklı bir yapıdır. client:load/client:idle/client:visible aksine, client:only bileşeni sunucu taraflı oluşturmayı tamamen atlar — sunucuda hiçbir HTML üretmez. Yalnızca bir client:only bileşeninin içine yerleştirilen dizine eklenebilir içerik, Googlebot’un aldığı belgede bulunmaz; ancak tarayıcı bileşeni hydrate ettikten sonra mevcut olur. Birincil içeriği buraya koymayın.
  • Bu, resumability değil seçici hydration’dır. Astro her island’ın istemci kodunu tarayıcıda sıfırdan yeniden çalıştırır; örneğin Qwik’in resumability modelinde olduğu gibi sunucuda serileştirilmiş yürütme durumunu sürdürmez. Yazılarda bu ikisi birbirine karıştırılır — aynı mekanizma değildir. Evidence for this claim A client:only component skips server rendering, so indexable content placed only inside it cannot be assumed to exist in the initial page HTML. Scope: client and server islands Confidence: high · Verified: Template directives reference

Hydrate edilmemiş bir bileşen, sayfadaki JavaScript tablosunun tamamı değildir. “Zero JS”, client:* direktifi olmayan tek bir bileşeni tanımlar — Astro aynı sayfanın başka yerlerinde sayfa düzeyinde <script> etiketleri, View Transitions router’ı ve diğer island’ları yine de gönderebilir. Gönderilenleri sayfa hakkında genel bir iddia olarak değil, bileşen/route bazında açıklayın.

Astro otomatik olarak neleri YAPMAZ?

Astro temiz, semantik HTML üretir — SEO açısından başka hiçbir şey üretmez. Kutudan çıktığı hâliyle metadata, canonical, site haritası veya yapılandırılmış veri yoktur. “Astro otomatik olarak SEO için optimize edilmiştir” iddiası tam anlamıyla bir mittir. Şunlar sizin sorumluluğunuzdadır:

  • Meta etiketleri (title, description, Open Graph, Twitter)
  • Canonical URL’ler
  • Site haritası (resmî entegrasyon aracılığıyla)
  • Yapılandırılmış veri / JSON-LD
  • robots.txt

Astro, kullandığım en iyi temeldir; ancak tamamlanmış bir ev değil, yalnızca temeldir.

Site haritası: @astrojs/sitemap

npx astro add sitemap komutuyla kurun. Statik olarak oluşturulan route’larınızı tarar ve derleme zamanında bir sitemap-index.xml ile parçalara ayrılmış sitemap-0.xml dosyaları üretir. İnsanların karşısına çıkan iki sorun vardır: Evidence for this claim Astro's official sitemap integration generates sitemap files from statically generated routes. Scope: Astro @astrojs/sitemap integration. Confidence: high · Verified: Astro: Sitemap integration

  • astro.config.mjs içinde site: ayarlamalısınız. Bu olmadan entegrasyon sessizce hiçbir şey üretmez. “Site haritam nerede?” sorusunun en yaygın nedeni budur.
  • Site haritası satırını robots.txt dosyasına kendiniz eklemelisiniz. Astro bunu yapmaz.

Kontrol amacıyla filter() route’ları hariç tutar (önizleme/taslak sayfaları — bu sitede tam olarak bunun için kullanıyorum), serialize() ile lastmod/changefreq/priority belirleyebilirsiniz ve i18n seçeneği site haritasında hreflang girdileri üretir. Güncel @astrojs/sitemap dokümanlarında belirtilen davranış budur — eski bir sürüm kullanıyorsanız kurulu sürümünüzle karşılaştırarak doğrulayın; entegrasyon davranışı daha önce ana sürümler arasında değişmiştir.

İnsanların kafasını karıştıran kapsam: Entegrasyonun keşif mekanizması statik olarak oluşturulmuş route’ları hedefler. URL’lerinizden herhangi biri yalnızca çalışma zamanında mevcutsa — sunucu tarafında oluşturulan (output: 'server') route’lar veya derleme zamanı yerine talep üzerine oluşturulan route’lar — bunların site haritasında olduğunu varsaymayın. customPages ile açıkça ekleyin ve ardından gerçekten orada olduklarını doğrulamak için bir derlemeden sonra sitemap-index.xml dosyasını açın. Derleme zamanında oluşturulan statik bir route olmayan hiçbir şey için “entegrasyon bunu hallediyor” varsayımına güvenmeyin.

Meta etiketleri ve canonical’lar: BaseLayout kalıbı

Astro’nun özel bir <Head> bileşeni yoktur — .astro dosyalarında <head> üzerinde doğrudan kontrol sahibisiniz. Standart kalıp (benim de kullandığım), title, description ve canonicalURL değerlerini props olarak alan ve head bölümünü yazan tek bir BaseLayout.astro dosyasıdır. Her sayfada canonical’ı açıkça belirleyin ve og:url ile tutarlı tutun. Bir kütüphaneye ihtiyacınız yoktur; ancak isterseniz topluluğa ait astro-seo paketi (npm), title/description/OG/Twitter/canonical için kullanışlı, tek bileşenli bir sarmalayıcıdır.

SEO güvenlik ağı olarak Content Collections

Bu, Astro’nun değeri yeterince bilinmeyen SEO özelliğidir. Content Collections, Markdown/MDX/JSON içeriğiniz için Zod şema doğrulaması sunan, tür güvenli bir içerik katmanıdır. Bu sayede title ve description alanlarını zorunlu alanlar yapabilirsiniz — bir sayfada bunlardan biri eksikse derleme başarısız olur. Yanlışlıkla başlıksız bir sayfa yayımlayamazsınız. Sorgu fonksiyonları (getCollection(), getEntry()) derleme zamanında statik sayfalar üretir; bu nedenle dağıtıldığında çıktı düz HTML’dir. MDX ham Markdown’ı tek doğru kaynak olarak koruduğundan bu dosyalar, AI tarayıcıları ve llms.txt benzeri kalıplar için de temiz kaynak içeriktir. Bu site, Zod ile doğrulanan frontmatter kullanan Content Collections üzerine kurulmuştur.

astro:assets: Görselleri doğru kullanmak (bir tuzakla birlikte)

<Image /> bileşeni görselleri otomatik olarak WebP’ye dönüştürür, “avoid Cumulative Layout Shift (CLS)” amacıyla boyutları çıkarır, varsayılan olarak loading="lazy" ayarlar ve alt gerektirir — eksik bir alt, derleme hatasıdır. <Picture />, bunu AVIF/WebP/fallback <source> öğeleriyle genişletir.

Tuzak şudur: Otomatik loading="lazy", LCP görseliniz (genellikle hero) için yanlıştır. En önemli görselinizi tembel yüklemek onu geciktirir. İlk görünüm alanındaki görsellerde loading="eager" ve fetchpriority="high" ile varsayılanı geçersiz kılın. Uzak görseller açıkça belirtilmiş width ve height değerleri gerektirir.

Server Islands: Tarayıcılar gerçekte ne görür?

Server Islands (Astro 4.12+), rakip rehberlerin en sık yanlış anlattığı özelliktir. server:defer kullanıldığında bir bileşen, ana sayfadan bağımsız olarak sunucuda oluşturulur. Statik kabuk hemen sunulur; Astro’nun dokümanlarına göre, “Your page will be rendered immediately with any specified fallback content as a placeholder. Then, the component’s own contents are fetched on the client and displayed when available.”

İki noktayı tam olarak açıklamak gerekir. Birincisi, Server Islands bir adapter gerektirir — tamamen statik bir derlemenin kendiliğinden ürettiği bir şey değil, isteğe bağlı bir özelliktir. İkincisi, sıra şöyledir: İlk belge, fallback içerik olarak yapılandırdığınız şeyle birlikte gönderilir ve island’ın gerçek içeriği, sayfa yüklendikten sonra kendi endpoint’i üzerinden alınan ayrı ve bağımsız bir istektir. Bu, ilk belgenin içerdikleri için kesin alt sınırdır — dağıtılmış URL’lerinizi doğrudan test etmeden her belirli tarayıcının daha sonra ne yaptığı konusunda bunun ötesinde genelleme yapmam.

SEO açısından sonuç somuttur: Bir tarayıcının ilk istekte okuduğu statik HTML, ertelenmiş island içeriğini değil fallback içeriğinizi barındırır. Bu, Server Islands’ın kullanım amacı olan kişiselleştirilmiş ve oturuma özgü içerikler (oturum açma durumu, sepet sayısı, öneriler) için idealdir; bunlar zaten önbelleğe alınmamalı veya dizine eklenmemelidir. Birincil, dizine eklenebilir içerik içinse yanlıştır. Sıralanması gereken her şeyi ana Astro şablonuna koyun ve Server Islands’ı çevresindeki dinamik parçalar için kullanın.

Çıktı modları: static ve server ile route bazında geçersiz kılma

Astro’nun varsayılan çıktı modu static’tir — sayfalar ve endpoint’ler derleme zamanında HTML olarak önceden oluşturulur. astro.config.mjs içinde output: 'server' ayarladığınızda varsayılan, isteğe bağlı oluşturmaya geçer: Sayfalar her istekte bir adapter aracılığıyla oluşturulur; bu, kimlik doğrulama, gerçek zamanlı veri veya Server Islands’ın kapsamadığı kişiselleştirme için kullanışlıdır. Her iki durumda da varsayılanı route bazında geçersiz kılabilirsiniz: Statik varsayılanlı bir projede export const prerender = false, route’u isteğe bağlı oluşturmaya geçirir; sunucu varsayılanlı bir projede export const prerender = true, route’u yeniden derleme zamanında önceden oluşturmaya geçirir. Dolayısıyla “sitem statik” veya “sitem SSR” ifadesi nadiren her route için doğrudur — yalnızca üst düzey yapılandırmayı değil, route bazındaki ayarı kontrol edin. Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering

Salt SEO açısından önceden oluşturulmuş ve isteğe bağlı HTML eşdeğerdir — route’un tam markup ile 200 döndürdüğünü gerçekten doğruladıktan sonra ikisi de tarayıcının ilk isteğine eksiksiz HTML sunar. İsteğe bağlı route’lar HTML’lerini stream edebilir; yavaş veri veya ağ koşulları sonraki parçaları geciktirebilir. Bu nedenle stream edilen bir yanıt, içeriğin her parçasının ulaştığını otomatik olarak kanıtlamaz — kontrol edin, varsaymayın. İki mod arasındaki gerçek fark operasyoneldir: Önceden oluşturulmuş içerik bir sonraki derlemeye (veya ayrıca yapılandırılmış bir çalışma zamanı yenilemesine) kadar sabittir ve doğrudan CDN edge üzerinden sunulur; isteğe bağlı içerik her zaman günceldir ancak üretimde adapter ve çalışma zamanınızın sağlıklı olmasına bağlıdır. Bunu bir SEO kararı olarak görmeyin — veri güncelliği ve operasyonlara göre seçim yapın, ardından yerel geliştirmede çalışanlardan çıkarım yapmak yerine dağıtılmış route’ları, durum kodlarını, yönlendirmeleri ve yanıt header’larını doğrulayın.

View Transitions: SPA hissine rağmen SEO açısından güvenli

Astro’nun <ClientRouter /> bileşeni (önceki adıyla <ViewTransitions />), tarayıcının View Transitions API’sini ve History API’yi kullanarak SPA benzeri yumuşak gezinme sağlar. Temel gerçek şudur: history.pushState ile gezinir ve Google’ın istemci tarafı gezinme için önerdiği yöntem tam olarak budur — Google, fragment tabanlı (#hash) URL’leri “can’t reliably resolve.” diye belirtir. En önemlisi, View Transitions tarayıcı taraflı bir geliştirmedir. Googlebot tarama yaptığında her URL’yi ister ve normal, eksiksiz bir HTML sayfası alır — alttaki MPA değişmeden kalır. Geçişler yalnızca bir insanın tarayıcıda gördüklerini etkiler.

Dolayısıyla hayır, View Transitions Astro sitenizi bir SPA’ya dönüştürmez ve SEO’yu bozmaz. Dikkate değer bir eksiklik: Astro’nun View Transitions dokümanlarında SEO bölümü yoktur; “SEO’yu bozar” mitinin sürmesinin nedeni muhtemelen budur. Kendi sitenizde doğrulamak için birkaç URL’yi doğrudan alın ve her birinin eksiksiz HTML döndürdüğünü doğrulayın — inanca dayanmayın, kendi dağıtımınızı kontrol edin.

Yaygın Astro SEO hataları

  1. Astro’nun SEO’yu sizin için hallettiğini varsaymak. Astro HTML’yi halleder. Meta, canonical, site haritası ve schema sizin sorumluluğunuzdadır.
  2. Yapılandırmada site: değerini unutmak — site haritanız sessizce oluşturulmaz.
  3. Site haritasını robots.txt dosyasına eklememek — Astro bunu yapmaz.
  4. LCP görselini tembel yüklemek — hero için eager + fetchpriority kullanarak varsayılanı geçersiz kılın.
  5. Dizine eklenebilir içeriği bir Server Island’a koymak — tarayıcılar içeriği değil fallback’i görür ve Server Islands en başta bir adapter gerektirir.
  6. Kusursuz bir Lighthouse puanı peşinde koşup orada durmak. Hız bir sıralama sinyalidir, tek sıralama sinyali değildir. Hızlı ve boş bir sayfa sıralanmaz — içerik, bağlantılar ve E-E-A-T asıl yükü taşımaya devam eder.
  7. Dizine eklenebilir içeriği yalnızca bir client:only bileşenine koymak. Diğer client:* direktiflerinden farklı olarak client:only, sunucu taraflı oluşturmayı tamamen atlar — tarayıcı bileşeni hydrate edene kadar o bileşene ait HTML yoktur.
  8. “Astro statik/hızlıdır” ifadesini sonuç garantisi olarak görmek. Statik veya isteğe bağlı HTML, island’lar ve adapter’lar mekanizmalardır — kendi başlarına taranabilirliği, dizine eklenmeyi, sıralamaları veya Core Web Vitals sonuçlarını garanti etmezler. Mimari diyagramı değil, dağıtılmış route’u doğrulayın.

Bu, içerik kümesinin neresinde yer alıyor?

Astro, JavaScript SEO konusunun oluşturma hakkında ortaya koyduğu sorulara yönelik belirli ve alışılmadık ölçüde SEO dostu bir yanıttır; ayrıca headless CMS kurulumları için popüler bir frontend’dir. Performans tarafı, web performansı kümesindeki Core Web Vitals ile doğrudan bağlantılıdır; “içeriğim gerçekten HTML’nin içinde mi?” test disiplini ise tarama ve dizine ekleme kümelerindekiyle aynıdır.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.