Laravel İle Dinamik Bir Web Sayfası İçin Site Haritası Nasıl Yapılır?

Laravel İle Dinamik Bir Web Sayfası İçin Site Haritası Nasıl Yapılır?
Laravel İle Dinamik Bir Web Sayfası İçin Site Haritası Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu uygulamayı gerçekleştirmek için sisteminizde Laravel 10 veya 11 sürümünün kurulu olması gerekmektedir. Ayrıca, dinamik verileri çekebilmek için halihazırda oluşturulmuş veritabanı modellerinizin (örneğin: Post, Category, Product) bulunması beklenir.

  • PHP 8.2 veya üzeri bir sürüm.
  • Laravel framework kurulu bir proje dizini.
  • Veritabanı bağlantısı yapılandırılmış bir ortam.
  • Composer paket yöneticisi erişimi.

Adım 1: Route Yapılandırması

Site haritası genellikle sitemap.xml adresinde yayınlanır. Laravel'de bu rotayı tanımlarken bir controller metodu üzerinden dinamik içerik sunacağız. routes/web.php dosyanıza aşağıdaki kodu ekleyerek başlayın.

Route::get('/sitemap.xml', [App\Http\Controllers\SitemapController::class, 'index']);

Bu rota, tarayıcıdan gelen XML isteğini SitemapController içerisindeki index metoduna yönlendirir. Bu sayede her istekte veritabanı sorgusu tetiklenerek güncel veriler çekilir.

Adım 2: SitemapController Oluşturma

Terminal üzerinden php artisan make:controller SitemapController komutunu çalıştırın. Oluşturulan dosyayı açarak verileri çekmek ve XML formatında çıktı üretmek için gerekli mantığı kuracağız. Laravel'in response() fonksiyonunu kullanarak içeriği XML olarak işaretlemek önemlidir.

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Response;

class SitemapController extends Controller
{
    public function index()
    {
        $posts = Post::latest()->get();
        
        return response()->view('sitemap.index', [
            'posts' => $posts
        ])->header('Content-Type', 'text/xml');
    }
}

Burada header('Content-Type', 'text/xml') kullanımı, tarayıcının bu sayfayı düz metin yerine bir XML dosyası olarak yorumlamasını sağlar. Bu, arama motorlarının dosyayı doğru şekilde okuması için zorunludur.

Adım 3: Blade Şablonu ile XML Oluşturma

Laravel'in Blade motoru, XML dosyaları oluşturmak için oldukça esnektir. resources/views/sitemap/index.blade.php dosyasını oluşturun ve içine standart XML yapısını yerleştirin. XML dosyalarında karakter kodlaması olarak UTF-8 kullanılmasına dikkat edilmelidir.



    
        {{ url('/') }}
        {{ now()->toAtomString() }}
        daily
        1.0
    
    @foreach ($posts as $post)
        
            {{ url('/blog/' . $post->slug) }}
            {{ $post->updated_at->toAtomString() }}
            weekly
            0.8
        
    @endforeach

Bu şablon, ana sayfanızı ve veritabanındaki her bir gönderiyi (post) site haritasına ekler. lastmod etiketi için Laravel'in toAtomString() metodunu kullanmak, tarih formatının arama motorları için standartlara uygun olmasını sağlar.

Adım 4: Performans ve Önbellekleme (Caching)

Veritabanınızda binlerce kayıt varsa, her istekte sorgu çalıştırmak sunucunuzu yorabilir. Bu noktada Laravel Cache mekanizmasını kullanmak en iyi pratiktir. SitemapController içerisinde Cache::remember metodunu kullanarak site haritasını belirli aralıklarla güncelleyebilirsiniz.

use Illuminate\Support\Facades\Cache;

public function index()
{
    $sitemap = Cache::remember('sitemap', 3600, function () {
        $posts = Post::latest()->get();
        return view('sitemap.index', compact('posts'))->render();
    });

    return response($sitemap)->header('Content-Type', 'text/xml');
}

Yukarıdaki kod, site haritasını 1 saat (3600 saniye) boyunca bellekte tutar. Bu, özellikle yüksek trafikli sitelerde veritabanı yükünü ciddi oranda azaltır.

Karşılaştırma: Site Haritası Yöntemleri

Yöntem Avantajı Dezavantajı
Statik XML Dosyası Çok hızlı, sunucu yükü yok. Her içerikte manuel güncelleme gerekir.
Dinamik Laravel Route Otomatik güncel, bakım gerektirmez. Veritabanı sorgusu maliyeti (Cache ile çözülür).
Paket Kullanımı Hızlı kurulum, ekstra özellikler. Bağımlılık artar, özelleştirme zorlaşabilir.

Adım 5: Güvenlik ve Doğrulama

Site haritası oluştururken XSS (Cross-Site Scripting) saldırılarına karşı dikkatli olunmalıdır. Veritabanından gelen verileri Blade şablonunda yazdırırken, Laravel'in {{ }} sözdizimini kullanmak otomatik olarak veriyi escape eder (HTML karakterlerini zararsız hale getirir). Asla {!! !!} kullanmayın.

Güvenlik Uyarısı: Site haritası içerisinde kullanıcı tarafından girilen verileri (örneğin kullanıcı profilleri) yayınlıyorsanız, verilerin temizlenmiş (sanitized) olduğundan emin olun. Ayrıca, hassas veya özel (private) içeriklerin site haritasına dahil edilmediğini mutlaka kontrol edin.

Sıkça Sorulan Sorular

Site haritasında kaç URL olmalıdır?

Google, bir site haritası dosyasının maksimum 50.000 URL içermesine izin verir. Eğer daha fazla içeriğiniz varsa, site haritası dizini (sitemap index) kullanmalısınız.

Site haritasını Google'a nasıl bildiririm?

Google Search Console paneline giriş yaparak "Sitemaps" bölümüne site haritanızın tam URL'sini (örneğin: https://siteadresiniz.com/sitemap.xml) eklemeniz yeterlidir.

Değişim sıklığı (changefreq) ne işe yarar?

Arama motorlarına içeriğin ne sıklıkla güncellendiğine dair bir ipucu verir. Ancak Google, bu etiketi bir emir olarak değil, bir öneri olarak kabul eder.

Öncelik (priority) değerini nasıl belirlemeliyim?

0.0 ile 1.0 arasında bir değerdir. Ana sayfa genellikle 1.0, alt sayfalar ise önem derecesine göre 0.5 - 0.8 arasında derecelendirilir.

Site haritası SEO'yu doğrudan artırır mı?

Site haritası, botların içeriğinizi daha hızlı keşfetmesini sağlar. Doğrudan bir sıralama faktörü olmasa da, indekslenme hızını artırdığı için dolaylı yoldan büyük bir SEO avantajı sağlar.

İleri Seviye İpuçları: Site Haritası Dizinleri (Sitemap Index) Kullanımı

Projeniz büyüdükçe ve içerik sayınız binleri aştığında, tek bir XML dosyası hem arama motorları için işlenmesi zor bir hale gelir hem de dosya boyutu sınırlarını (genellikle 50MB veya 50.000 URL) aşabilir. Bu noktada Sitemap Index yapısına geçiş yapmak en sağlıklı yöntemdir.

Sitemap Index, ana bir XML dosyasıdır ve diğer alt site haritalarına referans verir. Laravel'de bunu yönetmek için ayrı bir rota grubu oluşturmak en temiz yaklaşımdır.

Dizin Yapısı İçin Controller Mantığı

Aşağıdaki örnekte, farklı içerik türlerini (ürünler, blog yazıları, sayfalar) ayrı XML dosyalarında nasıl gruplayacağınızı görebilirsiniz:


public function index()
{
    $sitemaps = [
        ['loc' => url('sitemap/posts.xml'), 'lastmod' => now()->toAtomString()],
        ['loc' => url('sitemap/products.xml'), 'lastmod' => now()->toAtomString()],
    ];

    return response()->view('sitemap.index', compact('sitemaps'))
        ->header('Content-Type', 'text/xml');
}

Bu yapıda, sitemap.index şablonunuzda etiketini kullanarak alt dosyaları listeleyebilirsiniz. Bu yöntem, Google Search Console üzerinde sadece ana dizin dosyasını tanıtmanıza olanak tanır.

Hata Ayıklama ve Test Süreçleri

Site haritanızın kusursuz çalıştığından emin olmak için sadece tarayıcıda görüntülemek yeterli değildir. Üretim ortamına almadan önce şu adımları izleyerek doğrulama yapmalısınız:

  • XML Şema Doğrulaması: Oluşturduğunuz çıktıyı XML Sitemap Validator gibi araçlarla kontrol edin.
  • HTTP Başlıkları: curl -I https://siteadresiniz.com/sitemap.xml komutu ile sunucunun Content-Type: text/xml başlığını doğru gönderdiğinden emin olun.
  • Log Kayıtları: Eğer site haritanız veritabanından dinamik olarak çekiliyorsa, sorgu hatalarını yakalamak için try-catch blokları kullanın ve hataları Laravel loglarına yazdırın.

try {
    $urls = Post::all();
    return response()->view('sitemap.xml', compact('urls'));
} catch (\Exception $e) {
    Log::error('Site haritası oluşturulamadı: ' . $e->getMessage());
    return response('Site haritası geçici olarak kullanılamıyor.', 500);
}

Ayrıca, büyük ölçekli sitelerde site haritası oluşturma işlemini Laravel Queues (Kuyruklar) ile arka plana atarak, site haritası oluşturma süreci sırasında kullanıcının web sayfası yükleme hızının etkilenmemesini sağlayabilirsiniz.

Sonuç

Laravel ile dinamik bir site haritası oluşturmak, sitenizin arama motorları tarafından daha profesyonel ve güncel bir şekilde taranmasını sağlar. Bu rehberde öğrendiğiniz rota tanımlama, controller mantığı, Blade şablonlama ve önbellekleme teknikleri, ölçeklenebilir bir yapı kurmanıza olanak tanır. Bir sonraki adım olarak, site haritası dizinleri oluşturarak içeriğinizi kategorilere göre ayırmayı deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri genel eğitim amaçlıdır. Uygulamanızın canlı ortamdaki güvenlik açıklarından ve veri bütünlüğünden yazılımcı sorumludur. Üretim ortamına almadan önce mutlaka kapsamlı testler yapınız.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknoloji ve yazılım kullanımı üzerine pratik kılavuzlar hazırlıyorum. Karmaşık dijital araçları, herkesin hızlıca öğrenebileceği sade rehberler haline getirmekte uzmanım.

Yorumlar (0)

Yorum Yaz