web: www-Hosts leiten kanonisch per 301 auf die Apex-Domain
Ploi kann nur Pfad-Redirects, daher als App-Middleware (früh im globalen Stack): GET/HEAD auf www.<domain> → 301 auf die Apex-Domain mit Pfad und Query. Unsichere Methoden werden nicht umgeleitet (301 verwirft den Body) — die beantwortet die App dank Host-Normalisierung weiterhin selbst. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
acf67211bf
commit
42e56a7d81
3 changed files with 75 additions and 0 deletions
37
app/Http/Middleware/RedirectWwwToApex.php
Normal file
37
app/Http/Middleware/RedirectWwwToApex.php
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
/**
|
||||
* Leitet www-Hosts kanonisch auf die Apex-Domain um (301, Pfad + Query
|
||||
* bleiben erhalten): Jede Seite soll genau eine indexierbare URL haben,
|
||||
* und Sessions/Cookies laufen nicht auf zwei Host-Varianten auseinander.
|
||||
*
|
||||
* Nur sichere Methoden (GET/HEAD/OPTIONS) werden umgeleitet — ein 301
|
||||
* würde bei POST & Co. den Request-Body verwerfen; solche Requests
|
||||
* beantwortet die App dank Host-Normalisierung (DomainAssetContext)
|
||||
* auch auf www-Hosts korrekt.
|
||||
*/
|
||||
class RedirectWwwToApex
|
||||
{
|
||||
/**
|
||||
* @param Closure(Request): Response $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
$host = strtolower($request->getHost());
|
||||
|
||||
if (! str_starts_with($host, 'www.') || ! $request->isMethodSafe()) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
return redirect()->away(
|
||||
$request->getScheme().'://'.substr($host, 4).$request->getRequestUri(),
|
||||
301
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use App\Http\Middleware\BasicAuthMiddleware;
|
||||
use App\Http\Middleware\LogApiUsage;
|
||||
use App\Http\Middleware\RedirectWwwToApex;
|
||||
use App\Http\Middleware\RejectLegacyApiKeys;
|
||||
use App\Http\Middleware\SecurityHeaders;
|
||||
use App\Http\Middleware\SetCurrentPortal;
|
||||
|
|
@ -28,6 +29,11 @@ return Application::configure(basePath: dirname(__DIR__))
|
|||
)
|
||||
->withMiddleware(function (Middleware $middleware) {
|
||||
|
||||
// Kanonische Hosts: www.<domain> → 301 auf die Apex-Domain, so früh
|
||||
// wie möglich (vor Session/Theme), damit www-Requests gar nicht erst
|
||||
// gerendert werden.
|
||||
$middleware->prepend(RedirectWwwToApex::class);
|
||||
|
||||
// Security-Header auf allen Antworten (Web + API), Proxy-unabhängig.
|
||||
$middleware->append(SecurityHeaders::class);
|
||||
|
||||
|
|
|
|||
32
tests/Feature/Web/WwwRedirectTest.php
Normal file
32
tests/Feature/Web/WwwRedirectTest.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* Kanonische Hosts (RedirectWwwToApex): www-Varianten leiten per 301 auf die
|
||||
* Apex-Domain, Pfad und Query bleiben erhalten. Unsichere Methoden werden
|
||||
* nicht umgeleitet (301 würde den Request-Body verwerfen).
|
||||
*/
|
||||
test('www hosts redirect permanently to the apex domain keeping path and query', function () {
|
||||
/** @var TestCase $this */
|
||||
$this->get('https://www.presseecho.test/de/impressum?foo=bar')
|
||||
->assertStatus(301)
|
||||
->assertRedirect('https://presseecho.test/de/impressum?foo=bar');
|
||||
|
||||
$this->get('https://www.businessportal24.test/de')
|
||||
->assertStatus(301)
|
||||
->assertRedirect('https://businessportal24.test/de');
|
||||
});
|
||||
|
||||
test('apex hosts are not redirected', function () {
|
||||
/** @var TestCase $this */
|
||||
$this->get('https://presseecho.test/de/impressum')->assertSuccessful();
|
||||
});
|
||||
|
||||
test('unsafe methods on www hosts are answered instead of redirected', function () {
|
||||
/** @var TestCase $this */
|
||||
// POST darf nicht 301en (Body ginge verloren) — die App beantwortet den
|
||||
// Request dank Host-Normalisierung auch auf dem www-Host selbst.
|
||||
$this->post('https://www.presseecho.test/de/kontakt')
|
||||
->assertStatus(302); // Validierungs-Redirect der Kontakt-Route, kein 301
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue