Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Laravel’da sitemap oluşturmanın en küçük çalışır yolu, /sitemap.xml rotasında XML üretip bunu application/xml içerik türüyle döndürmektir. Aşağıdaki örnek, Laravel projesinin routes/web.php dosyasına eklenebilir. Mevcut dosyada PHP açılışı ve Route importu varsa bunları ikinci kez eklemeyin. PHP DOM eklentisinin etkin olması gerekir. Örnek adresler kurgusaldır ve https://example.com/sitemap.xml adresinden erişilebilir.

Çalıştırılabilir temel örnek​


Kod:
<?php

use Illuminate\Http\Response;
use Illuminate\Support\Facades\Route;

Route::get('/sitemap.xml', function (): Response {
    $pages = [
        [
            'loc' => 'https://example.com/',
            'lastmod' => null,
        ],
        [
            'loc' => 'https://example.com/hakkimizda',
            'lastmod' => null,
        ],
        [
            'loc' => 'https://example.com/iletisim',
            'lastmod' => null,
        ],
    ];

    $xml = new \DOMDocument('1.0', 'UTF-8');
    $ns = 'http://www.sitemaps.org/schemas/sitemap/0.9';
    $xml->formatOutput = true;

    $urlset = $xml->createElementNS(
        $ns,
        'urlset'
    );
    $xml->appendChild($urlset);

    foreach ($pages as $page) {
        $url = $xml->createElementNS($ns, 'url');
        $loc = $xml->createElementNS($ns, 'loc');
        $loc->appendChild($xml->createTextNode($page['loc']));
        $url->appendChild($loc);

        if ($page['lastmod'] !== null) {
            $lastmod = $xml->createElementNS($ns, 'lastmod');
            $lastmod->appendChild($xml->createTextNode($page['lastmod']));
            $url->appendChild($lastmod);
        }

        $urlset->appendChild($url);
    }

    return response(
        $xml->saveXML(),
        200,
        ['Content-Type' => 'application/xml; charset=UTF-8']
    );
});

Sitemap kararları ve yaygın hatalar​


Sitemap’a yalnızca indekslenmesini istediğiniz, HTTP 200 döndüren kanonik sayfaları ekleyin. Yönetim paneli, giriş sayfaları, arama sonuçları, yönlendirmeler, 404 sayfaları ve parametreli kopyalar genellikle dahil edilmemelidir. URL’lerde göreli yol yerine tam adres kullanın ve aynı sayfayı farklı protokol, alan adı veya parametrelerle tekrarlamayın.
AlanKullanımKaçınılacak hata
locSayfanın tam ve kanonik adresiGöreli URL veya yanlış alan adı
lastmodGerçek son içerik güncelleme tarihiHer istekte bugünün tarihini yazmak
XML yanıtıSitemap belgesini döndürmekHTML hata sayfası döndürmek
Veri kümesiYayındaki URL’leri seçmekTaslak ve özel sayfaları eklemek

Kurulum ve kontrol adımları​

  1. Kodun bulunduğu Laravel projesini çalıştırın: php artisan serve.
  2. Tarayıcıda http://127.0.0.1:8000/sitemap.xml adresini açın.
  3. Çıktının XML olarak başladığını ve her sayfanın <url> içinde <loc> düğümüne sahip olduğunu kontrol edin.
  4. Canlı ortamda örnekteki example.com adreslerini sitenizin gerçek HTTPS adresleriyle değiştirin.
URL değerlerini metin düğümüyle eklemek, & gibi XML özel karakterlerini güvenle serileştirir. Dinamik adresleri ham XML parçası gibi birleştirmeyin. Başarılı sonuçta tarayıcı XML belgesini göstermeli ve her URL ayrı bir kayıt olarak görünmelidir. Sayfa açılmıyor veya Laravel HTML hata sayfası döndürüyorsa önce rotanın doğru dosyada bulunduğunu, uygulamanın çalıştığını ve /sitemap.xml yolunun başka bir rota tarafından yakalanmadığını kontrol edin. Class "DOMDocument" not found hatası alırsanız PHP’nin DOM/XML eklentisi sunucuda etkin değildir.

Verileri veritabanından üretme​


Sabit dizi yalnızca temel örnek içindir. Gerçek projede yayınlanması gereken kayıtları sorgulayıp aynı loc ve lastmod yapısına dönüştürün:

Kod:
$pages = Post::query()
    ->where('published', true)
    ->get(['slug', 'updated_at'])
    ->map(fn ($post) => [
        'loc' => 'https://example.com/yazi/' . $post->slug,
        'lastmod' => $post->updated_at?->toDateString(),
    ])
    ->all();

Bu sorguyu kullanacaksanız dosyanın başına kendi modelinizin sınıfını ekleyin ve published, slug ile updated_at alanlarını veritabanınızdaki gerçek alan adlarına göre değiştirin. lastmod değerini yalnızca içeriğin gerçekten güncellendiği tarihi biliyorsanız gönderin; tüm sayfalara aynı tarihi yazmak doğru bir güncelleme sinyali oluşturmaz.

Tek sitemap en fazla 50.000 URL ve sıkıştırılmamış 50 MB sınırında olmalıdır. Sayfa sayısı büyüdüğünde tüm kayıtları tek istekte belleğe almak yerine sitemap’ı parçalara ayırmak veya önceden dosya olarak üretmek daha uygun olur. Temel örnekteki rota küçük ve orta boy URL listeleri içindir; büyük kataloglarda sorguyu parçalayıp sitemap index yapısına geçiş planlanmalıdır.

Sık sorulan sorular​


Sitemap’ı her istekte üretmek zorunda mıyım?​


Hayır. İçerik sık değişmiyorsa XML’i zamanlanmış bir komutla oluşturup public/sitemap.xml dosyasına yazabilir, rotayı sabit dosyaya yönlendirebilirsiniz. Böylece her ziyaretçi için veritabanı sorgusu çalışmaz.

Public klasöründe aynı adlı dosya varsa rota neden çalışmıyor?​


Birçok web sunucusu mevcut statik dosyayı Laravel’in giriş dosyasına göndermeden sunar. public/sitemap.xml ile dinamik rotayı aynı anda iki kaynak gibi yönetmeyin. Hangi çıktıyı kullandığınızı belirleyip gerçek yanıtı kontrol edin; önbellek ve üretilmiş dosya eski listeyi gösteriyor olabilir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic