getHost(); // Portal-Inhalte (Kategorie, Archiv, Meldung, Newsroom) sind auch // über den Hub erreichbar und rendern dort das Portal. Ihr Canonical // gehört auf das Portal, nicht auf pressekonto. if ($portalContextApplied && is_string($domainUrl) && $domainUrl !== '') { return rtrim($domainUrl, '/'); } if (is_string($domainUrl) && $domainUrl !== '' && parse_url($domainUrl, PHP_URL_HOST) === $host) { return rtrim($domainUrl, '/'); } foreach ((array) config('domains.domains', []) as $domain) { $url = $domain['url'] ?? null; if (is_string($url) && parse_url($url, PHP_URL_HOST) === $host) { return rtrim($url, '/'); } } return rtrim(request()->getSchemeAndHttpHost(), '/'); } /** * Adresse für einen Link auf eine benannte Seite: normalerweise die des * aufgerufenen Hosts — bei Portalseiten auf dem Hub direkt die des * führenden Portals, damit der Besucher nicht über eine Weiterleitung * läuft. */ public static function publicUrlFor(string $routeName): string { $url = route($routeName); $portalBase = self::portalOnlyRedirect($routeName); if ($portalBase !== null && str_contains(request()->getHost(), 'pressekonto')) { return $portalBase.(string) parse_url($url, PHP_URL_PATH); } return $url; } /** * Seiten, die es nur auf den Portalen gibt — auf dem Hub führen sie auf * das führende Portal statt auf eine Fassung mit fremdem Branding. */ public static function portalOnlyRedirect(?string $routeName): ?string { if ($routeName === null || ! in_array($routeName, (array) config('canonical.portal_only_pages', []), true)) { return null; } return self::defaultPortalBase(); } /** * Basis-URL des Standard-Portals (config canonical.portal_only_host). */ public static function defaultPortalBase(): ?string { $url = config('domains.domains.'.config('canonical.portal_only_host', 'presseecho').'.url'); return is_string($url) && $url !== '' ? rtrim($url, '/') : null; } /** * Basis-URL eines Portals aus dem Enum-Wert (`presseecho`, * `businessportal24`); `both` und Unbekanntes fallen auf das * Standard-Portal zurück. */ public static function portalBaseFor(?string $portal): ?string { if ($portal === null || $portal === Portal::Both->value) { return self::defaultPortalBase(); } $url = config('domains.domains.'.$portal.'.url'); return is_string($url) && $url !== '' ? rtrim($url, '/') : self::defaultPortalBase(); } }