Weiterleitung unter Apache

Unter einer Weiterleitung einer Webseite versteht man die Anweisung an den Browser durch den Webserver, eine neue Adresse (URL) anstatt der ursprünglich angegebenen Adresse zu öffnen. D.h man gibt z.B. die URL http://infra.net ein und wird anschließend auf die Adresse https://www.infra.net weitergeleitet. Unter Apache gibt es mehrere Möglichkeiten, diesen Effekt zu konfigurieren.


Die Direktiven "Redirect" oder "RedirectMatch"

Möchte man z.B. erreichen, dass der Anwender die Adresse http://www.meinedomain.de/newsletter/heute.html eingeben kann und anschließend auf die Seite http://www.meinedomain.de/newsletter/archiv/2017-07-20.html weitergeleitet wird, muss folgendes konfiguriert werden:

Redirect /newsletter/heute.html /newsletter/archiv/2017-07-20.html

Ein interessanter Nebeneffekt dieser Konfiguration ist der Umstand, dass damit automatisch auch folgende Weiterleitung möglich ist: http://www.meinedomain.de/newsletter/heute.html/seite2.html auf http://www.meinedomain.de/newsletter/archiv/2017-07-20.html/seite2.html

D.h. der Server versucht zunächst von links beginnend, einen Treffer für die Quelle zu erzielen und mit dem Ziel zu ersetzen. Aber er lässt den Rest der URL - soweit vorhanden - unverändert. Um das zu verhindern oder ganz andere Effekte zu erzeugen, bietet sich der "große Bruder" von "Redirect" an: Mit "RedirectMatch" hat man die Möglichkeit, die Quelle auch über Regular Expressions zu definieren. In Anlehnung an das obere Beispiel könnte man statt wie oben

RedirectMatch ^/newsletter/heute.html$ /newsletter/archiv/2017-07-20.html

konfigurieren. Somit würde lediglich die exakte URL weitergeleitet. Dabei stehen die Zeichen '^' und '$' für den Anfang und das Ende des zu suchenden Strings.


Verwendung von "Wildcards"

Eine weitere Variante wäre die Verwendung von sog. Wildcards:

RedirectMatch ^/newsletter/heute.html.* /newsletter/archiv/2017-07-20.html

würde wie im ersten Beispiel jede URL, welche mit der Quelle beginnt weiterleiten. Jedoch immer genau auf das selbe Ziel. Dabei steht '.' für ein beliebiges Zeichen und '*' für 0 oder mehr Vorkommen des links davon angegebenen Zeichens, also hier dem '.'.

Die letzte Variante wäre dann ein exakter Ersatz vom "Redirect" im ersten Beispiel durch "RedirectMatch" und zugleich das Tor zu ganz anderen Möglichkeiten:

RedirectMatch ^/newsletter/heute.html(.*) /newsletter/archiv/2017-07-20.html$1

Hier wird in der Quelle eine sogenannte Backreference gebildet: Alles was mit der Zeichenfolge innerhalb der Klammer übereinstimmt - in diesem Fall wegen der Wildcard alles folgende - wird für das Ziel in der Variable $1, der Backreference zur Verfügung gestellt. Gebe ich also z.B. http://www.meinedomain.de/newsletter/heute.html/abc.jpg wird in den Klammern der Treffer "/abc.jpg" erzielt und in '$1' zur Verfügung gestellt. D.h. die Weiterleitung erfolgt auf das Ziel http://www.meinedomain.de/newsletter/archiv/2017-07-20.html/abc.jpg.

Zuletzt eine Warnung vor der Verwendung in komplexen Konfigurationen: In einem solchen Umfeld muss man sich erst darüber informieren, in welcher Reihenfolge andere Direktiven interpretiert werden, welche in der Lage sind, URLs bei einem Aufruf zu verändern, z.B. mit "RewriteRule" oder "ProxyPass".


Vermeidung von "Endlosschleifen"

Ein weiterer wichtiger Aspekt ist die mögliche Verkettung von ein und demselben Redirect: Verweist das Ziel auf eine URL, welche geeignet wäre bei folgendem Aufruf durch den Browser beim selben redirect einen Treffer zu erzielen, kann es schnell zu einer Endlosschleife führen! Der Server kann dann bei mehreren gleichzeitigen Anwendern sehr schnell unter der Last zusammenbrechen. Dieses Verhalten lässt sich jedoch relativ leicht in der entsprechend "access.log" erkennen und dadurch wieder abschalten.