Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Site Taşıma ve Domain Değişikliği: URL Mapping, 301 Planı ve Change of Address
Site taşımada her eski URL tek hop'ta, 301 ile son hedefine gider; redirect'ler en az bir yıl kalır ve Change of Address yalnız domain değişiminde, www'lu ve www'suz her varyant için kullanılır. CSV mapping'den zincir kontrollü bir redirect tablosu ve her eski URL'yi 301, hedef 200 ve canonical açısından doğrulayan bir script yazıyor, mertozen.com'un /en/ geçişini bu listeyle okuyoruz.
Crawl Budget, Log Analizi ve Googlebot'u Doğrulamak
Crawl budget milyonlarca sayfalı veya her gün binlerce sayfası değişen sitelerin derdi; küçük bir sitede önce log'daki Googlebot'un gerçek olup olmadığına bak. ASP.NET Core'da IIS ile aynı W3C formatında log üretiyor, bot trafiğini çıkaran bir C# aracı yazıyor ve Googlebot'u reverse ile forward DNS ve Google'ın IP aralığı JSON'larıyla doğruluyoruz.
hreflang ve Çok Dilli Site: TR/EN İçin URL Stratejisi ve x-default
Her dil kendi URL'sinde ve kendi canonical'ında olmalı, hreflang bunları karşılıklı bağlar; Googlebot Accept-Language göndermediği için dili cookie veya header'a göre değiştiren sayfanın diğer sürümü crawler için yok olur. ASP.NET Core'da route'tan gelen dil ve hreflang tag helper'ı, Angular i18n'de Lighthouse'un kaçırdığı canonical hatası ve mertozen.com'un ?lang='den /en/'e geçişi.
Angular SSR ile SEO: Server Route'lar, RenderMode, Meta ve Hydration
Angular'da render modu route başına seçilir: blog yazısı Prerender ve getPrerenderParams, arama Server, hesap sayfası Client. Title, Meta ve canonical'ı DOCUMENT ile yöneten service'i, REQUEST ve RESPONSE_INIT'i, HTTP transfer cache'in API çağrısını yarıya indirişini, isPlatformBrowser ve useValue tuzaklarını ve localhost'u bile 400 ile reddeden allowedHosts ayarını gerçek çıktılarla görüyoruz.
JavaScript SEO: CSR, SSR, SSG ve Googlebot'un Render Süreci
Index'lenecek içerik ilk HTML'de olmalı: Googlebot JavaScript'i render kuyruğunda çalıştırır, birçok crawler ise hiç çalıştırmaz. Aynı Angular sayfasını SSG, SSR ve CSR olarak curl ve headless Chrome ile ölçüyor, Lighthouse'un CSR sayfasına neden 100 verdiğini, dynamic rendering'in neden workaround olduğunu ve tıklamaya bağlı içerik gibi tuzakları görüyoruz.
Redirect'ler: 301, 302, 307, 308 ve ASP.NET Core'da Doğru Redirect Kurmak
Kalıcı taşımada 301 veya 308 kullan: Google bunları güçlü canonical sinyali, 302 ve 307'yi zayıf sinyal sayar; 308 ve 307 POST'u korur. ASP.NET Core URL Rewriting Middleware'i, varsayılanı 307 olan UseHttpsRedirection'ı, veritabanındaki slug geçmişiyle tek hop'luk 301'i, zincirleri ve Angular SSR'da 302 dönen redirectTo'yu gerçek çıktılarla inceliyoruz.
HTTP Status Code'ları ve Soft 404: Google 404, 410, 5xx ve 429'u Nasıl Yorumlar?
Google 404 ve 410'u aynı işler ve URL'yi index'ten çıkarır; 5xx ve 429 ise crawl'ı yavaşlatır, hata sürerse URL'ler düşer. 200 dönen bulunamadı sayfası soft 404'tür. ASP.NET Core'da status code'u koruyan hata sayfası, 503 ve Retry-After, rate limiter, HEAD ve 405, Angular SSR'da RESPONSE_INIT ile gerçek 404 ve mertozen.com'un CMS hatasında 404 yerine 503'e geçişi.
Canonical URL: Duplicate Content'i Yönetmek ve Google'ın Seçtiği Canonical
rel=canonical bir emir değil, sinyaldir: Google redirect, canonical, sitemap ve iç link'lerin tutarlı olduğu URL'yi seçer. ASP.NET Core'da Host header'a güvenmeyen ve gereksiz parametreleri atan bir canonical tag helper yazıyor, PDF için Link header'ı, Angular SSR'da tek canonical'ı ve Google'ın Aralık 2025 JavaScript kuralını gerçek çıktılarla görüyoruz.
XML Sitemap ve IndexNow: ASP.NET Core'da Dinamik Sitemap Üretmek ve Değişikliği Bildirmek
Sitemap Google için bir ipucudur: changefreq ve priority yok sayılır, lastmod yalnız doğrulanabilir şekilde doğruysa kullanılır; bir dosya en fazla 50.000 URL ve 50 MB. EF Core'dan streaming sitemap üretip 108.000 URL ile ölçüyor, output cache'i yayında temizliyor, Bing ve Yandex için IndexNow'u kuruyor, Angular'da build-time sitemap ve mertozen.com'un sitemap'ini inceliyoruz.
noindex ve X-Robots-Tag: Bir Sayfayı veya PDF'i Index'ten Doğru Şekilde Çıkarmak
Bir sayfayı veya PDF'i index'ten çıkarmanın yolu noindex'tir, robots.txt değil: engellenmiş URL'deki noindex hiç görülmez, Removals aracı ise yalnız altı ay kadar gizler. ASP.NET Core'da X-Robots-Tag middleware'i kuruyor, static file sıralama hatasını, Angular'da JavaScript ile eklenen noindex'in riskini ve server route header'ını gerçek çıktılarla görüyoruz.
robots.txt Rehberi: RFC 9309, Allow/Disallow Kuralları ve Neyi Engellememelisin?
robots.txt crawl'ı kontrol eder, index'i değil: crawler kendi adını taşıyan tek group'u izler, en uzun eşleşen kural kazanır, 5xx dönen bir robots.txt crawl'ı durdurur. RFC 9309 kurallarını C# ile test ediyor, ASP.NET Core'da environment'a göre robots.txt üretiyor, Angular SSR'ın robots.txt'ye bir yıllık cache header'ı verdiğini ve mertozen.com'un dosyasını inceliyoruz.
SEO Dostu URL Tasarımı: Slug, Lowercase, Trailing Slash ve Query Parametreleri
SEO dostu URL tek ve kalıcıdır: küçük harf, tireyle ayrılmış okunur kelimeler, tutarlı trailing slash ve içeriği değiştirmeyen parametrelerden arınmış query. Türkçe başlıktan ASCII slug üreten C# fonksiyonunu, ASP.NET Core'da 301 ile normalizasyonu, Angular router'da fragment yerine History API'yi ve mertozen.com slug'larını gerçek çıktılarla inceliyoruz.