withRouting( web: __DIR__.'/../routes/domains.php', commands: __DIR__.'/../routes/console.php', health: '/up', then: function (): void { // Tiefer Health-Check für den externen Monitor (Uptime Kuma), auf jeder Domain Route::get('/health', HealthController::class) ->middleware('throttle:30,1') ->name('health.deep'); }, ) ->withMiddleware(function (Middleware $middleware) { // Traefik Reverse-Proxy vertraut die X-Forwarded-Proto/For Headers // damit $request->url() korrekt https:// zurückgibt (nötig für signierte Upload-URLs) $middleware->trustProxies(at: '*'); // Domain-URL Konfiguration - muss ganz am Anfang ausgeführt werden // um sicherzustellen, dass url() und asset() die richtige Domain verwenden $middleware->prepend(\App\Http\Middleware\SetDomainUrl::class); // Sprachwechsel aus Session anwenden $middleware->appendToGroup('web', \App\Http\Middleware\SetLocale::class); // Partner Setup-Zwang für eingeloggte User $middleware->alias([ 'partner.setup' => \App\Http\Middleware\EnsurePartnerSetupCompleted::class, ]); // Fehler ohne Exception (toter interner Link, 403/429 für Angemeldete, 419) – // global, weil 404 vor dem Routing entsteht $middleware->append(ReportErrorSignals::class); // Inhalte-Editor im Portal zeigt die Website im iframe: frame-ancestors statt SAMEORIGIN $middleware->append(\App\Http\Middleware\AllowPortalFraming::class); // BasicAuth ganz am Ende, nach Session-Middleware if (env('BASIC_AUTH_ENABLED', true)) { $middleware->append(\App\Http\Middleware\BasicAuthMiddleware::class); } }) ->withExceptions(function (Exceptions $exceptions) { // Gemeldete Exceptions an GlitchTip (ohne DSN ein No-op); // Laravels dontReport (404, Validierung, Auth) gilt weiter Integration::handles($exceptions); // Vertippte artisan-Befehle sind kein Anwendungsfehler $exceptions->dontReport(CommandNotFoundException::class); })->create();