web: Entitaeten im JSON-LD verknuepft, News-Sitemap und llms.txt (Roadmap 2.1, 2.2, 2.7)

- App\Support\StructuredData: Portal-Organization als Publisher mit @id
  und Logo (ImageObject), Newsroom-@id; NewsArticle.author auf der
  Meldung und Organization auf der Newsroom-Seite beschreiben jetzt
  dieselbe Entitaet. Startseiten nutzen denselben Publisher.
- /sitemap-news.xml je Spoke (NewsSitemapController): im Archiv
  sichtbare Meldungen der letzten 48 h, max. 1.000, news:publication
  mit Portalname und Sprache; 15 min gecacht, mit den anderen Sitemaps
  geleert; in robots.txt der Spokes. Hub liefert leere Liste.
- /llms.txt je Host (LlmsTxtController): sachliche Beschreibung,
  URL-Aufbau, aktive Kategorien, Seiten fuer Unternehmen, Rechtliches;
  Hub verweist auf beide Portale. Keine Aussagen ueber KI-Nennungen.
- Protokoll Teil 5 (Block 2) inkl. Betreiber-Schritten fuer das
  Publisher Center und Befund zu 2.5/E5; Roadmap 2.1/2.7 abgehakt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-17 10:15:28 +00:00
parent 8cd76df0bb
commit b60a28dc9c
15 changed files with 521 additions and 23 deletions

View file

@ -6,9 +6,11 @@ use App\Http\Controllers\Web\CategoryController;
use App\Http\Controllers\Web\ContactController;
use App\Http\Controllers\Web\HomeController;
use App\Http\Controllers\Web\LegacyMediaRedirectController;
use App\Http\Controllers\Web\LlmsTxtController;
use App\Http\Controllers\Web\NewsroomClaimController;
use App\Http\Controllers\Web\NewsroomDetailController;
use App\Http\Controllers\Web\NewsroomsController;
use App\Http\Controllers\Web\NewsSitemapController;
use App\Http\Controllers\Web\PreiseController;
use App\Http\Controllers\Web\PressReleaseAttachmentMediaController;
use App\Http\Controllers\Web\PressReleaseImageMediaController;
@ -307,9 +309,12 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func
// verschattet (Webserver liefert existierende Dateien direkt aus).
// ---------------------------------------------------------------------------
Route::get('/sitemap.xml', SitemapController::class)->name('sitemap');
Route::get('/sitemap-news.xml', NewsSitemapController::class)->name('sitemap.news');
Route::get('/llms.txt', LlmsTxtController::class)->name('llms');
Route::get('/robots.txt', function () {
$base = rtrim(request()->getSchemeAndHttpHost(), '/');
$isHub = str_contains(request()->getHost(), 'pressekonto');
$lines = [
'User-agent: *',
@ -320,6 +325,8 @@ Route::get('/robots.txt', function () {
'Disallow: /en/suche',
'',
'Sitemap: '.$base.'/sitemap.xml',
// News-Sitemap nur auf den Spokes — der Hub hat keine Meldungen.
...($isHub ? [] : ['Sitemap: '.$base.'/sitemap-news.xml']),
'',
];