Next.js SEO rehberi: SSG, SSR veya ISR seçimi, meta veri ve kanonik ayarı, sitemap.xml oluşturma, webhook ile beslenen blog ve yapay zeka tarayıcılarının okuyabildiği sayfalar.

Kısaca
Next.js, tarayıcılara boş bir kabuk yerine eksiksiz HTML gönderdiği için SEO açısından en iyi React çatılarından biridir. Sıralama almak için içerik sayfalarını önceden oluşturun (statik üretim veya ISR), başlıkları, açıklamaları ve kanonik adresleri Metadata API ile tanımlayın, sitemap.xml ve robots.txt dosyalarını app klasöründen üretin, gerçek bağlantılar ve doğru durum kodları kullanın ve ana içeriği yalnızca tarayıcıda çalışan kodun dışında tutun; çünkü yapay zeka tarayıcılarının çoğu JavaScript çalıştırmaz.
Daha fazlasını mı istiyorsunuz? Sorun:
Kısa test
SEO size uygun mu ve nasıl başlamalısınız?
Google'ın size müşteri getirip getiremeyeceğini görmek için 4 kısa soru.
Size önerimiz
Sorank sizin için doğru çözüm
İnsanlar sattığınız şeyi arıyor ve birkaç ay bekleyebilirsiniz: Sorank doğru aramaları bulur, makaleleri yazıp yayınlar ve size bağlantı kazandırır.
Sorank yanıtlarınıza uyuyor
Kendi sitenizde 3 gün deneyin ya da nerede olduğunuzu görmek için ücretsiz bir denetimle başlayın.
3 gün ücretsiz, sonra istediğiniz zaman bırakın. 90 gün para iade garantisi.
Next.js SEO her şeyden önce her rota için doğru seçimi yapmaktır: neyin sunucuda oluşturulacağı, neyin önbelleğe alınacağı ve herhangi bir betik çalışmadan önce HTML'de neyin yer alacağı. Google, JavaScript SEO temel bilgileri sayfasında JavaScript uygulamalarını üç aşamada işlediğini (tarama, oluşturma, dizine ekleme) ve sunucu tarafı oluşturmanın ya da ön oluşturmanın "hâlâ çok iyi bir fikir" olduğunu açıklar. Next.js bunu varsayılan olarak yapar. Bu rehber App Router'ı (Next.js 13 ve sonrası) ele alır, eski Pages Router için de notlar içerir.
Evet. İstemci tarafında oluşturulan klasik bir React uygulaması neredeyse boş bir HTML dosyası gönderir ve sayfayı tarayıcıda kurar; arama motorlarının onu oluşturması gerekir ve birçok bot bunu hiç yapmaz. Next.js React'i sunucuda oluşturur, dolayısıyla HTML yanıtı başlıkları, metni, bağlantıları ve meta verileri zaten içerir. JavaScript SEO rehberimiz bu farkın dizine ekleme için neden önemli olduğunu açıklıyor.
App Router'da bileşenler varsayılan olarak Server Components olarak çalışır. 'use client' ile işaretlenen bileşenler bile sunucuda HTML olarak önceden oluşturulur. Zayıf nokta veridir: useEffect içinde ya da yalnızca bir tıklamadan sonra yüklediğiniz her şey ilk HTML'de yer almaz. İçeriği Server Components içinde çekin, istemci bileşenlerini etkileşim için kullanın.
Next.js modları rota bazında karıştırmanıza izin verir. Seçim; güncelliği, hızı ve tarayıcıların ne aldığını etkiler.
| Mod | HTML ne zaman oluşur | SEO değerlendirmesi | Uygun olduğu alan |
|---|---|---|---|
| Statik üretim (SSG) | Derleme sırasında | En iyisi: eksiksiz HTML, çok hızlı | Açılış sayfaları, dokümantasyon, kalıcı makaleler |
| Artımlı statik yeniden üretim (ISR) | Derlemede, ardından arka planda veya istek üzerine yenilenir | Büyük veya sık değişen siteler için en iyisi | Bloglar, ürün katalogları, CMS sayfaları |
| Sunucu tarafı oluşturma (SSR) | Her istekte | İyi: eksiksiz HTML, sunucu hızına bağlı | Kişiselleştirilmiş veya gerçek zamanlı sayfalar |
| İstemci tarafı oluşturma (CSR) | Tarayıcıda | Zayıf: içerik çoğu bot için görünmez | Giriş gerektiren paneller |
Next.js ISR dokümantasyonu faydalarını sıralar: statik içeriği "tüm siteyi yeniden derlemeden" güncellemek ve uzun derleme süreleri olmadan çok sayıda sayfayı yönetmek. export const revalidate = 3600 içeren bir rota en fazla saatte bir yeniden üretilir; tam kontrol için içerik değiştiğinde revalidatePath veya revalidateTag çağırın. ISR statik dışa aktarma (output: 'export') ile çalışmaz. İstemci tarafında oluşturulmaya devam etmesi gereken uygulamalar için tek sayfalık uygulama SEO rehberimiz çözümleri anlatıyor.
İpucu
Tarayıcınızın gösterdiğini değil, botların aldığını kontrol edin: URL üzerinde curl çalıştırın ya da view-source açıp makaleden bir cümle arayın. Ham HTML'de yoksa o cümle JavaScript'e bağlıdır.
App Router'da Metadata API, next/head'in yerini alır. Next.js meta veri dokümantasyonuna göre bir layout veya sayfadan statik bir metadata nesnesi ya da değerler veriye bağlıysa bir generateMetadata fonksiyonu dışa aktarırsınız ve Next.js head etiketlerini üretir. Her ikisi de yalnızca Server Components içinde desteklenir.
export async function generateMetadata({ params }) {
const { slug } = await params
const post = await getPost(slug)
return {
title: post.title,
description: post.excerpt,
alternates: { canonical: `/blog/${slug}` },
openGraph: { images: [post.cover] },
}
}Sorunların çoğunu önleyen beş kural:
Dinamik sayfalarda Next.js, oluşturmayı hızlandırmak için meta verileri ilk baytlardan sonra akış halinde gönderir. Dokümantasyona göre akış, meta verileri head içinde bekleyen ve user agent ile tanınan botlar için devre dışıdır (örnekler arasında Bingbot, Twitterbot ve Slackbot var); htmlLimitedBots seçeneği listeyi özelleştirir. Önem verdiğiniz bir tarayıcı listede yoksa ekleyin. Pages Router'daki karşılığı, yinelenen etiketleri önlemek için key özniteliğiyle kullanılan next/head içindeki Head bileşenidir.
İkisi de app klasöründeki özel dosyalardır. URL döndüren bir fonksiyonu dışa aktaran sitemap.ts dosyası /sitemap.xml olur; robots.ts dosyası /robots.txt olur. Site haritası referansı, dosyanın varsayılan olarak önbelleğe alındığını ve Google'ın sınırının site haritası başına 50.000 URL olduğunu belirtir; bunun üzerinde generateSitemaps onu birkaç dosyaya böler.
import type { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts()
return posts.map((p) => ({
url: `https://example.com/blog/${p.slug}`,
lastModified: p.updatedAt,
}))
}Yalnızca kanonik, dizine eklenebilir ve 200 döndüren URL'leri ekleyin, lastModified alanına gerçek güncelleme tarihini yazın. Site haritası çok dilli siteler için alternates.languages da kabul eder. robots.ts içinde site haritasını gösterin ve hangi yapay zeka botlarının siteyi tarayabileceğine karar verin; yapay zeka tarayıcıları için robots.txt makalemiz bunları listeliyor. Biçimle ilgili ayrıntılar XML site haritası sözlük maddemizde.
| Sorun | Ne olur | Çözüm |
|---|---|---|
| onClick ve router.push ile gezinme | Google yalnızca href içeren a öğelerini izler | Gerçek bir bağlantı üreten next/link içindeki Link bileşenini kullanmak |
| Var olmayan içeriğin 200 sayfası olarak sunulması | Search Console'da "Soft 404" | Rotanın 404 durumu döndürmesi için notFound() çağırmak |
| Taşınan sayfalar için geçici yönlendirmeler | redirect() bir 307 gönderir | permanentRedirect() veya next.config içinde permanent: true kullanmak (308) |
| Sondaki eğik çizgilerin karışık kullanımı | Aynı sayfa için iki URL | trailingSlash seçeneğiyle birini seçmek ve kanonikleri tutarlı tutmak |
| Önizleme veya test ortamlarının dizine eklenmesi | Google'da sitenin yinelenen kopyaları | Canlı olmayan alan adlarında noindex göndermek |
| Tıklayınca yüklenen sekme içerikleri | Metin HTML'de yok | Tüm içeriği sunucuda oluşturmak, gerekirse CSS ile gizlemek |
Bu sorunların hepsi taranabilirliği azaltır: bir tarayıcı her URL'yi bağlantılar üzerinden keşfedebilmeli ve temiz bir durum kodu almalıdır.
Next.js dokümantasyonu, JSON-LD'yi application/ld+json türünde bir script etiketi olarak doğrudan sayfa veya layout bileşeninde, sayfayla aynı veriden oluşturmayı ve enjeksiyonu önlemek için serileştirilmiş JSON içindeki < karakterini kaçış karakteriyle değiştirmeyi önerir. Sunucuda oluşturulduğu için Google ve yapay zeka tarayıcıları onu ham HTML'de görür. Yazılar için Article (veya BlogPosting), kök layout'ta Organization, derin sayfalar için BreadcrumbList ve e-ticarette Product kullanın. Bir schema oluşturucu size geçerli bir başlangıç bloğu verir; ardından sayfayı Google'ın zengin sonuç testiyle doğrulayın.
Next.js, zayıf Core Web Vitals değerlerinin yaygın nedenlerini çözen bileşenlerle gelir:
Yalnızca laboratuvar puanını değil, saha verilerini ölçün: PageSpeed Insights rehberimiz ikisinin nasıl okunacağını gösteriyor.
Bir Next.js blogu genellikle üç biçimden birini alır: depodaki MDX veya Markdown dosyaları (basit ama her yazı bir commit ve dağıtım gerektirir), Server Components içinde sorgulanan bir headless CMS (Sanity, Contentful, Strapi, Payload) ya da harici bir araçtan makale alan bir yayın webhook'u. Üç durumda da SEO kalıbı aynıdır: generateStaticParams, generateMetadata ve ISR içeren dinamik bir app/blog/[slug] rotası, aynı kaynaktan beslenen bir site haritası ve tüm yazılara bağlantı veren bir liste sayfası.
Webhook, yayınlamayı dağıtım döngüsünden ayırır. Bir Route Handler makaleyi alır, kaydeder ve ilgili sayfaları yeniden doğrular:
// app/api/publish/route.ts
import { revalidatePath } from 'next/cache'
export async function POST(request) {
if (request.headers.get('authorization') !== `Bearer ${process.env.PUBLISH_SECRET}`) {
return new Response('Unauthorized', { status: 401 })
}
const article = await request.json()
await savePost(article)
revalidatePath('/blog')
revalidatePath(`/blog/${article.slug}`)
return Response.json({ ok: true })
}Dikkat
Uç noktayı bir gizli anahtarla koruyun ve tam olarak herkese açık yolu yeniden doğrulayın. ISR dokümantasyonu, birden çok sunucu örneği ve varsayılan dosya önbelleğiyle istek üzerine yeniden doğrulamanın yalnızca çağrıyı alan örneği temizlediği konusunda uyarır; paylaşılan bir önbellek işleyicisi kullanın.
Sunucuda oluşturma, GEO'nun (üretken motor optimizasyonu) ilk koşuludur. Vercel'in Aralık 2024 tarihli analizi The rise of the AI crawler, "büyük yapay zeka tarayıcılarının hiçbirinin şu anda JavaScript oluşturmadığını" tespit etti; GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot ve PerplexityBot'u saydı ve kendi ağında bir ayda GPTBot'tan 569 milyon, Claude'dan 370 milyon istek kaydetti. Metnini, başlıklarını ve JSON-LD'sini önceden oluşturan bir Next.js sayfası hepsi tarafından okunabilir; istemci tarafında oluşturulan bir sayfa okunamaz.
İkinci koşul alıntılanmaya değer içeriktir: her bölümde bir soruyu yanıtlayan, kaynak, rakam ve net tanımlar içeren, düzenli yayımlanan makaleler. Ürünümüz Sorank bu kısmı otomatikleştirir. Sorank, autopilot modunda çalışan bir SEO ve GEO yazılımıdır: anahtar kelimelerinizi bulur ve Blog Makalesi Oluşturucu ayda 20, 60 veya 120 makaleyi kaynaklar, iç bağlantılar ve görsellerle yazar. Bir Next.js sitesine, kurulum sayfasında anlatılan özel webhook ile bağlanır: Route Handler'ınız her makaleyi alır, kaydeder ve blogu yeniden doğrular. Ardından Yapay Zeka Anma Takibi, ChatGPT, Claude ve Gemini'nin markanızı alıntılayıp alıntılamadığını her hafta kontrol eder.

Özetle: bulunmasını istediğiniz her sayfayı önceden oluşturun, meta verileri sunucuda tanımlayın ve site haritasını içerikle aynı kaynaktan besleyin. Araçları Next.js verir; sıralamalar ve yapay zeka alıntıları onlarla ne yayımladığınızdan gelir. Bir Next.js blogunu sürekli makaleyle beslemek için Sorank planlarına göz atın; aylık 49 dolardan başlar ve 3 günlük ücretsiz deneme sunar.
Next.js React üzerine kuruludur, bu yüzden karşılaştırma oluşturma biçimleri arasındadır. Varsayılan bir React tek sayfalık uygulaması tarayıcıda oluşturulur ve neredeyse boş HTML gönderir; Next.js ise sayfaları sunucuda veya derleme sırasında önceden oluşturur. JavaScript çalıştırmayan yapay zeka botları dahil tarayıcılar, Next.js ile ek ayar yapmadan içeriğin tamamını alır.
Kendiliğinden oluşturmaz. App Router'da app klasörüne URL'lerinizi döndüren bir sitemap.ts dosyası eklersiniz ve Next.js onu /sitemap.xml adresinde sunar. Büyük sitelerde Google site haritası başına en fazla 50.000 URL kabul ettiği için generateSitemaps listeyi birkaç dosyaya böler.
Her ikisi de HTML'i önceden oluşturduğu için ikisi de iyi sıralama alabilir. Yeni projeler için önerilen seçim App Router'dır: Server Components istemci JavaScript'ini azaltır, Metadata API, sitemap.ts ve robots.ts SEO dosyalarını yerel olarak yönetir. Mevcut bir Pages Router sitesinde yalnızca SEO için geçiş yapmak nadiren değer.
SORANK'I SİZDEN ÖNCE DENEDİLER
