SEO: host-aware sitemap.xml + dynamische robots.txt je Domain

Sitemap pro Host (1h-Cache): Hub listet Landing + Rechts-/Info-Seiten,
Spokes zusaetzlich Kategorien (lokalisierte Slugs), oeffentliche
Newsrooms und alle im Archiv sichtbaren PMs des Portals (explizit ohne
PortalScope, forPortalValues). Suche und Marketing-Platzhalterseiten
bleiben draussen. Statische public/robots.txt entfernt (haette die
Route verschattet); robots.txt jetzt dynamisch mit Sitemap-Verweis
und Disallow fuer /admin, /login, /register, Suche.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-03 12:34:12 +00:00
parent b855cbf7c0
commit e9643e620a
5 changed files with 251 additions and 2 deletions

View file

@ -9,6 +9,7 @@ use App\Http\Controllers\Web\NewsroomDetailController;
use App\Http\Controllers\Web\NewsroomsController;
use App\Http\Controllers\Web\PreiseController;
use App\Http\Controllers\Web\ReleaseDetailController;
use App\Http\Controllers\Web\SitemapController;
use App\Http\Controllers\Web\SucheController;
use App\Http\Controllers\Web\TerminationController;
use App\Http\Controllers\Web\VeroeffentlichenController;
@ -218,6 +219,31 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func
Route::view('cookies', 'web.cookies')->name('cookies');
});
// ---------------------------------------------------------------------------
// SEO: Sitemap + robots.txt, host-aware (Hub vs. Spokes). Die frühere
// statische public/robots.txt wurde entfernt — sie hätte diese Routen
// verschattet (Webserver liefert existierende Dateien direkt aus).
// ---------------------------------------------------------------------------
Route::get('/sitemap.xml', SitemapController::class)->name('sitemap');
Route::get('/robots.txt', function () {
$base = rtrim(request()->getSchemeAndHttpHost(), '/');
$lines = [
'User-agent: *',
'Disallow: /admin',
'Disallow: /login',
'Disallow: /register',
'Disallow: /de/suche',
'Disallow: /en/suche',
'',
'Sitemap: '.$base.'/sitemap.xml',
'',
];
return response(implode("\n", $lines), 200, ['Content-Type' => 'text/plain; charset=UTF-8']);
})->name('robots');
// ---------------------------------------------------------------------------
// Sprach-/Edition-unabhängige Routen (API-Doku).
// ---------------------------------------------------------------------------