- Konu sahibi
- #1
Laravel’da sitemap oluşturmanın en küçük çalışır yolu,
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.
Sabit dizi yalnızca temel örnek içindir. Gerçek projede yayınlanması gereken kayıtları sorgulayıp aynı
Bu sorguyu kullanacaksanız dosyanın başına kendi modelinizin sınıfını ekleyin ve
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.
Hayır. İçerik sık değişmiyorsa XML’i zamanlanmış bir komutla oluşturup
Birçok web sunucusu mevcut statik dosyayı Laravel’in giriş dosyasına göndermeden sunar.
/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.
| Alan | Kullanım | Kaçınılacak hata |
|---|---|---|
loc | Sayfanın tam ve kanonik adresi | Göreli URL veya yanlış alan adı |
lastmod | Gerçek son içerik güncelleme tarihi | Her istekte bugünün tarihini yazmak |
| XML yanıtı | Sitemap belgesini döndürmek | HTML hata sayfası döndürmek |
| Veri kümesi | Yayındaki URL’leri seçmek | Taslak ve özel sayfaları eklemek |
Kurulum ve kontrol adımları
- Kodun bulunduğu Laravel projesini çalıştırın:
php artisan serve. - Tarayıcıda
http://127.0.0.1:8000/sitemap.xmladresini açın. - Çıktının XML olarak başladığını ve her sayfanın
<url>içinde<loc>düğümüne sahip olduğunu kontrol edin. - Canlı ortamda örnekteki
example.comadreslerini sitenizin gerçek HTTPS adresleriyle değiştirin.
& 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.