WS-1: Canonical- & OpenGraph-Meta zentral im Web-Layout

Ergänzt web-master.blade.php um <link rel="canonical">, OpenGraph- und
Twitter-Card-Tags. Self-Canonical-Default wird portal-getrennt aus der
Portal-URL ($domainUrl) + Request-Pfad gebaut – bewusst nicht aus
url()->current(), da URL::forceRootUrl sonst alle Portale fälschlich auf
pressekonto.test kanonisieren würde. Seiten können canonical/meta_description/
og_type/og_image per @section überschreiben; release-detail als article
ausgezeichnet. Erfüllt die Canonical-Hygiene aus dem Duplicate-Content-Update §5.

Tests: tests/Feature/Web/CanonicalMetaTest.php (inkl. Cross-Portal-Negativtest).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-06-15 10:03:15 +00:00
parent ce5d6c98e1
commit e54f6e2552
3 changed files with 63 additions and 2 deletions

View file

@ -5,9 +5,38 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="description" content="@yield('meta_description', $domainName ?? config('app.name', 'Laravel'))">
<title>@yield('title', $domainName ?? config('app.name', 'Laravel'))</title>
@php
$siteName = $domainName ?? config('app.name', 'Laravel');
$pageTitle = trim($__env->yieldContent('title')) ?: $siteName;
$pageDescription = trim($__env->yieldContent('meta_description')) ?: $siteName;
// Self-Canonical als Default aus der Portal-URL + Request-Pfad (ohne Query):
// pro Portal/Domain getrennt und unabhängig von URL::forceRootUrl – verhindert Cross-Portal-Duplicate.
$portalBase = rtrim($domainUrl ?? config('app.url'), '/');
$canonicalUrl = trim($__env->yieldContent('canonical')) ?: ($portalBase.request()->getPathInfo());
$ogType = trim($__env->yieldContent('og_type')) ?: 'website';
$ogImage = trim($__env->yieldContent('og_image'));
@endphp
<meta name="description" content="{{ $pageDescription }}">
<title>{{ $pageTitle }}</title>
{{-- Kanonische URL --}}
<link rel="canonical" href="{{ $canonicalUrl }}">
{{-- OpenGraph / Social --}}
<meta property="og:type" content="{{ $ogType }}">
<meta property="og:site_name" content="{{ $siteName }}">
<meta property="og:title" content="{{ $pageTitle }}">
<meta property="og:description" content="{{ $pageDescription }}">
<meta property="og:url" content="{{ $canonicalUrl }}">
@if ($ogImage)
<meta property="og:image" content="{{ $ogImage }}">
@endif
<meta name="twitter:card" content="{{ $ogImage ? 'summary_large_image' : 'summary' }}">
<meta name="twitter:title" content="{{ $pageTitle }}">
<meta name="twitter:description" content="{{ $pageDescription }}">
<!-- Domain-spezifisches Favicon -->
<link rel="icon" href="{{ asset(\App\Helpers\ThemeHelper::getFaviconPath()) }}">