Raketenwilli: Auflösung des Rätsels

Beitrag lesen

Das Handbuch ist an der Stelle „missverstehbar“.

RewriteEngine On
RewriteRule (.*) https://www.example.org%{REQUEST_URI}

In den Falle, dass die Zieladresse eine vollständige und absolute URI ist (erkennbar daran, dass diese mit dem Protokoll beginnt) wird die Query nachträglich bei der Umleitung angehangen.

Mit

LogLevel debug rewrite:trace8

in der Config des Servers kann man das im Error-Log nachlesen:

… applying pattern '(.*)' to uri '/'
… rewrite '/' -> 'https://example.org/'
… explicitly forcing redirect with https://www.example.org/
… escaping https://www.example.org/ for redirect
… copying foo=bar to query string for redirect 
… redirect to https://www.example.org/?foo=bar [REDIRECT/301]

Gegenbeispiel mit relativer URL:

RewriteEngine On
RewriteRule .* /router.php%{REQUEST_URI}

In diesem Fall wird die query (angeblich: ich habe das nicht selbst getestet) nicht hinzugefügt. Ebenso nicht, wenn man dieses Verhalten mit dem Parameter QSD explizit abschaltet:

RewriteRule (.*) https://example.org%{REQUEST_URI} [QSD]

Mit dem Parameter QSA kann man es aber ebenso auch dann erzwingen, wenn das Ziel der Umleitung eine relative URL ist.

Merkregel: „Q“ wie query, „s“ wie shold, „D“ wie delete, „A“ wie append.

Es gibt auf meinen Bugreport hin einen Revisionseintrag zum Handbuch, wahrscheinlich wird die von Rolf genannte Stelle geändert.

Ich würde jetzt dazu neigen, das Verhalten nicht dem „Zufall“ zu überlassen, sondern auch zum Zweck der „Selbstdokumentation“ diese Parameter (QSD oder QSA) stets angeben - statt mich auf irgendwelche Defaults zu verlassen.

Jedenfalls in künftigen Projekten.

Vollständig sieht die Rewrite-Role dann so aus:

RewriteRule (.*) https://www.example.org%{REQUEST_URI} [END,QSA,R=permanent]
  • END - Bearbeiten der Regeln abbrechen
  • QSA - Query anhängen
  • R=permanent - Mit HTTP-Statuscode 301 „Moved Permanently“