İçeriğe geç
Approvalens

Okuma odası · 7 dk okuma

Kırık Linkler ve Soft 404: Bul, Düzelt, Tekrarlanmasın

Kırık site içi linkleri bul, olmayan sayfaları ana sayfaya yönlendirmek yerine gerçek 404 döndür; WordPress, Blogger ve Next.js için adım adım çözüm.

Approvalens ekibi

Şu rapor bulgularını düzeltir

  • Kırık bağlantılar
  • Olmayan sayfalar 404 veriyor
  • Sayfalar hatasız açılıyor
  • Kırık dış bağlantılar
  • Kırık görseller

Kırık link, sitendeki bir linkin 404, 410 ya da hiç yanıt vermeyen bir adrese gitmesi demek. Soft 404 bunun tersi: var olmayan bir sayfa "200 OK" diyor ya da sessizce ana sayfaya yönleniyor. Kırık linki ya düzeltir, ya kaldırır ya da ölü adresi aynı ihtiyacı karşılayan bir sayfaya yönlendirirsin. Soft 404'te ise bilinmeyen adreslerin gerçek bir 404 durum kodu döndürmesini sağlarsın; üstüne istediğin kadar yardımcı bir sayfa koyabilirsin.

Site menüsü rehberi bu konuya iki paragrafla değiniyor. Burası atölye kısmı.

AdSense çıkmaz sokakları neden önemsiyor?

AdSense program politikaları, yanıltıcı site gezintisi başlığı altında, sahte indirme düğmelerinin hemen yanında "Linking to content that doesn't exist" (var olmayan içeriğe link vermek) maddesini sayıyor. Eski bir yazıdaki birkaç ölü link aldatma sayılmaz. Ama menüsünün yarısı 404 veren bir site bitmemiş görünür. Hesap kurulum sayfası da açık: site yapım aşamasındaysa, açılmıyorsa ya da gezinmesi zorsa hesap kurulamıyor.

Soft 404 başka bir yerden can yakar. İnceleyen kişiye bozuk görünmez, ama kırık linklerini senden saklar. Yanlış yazılan her adres ana sayfaya düşüyorsa hatayı ne sen görürsün ne de link denetleyicin.

Tarama neye bakıyor?

Approvalens raporunda bu konuya dokunan beş bulgu var, her birinin kendi kuralı var:

Bulgu Neye istek atıyoruz Ne sorun sayılıyor
Kırık bağlantılar Açtığımız her sayfa, artı açmadığımız en fazla 120 site içi link (arşiv, etiket, sayfalama adresleri hariç) 4xx kodu ya da yanıt yok (açtığımız sayfadaki sunucu hatası bir alt satıra gider). 401, 403, 429 ve 503 sayılmaz: genelde hız sınırına takıldığımızı gösterir. %3 altı not, %3 ya da 10 adresten itibaren uyarı, %15'ten itibaren kritik
Sayfalar hatasız açılıyor Açtığımız her sayfa Sunucu hatası, zaman aşımı, reddedilen bağlantı. 404'ler Kırık bağlantılar'da sayılır, hiçbir şey iki kez sayılmaz
Olmayan sayfalar 404 veriyor Rastgele tek bir adres: /approvalens-<12 onaltılık karakter>-not-found Ana sayfaya yönlenip 200 (not) ya da başka bir yerde 200 (uyarı)
Kırık görseller Alan adında barındırılan en fazla 40 görsel %10 ya da fazlası yüklenmiyorsa
Kırık dış bağlantılar Açtığımız sayfaların metnindeki en fazla 25 dış link 404, 410 ya da artık çözülmeyen alan adı

Soft 404 testi tek bir istek; erişim kaydında approvalens- arayarak bulabilirsin. Ayrıntılar yöntem sayfasında.

Uydurma bir adrese verilebilecek üç yanıt: gerçek 404, "sonuç yok" diyen 200 sayfası ve ana sayfaya 301 yönlendirme
Yalnızca ilk yanıt geçiyor; üçüncüsü uyarı değil not alıyor, çünkü okur en azından sitenin içinde kalıyor.

Gerçek bir örnek: taradığımız bir sitede istek gönderilen 873 site içi adresten 24'ü kırıktı, yaklaşık %3.

Approvalens raporundan kesit: Kırık bağlantılar bulgusu, 873 adresten 24'ü kırık, /sac-kesimi-ay-takvimi/2028- ile başlayan 404 adresleri
Gerçek rapor: aylık takvim şablonu her ayı bir sonrakine bağlıyordu, son yayımlanan ay da henüz oluşturulmamış sayfaları gösteriyordu.

Kanıt listesi ölü adresi ve kodunu gösteriyor, ona link veren sayfayı değil. O sitede Aralık 2027 takvim sayfasını açıp HTML'inde 2028-ocak aramak, "sonraki ay" linkini birkaç saniyede buldurdu.

Soft 404 ve "her şey ana sayfaya" kalıbı

Google'ın tarama hataları sayfası soft 404'ü, kullanıcıya sayfanın var olmadığını söyleyen ama 200 (başarılı) durum kodu döndüren bir adres olarak tanımlıyor. Özel hata sayfasına da itirazı yok, yeter ki kod dürüst kalsın: "Custom 404 pages are created solely for users." Yani özel 404 sayfası yalnızca kullanıcı için; sunucu yine 404 döndürmeli.

Küçük sitelerde en sık görülen hâli, olmayan her adresi ana sayfaya yönlendirmek. Google'ın site taşıma rehberi çok sayıda eski adresi ana sayfa gibi tek ve alakasız bir hedefe yönlendirmemeni söylüyor; bunun soft 404 sayılabileceğini de ekliyor.

Kendin dene:

$ curl -sI https://ornekblog.com/boyle-bir-sayfa-yok-123 | head -3
HTTP/2 301
location: https://ornekblog.com/

Sorun bu. Görmek istediğin:

$ curl -sI https://ornekblog.com/boyle-bir-sayfa-yok-123 | head -1
HTTP/2 404

Genelde nereden çıkar:

  • WordPress eklentisi: işi "bütün 404'leri ana sayfaya yönlendirmek" olan bir eklenti. Kapat.
  • Apache: ErrorDocument 404 https://ornekblog.com/. Apache'nin çekirdek belgeleri tam URL verildiğinde istemcinin asıl hata kodunu değil bir yönlendirme kodu aldığını yazıyor. Yerel yol kullan: ErrorDocument 404 /404.html.
  • nginx: error_page 404 https://ornekblog.com/;. nginx URL hedeflerinde varsayılan olarak 302 döndürüyor. Yerine error_page 404 /404.html; yaz.
  • JavaScript uygulaması: her rotada 200 koduyla "Bulunamadı" gösteren bir uygulama. Next.js ayrıntısı aşağıda.

404 mü, 410 mu, yönlendirme mi?

Google için neredeyse fark yok. HTTP durum kodları sayfası 429 hariç bütün 4xx kodlarına aynı şekilde davranıldığını söylüyor. 410 niyetini daha net anlatır ama mucize bekleme: Search Console sayfa dizine ekleme yardımı Googlebot'a bir adresi kalıcı olarak unutturmanın yolu olmadığını kabul ediyor ve ekliyor: sayfa yerine bir şey konmadan kaldırıldıysa 404 sorun değil.

Asıl karar, yönlendirmenin dürüst olup olmadığı. Google: sayfa taşındıysa ya da sitende açık bir karşılığı varsa 301 kullan.

Silinen yazı için karar şeması: aynı ihtiyacı karşılayan sayfa varsa 301, sadece kategori ilgiliyse 404 ya da 410, benzeri yoksa 410 ve linkleri temizle
"En yakın konulu sayfa", aynı soruyu cevaplayan sayfa demek; sadece aynı kategoride olan sayfa değil.

2024 tarihli bir alışveriş rehberinin yerini 2026 sürümü aldıysa 301 tartışmasız. Tek bir ürünün silinen incelemesinin karşılığı ise kategori sayfası değil; o adres 404 versin, 404 sayfanda da kategori linki dursun. Zayıf yazıları toplu siliyorsan hangisini birleştirip hangisini atacağına düşük değerli içerik rehberi ile karar ver.

Bütün kırık linkleri bulmak

Tek kaynak yetmiyor, birleştir:

Kaynak Ne verir Sınırı
Approvalens raporu Ölü adresler ve kodları; URL kopyalama ve CSV düğmeleri Yalnızca taramanın ulaştığı kadarı; link veren sayfayı söylemez
Search Console, sayfa dizine ekleme raporu "Not found (404)" ve "Soft 404" nedenleri Google'ın gördüğü adresler, başka sitelerden gelen eskiler dahil
URL Denetimi "Referring page": Google'ın adresi bulurken kullanmış olabileceği sayfa Tek seferde tek adres
Sunucu erişim kaydı Her gerçek 404 isteği ve yönlendiren sayfa Kayıtlara erişim gerekir
WordPress link denetleme eklentisi Yazılardaki her link Siteyi yavaşlatabilir; bir kez çalıştır, sonra kaldır

Yaygın "combined" kayıt biçiminde (nginx'in varsayılanı) durum kodu 9., yol 7., yönlendiren sayfa 11. alan:

$ awk '$9 == 404 {print $7, $11}' access.log | sort | uniq -c | sort -rn | head
     41 /wp-content/uploads/2023/04/eksi-maya.jpg "https://ornekblog.com/eksi-maya-yapimi/"
     12 /category/genel/ "https://ornekblog.com/eski-yazi/"

Son sütun, hangi sayfayı düzenleyeceğini söylüyor.

Kırık linkler nereden çıkar?

Neden Nasıl görünür Çözüm
Kalıcı bağlantı yapısı değişti /2023/05/eksi-maya/ → /eksi-maya/ Tek bir kalıp yönlendirme, sonra yazılardaki linkleri güncelle
Yazı silindi ya da birleştirildi İlgili yazı kutuları ve menü hâlâ ona gidiyor Karşılığına 301, yoksa 404 ve linkleri kaldır
HTTP→HTTPS ya da alan adı değişikliği Yazı içinde mutlak http://eski-alanadi.com/... linkleri Veritabanında arama-değiştirme ve site geneli yönlendirme
Taşıma sonrası görseller Yeni sunucuda eksik /wp-content/uploads/... dosyaları Medya klasörünü yeniden yükle ya da görselleri kaldır
Göreli link hatası /rehber/ sayfasındaki href="blog/yazi", /rehber/blog/yazi adresine gider Site içi yolları / ile başlat
Şablon linkleri Var olmayan sayfalar için üretilen "sonraki ay", "sonraki sayfa", etiket linkleri Linki yalnızca hedef varsa yazdır
Dış link çürümesi Taşınan ya da kaybolan kaynaklar Çalışan bir kaynakla ya da arşiv kopyasıyla değiştir

Platforma göre çözüm

WordPress

WordPress, bir yazının eski kısa adını yenisine zaten 301 ile yönlendiriyor (`wp_old_slug_redirect`). Kalıcı bağlantı yapısı değiştiyse ya da yazı silindiyse yönlendirme eklentisi gerekir. Yoast SEO Premium'da yönlendirme yöneticisi "Yoast SEO → Redirects" altında; türler arasında "301 Moved Permanently" ve "410 Content Deleted" var. Rank Math'in Redirections modülü "Rank Math SEO → Redirections" altında ve o da "410 Content Deleted" sunuyor. Bağımsız yönlendirme eklentileri de aynı işi görür. Birini kullan, üçünü değil.

Taşıma sonrası eski mutlak adresler için WP-CLI'ın search-replace komutu serileştirilmiş veriyi bozmadan değiştiriyor. Önce --dry-run ile dene:

wp search-replace 'http://eski-alanadi.com' 'https://ornekblog.com' --skip-columns=guid --dry-run

Blogger

Blogger'da iki araç da hazır (Blogger Yardım): Settings → "Errors and redirects" → Custom redirects → Add. Silinen adresi ve hedefi gir; yazı silindiyse "Permanent" seçeneğini aç. Aynı bölümdeki Custom 404, Blogger'ın bulunamadı sayfasındaki mesajı değiştiriyor (ayarlar sayfası). Oraya arama kutunu ve en önemli etiket linklerini koy.

Next.js (App Router)

Bir kısa adın içeriği yoksa next/navigation içinden notFound() çağır, sayfayı app/not-found.tsx ile tasarla. not-found.js belgelerindeki akış uyarısına dikkat: akışla (streaming) gönderilen yanıtlarda 200, akışsız yanıtlarda 404 dönüyor. Akış durumunda Next.js sayfaya <meta name="robots" content="noindex"> ekliyor, yani Google sayfayı dizine almıyor. Bizim kontrol ise yalnızca durum koduna bakıyor, bu durumu yine işaretler. Gerçek 404 istiyorsan içeriğin var olduğunu akış başlamadan kontrol et.

Statik üretilen rotalarda export const dynamicParams = false, bilinmeyen kısa adlar için 404 döndürüyor. Yönlendirmeler next.config içine:

async redirects() {
  return [{ source: '/blog/:slug', destination: '/rehber/:slug', permanent: true }]
}

permanent: true 308 gönderir; Google 308'i 301 ile aynı sayıyor. Yönlendirme işinden sonra fazladan adım olup olmadığına yönlendirme zinciri rehberinden bak. Silinen adresleri site haritasından da çıkar: XML site haritası hataları.

Sorun bütün siteyse

Çok sayıda sayfa 5xx hatası ya da zaman aşımı veriyorsa "Sayfalar hatasız açılıyor" bulgusu çıkar. Bu link sorunu değil, barındırma sorunu. Site kapalı veya kullanılamıyor rehberi ile başla.

Ücretsiz tarama site içi linklerine istek atar, uydurma bir adresle soft 404 testi yapar ve bulduğu her ölü adresi listeler.

Sık sorulan sorular

Google bir sayı açıklamıyor. Risk görünürlükle artıyor: ölü bir menü öğesi ya da kategori linki, 2019'dan kalma bir yazının dibindeki eski kaynak linkinden çok daha önemli.

Garanti olsun diye bütün 404'leri ana sayfaya yönlendireyim mi?

Hayır. Google çok sayıda eski adresi ana sayfa gibi alakasız tek bir sayfaya yönlendirmenin soft 404 sayılabileceğini söylüyor. Yalnızca gerçek bir karşılık varsa yönlendir.

Silinen yazılar için 404 yerine 410 şart mı?

Değil. Google 429 dışındaki bütün 4xx kodlarına aynı davranıyor. Yönlendirme aracın sunuyorsa ve silmenin bilinçli olduğunu kayda geçirmek istiyorsan 410 kullan.

Search Console hiç sahip olmadığım adresler için 404 gösteriyor. Düzeltmeli miyim?

Genelde hayır. Adres hiç var olmadıysa ya da karşılığı olmadan kaldırıldıysa doğru yanıt 404. Yalnızca kendi sayfalarının hâlâ link verdiği adresleri düzelt.

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

Bu rehberi İngilizce oku →

Ü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 →