Self-Hosted Webserver

URLs in der Apache-Konfiguration umleiten – Redirects mit Redirect und mod_rewrite

URL-Weiterleitungen gehören zum Alltag eines Webserver-Administrators. Dieser Beitrag zeigt praxisnah, wie du mit Apache einzelne URLs, komplette Domains und HTTP auf HTTPS umleitest und wann Redirect oder mod_rewrite die bessere Wahl ist.

8 min Lesezeit
Grafik: Apache URLs umleiten: Redirects richtig einrichten

Wer eine Webseite betreibt, kommt früher oder später mit URL-Weiterleitungen in Berührung. Vielleicht wurde eine Seite verschoben, die Verzeichnisstruktur geändert, eine neue Domain eingeführt oder eine Webseite vollständig auf HTTPS umgestellt. Damit Besucher, Suchmaschinen und bestehende Links weiterhin am richtigen Ziel ankommen, können Weiterleitungen direkt über den Apache-Webserver eingerichtet werden.

Apache stellt dafür mehrere Möglichkeiten bereit. Besonders wichtig sind die Direktive Redirect aus dem Modul mod_alias und die wesentlich flexiblere Rewrite-Engine mod_rewrite.

In diesem Beitrag schauen wir uns ausführlich an, wie URL-Weiterleitungen direkt in einer Apache-Konfigurationsdatei eingerichtet werden, wann Redirect sinnvoll ist und wann sich der Einsatz von RewriteRule empfiehlt.

Warum URLs überhaupt umleiten?

Nehmen wir an, eine Webseite war bisher unter folgender Adresse erreichbar:

https://www.example.de/alte-seite

Nach einer Umstrukturierung lautet die neue Adresse:

https://www.example.de/neue-seite

Die alte URL kann allerdings noch an vielen Stellen vorhanden sein:

  • in Suchmaschinen
  • in Browser-Lesezeichen
  • in Dokumentationen
  • in sozialen Netzwerken
  • auf anderen Webseiten
  • in internen Links
  • in RSS-Feeds
  • in E-Mails

Wird die alte Seite einfach gelöscht, erhalten Besucher möglicherweise einen HTTP-Fehler 404 Not Found.

Besser ist eine Weiterleitung:

/alte-seite
       ↓
/neue-seite

Der Webserver teilt dem Browser mit, dass sich die gewünschte Ressource an einer anderen Adresse befindet.

HTTP-Statuscodes für Weiterleitungen

Eine Weiterleitung besteht nicht nur aus einem Ziel. Der Webserver liefert gleichzeitig einen HTTP-Statuscode zurück.

Besonders häufig begegnet man den Statuscodes 301 und 302.

301 – Moved Permanently

Ein 301 signalisiert eine dauerhafte Weiterleitung.

Beispiel:

HTTP/1.1 301 Moved Permanently
Location: https://www.example.de/neue-seite

Diese Variante eignet sich beispielsweise für:

  • dauerhaft verschobene Seiten
  • neue URL-Strukturen
  • Domainumzüge
  • dauerhafte HTTP-zu-HTTPS-Weiterleitungen
  • dauerhaft geänderte Artikeladressen

Für Webseitenmigrationen ist 301 daher häufig die richtige Wahl.

302 – Found

Ein 302 beschreibt dagegen eine temporäre Weiterleitung.

Sie ist sinnvoll, wenn die ursprüngliche URL später wieder verwendet werden soll.

Beispielsweise:

/wartung
    ↓
/wartungsseite

Soll die Änderung dauerhaft bestehen bleiben, sollte in der Regel kein 302, sondern ein permanenter Redirect verwendet werden.

Wo werden Apache-Weiterleitungen konfiguriert?

Weiterleitungen können je nach Serverkonfiguration an unterschiedlichen Stellen eingerichtet werden.

Unter Debian und Ubuntu befinden sich VirtualHost-Konfigurationen beispielsweise typischerweise unter:

/etc/apache2/sites-available/

Eine Webseite könnte dort etwa folgende Konfigurationsdatei besitzen:

/etc/apache2/sites-available/example.conf

Aktivierte Konfigurationen werden normalerweise über:

/etc/apache2/sites-enabled/

eingebunden.

Zusätzlich können Apache-Direktiven – sofern vom Administrator erlaubt – über eine .htaccess-Datei definiert werden.

Bei einem selbst administrierten Server ist die zentrale Apache-Konfiguration beziehungsweise die VirtualHost-Konfiguration meist vorzuziehen. Apache muss dann nicht bei jedem Request nach .htaccess-Dateien suchen und deren Inhalt erneut berücksichtigen.

Einfache Weiterleitungen mit Redirect

Für einfache URL-Weiterleitungen bietet Apache die Direktive Redirect.

Sie gehört zum Modul:

mod_alias

Eine einfache permanente Weiterleitung kann beispielsweise so aussehen:

Redirect 301 /alte-seite https://www.example.de/neue-seite

Alternativ kann permanent verwendet werden:

Redirect permanent /alte-seite https://www.example.de/neue-seite

Die Weiterleitung kann direkt innerhalb eines VirtualHosts stehen:

<VirtualHost *:443>

    ServerName www.example.de

    Redirect 301 /alte-seite https://www.example.de/neue-seite

</VirtualHost>

Ruft ein Besucher nun

https://www.example.de/alte-seite

auf, erhält er eine permanente Weiterleitung auf:

https://www.example.de/neue-seite

Mehrere einzelne URLs weiterleiten

Wurde eine Webseite umstrukturiert, können mehrere Weiterleitungen definiert werden.

Beispielsweise:

Redirect 301 /linux-alt https://www.example.de/linux
Redirect 301 /apache-alt https://www.example.de/apache
Redirect 301 /kontakt-alt https://www.example.de/kontakt

Das ist besonders praktisch, wenn nur wenige bekannte URLs geändert wurden.

Bei sehr vielen oder systematisch aufgebauten Weiterleitungen wird diese Methode allerdings schnell unübersichtlich. Dann kommt mod_rewrite ins Spiel.

Eine komplette Domain umleiten

Ein typischer Anwendungsfall ist ein Domainwechsel.

Angenommen, die bisherige Webseite lief unter:

https://alte-domain.de

und soll künftig unter:

https://neue-domain.de

erreichbar sein.

Ein entsprechender VirtualHost könnte folgendermaßen aussehen:

<VirtualHost *:80>

    ServerName alte-domain.de
    ServerAlias www.alte-domain.de

    Redirect permanent / https://neue-domain.de/

</VirtualHost>

Eine Anfrage an:

http://alte-domain.de/blog/apache

wird dadurch beispielsweise auf die neue Domain weitergeleitet.

Für eine vollständige Domainmigration sollte allerdings genau geprüft werden, wie Pfade, HTTPS, Subdomains und gegebenenfalls Query-Parameter behandelt werden sollen.

HTTP auf HTTPS umleiten

Einer der häufigsten Anwendungsfälle ist die Weiterleitung unverschlüsselter HTTP-Anfragen auf HTTPS.

Der HTTP-VirtualHost lauscht normalerweise auf Port 80:

<VirtualHost *:80>

    ServerName example.de
    ServerAlias www.example.de

    Redirect permanent / https://example.de/

</VirtualHost>

Ruft jemand beispielsweise

http://example.de/linux/apache

auf, wird die Anfrage auf die HTTPS-Version der Webseite weitergeleitet.

Die eigentliche Webseite wird anschließend über einen separaten VirtualHost auf Port 443 bereitgestellt:

<VirtualHost *:443>

    ServerName example.de

    SSLEngine on

    # weitere SSL- und Webseiten-Konfiguration

</VirtualHost>

In einer produktiven Umgebung gehören selbstverständlich noch die passenden Zertifikats- und TLS-Einstellungen dazu.

Weiterleitungen mit mod_rewrite

Redirect ist bewusst einfach gehalten. Sobald Bedingungen, reguläre Ausdrücke oder komplexere URL-Strukturen benötigt werden, ist mod_rewrite deutlich leistungsfähiger.

Zunächst muss die Rewrite-Engine aktiviert werden:

RewriteEngine On

Anschließend können Regeln definiert werden.

Ein einfaches Beispiel:

RewriteEngine On

RewriteRule ^/alte-seite$ /neue-seite [R=301,L]

Die Regel leitet:

/alte-seite

auf:

/neue-seite

weiter.

Die Flags R und L

Am Ende einer RewriteRule stehen häufig sogenannte Flags:

[R=301,L]

R=301 bedeutet, dass Apache eine externe HTTP-Weiterleitung mit dem Statuscode 301 ausführen soll.

L steht für:

Last

Apache soll nach erfolgreicher Anwendung dieser Regel innerhalb des aktuellen Rewrite-Durchlaufs keine weiteren Regeln mehr verarbeiten.

Diese Kombination findet man daher sehr häufig:

[R=301,L]

Ganze URL-Strukturen umleiten

Die eigentliche Stärke von mod_rewrite zeigt sich bei dynamischen Regeln.

Angenommen, die bisherige Struktur lautet:

/blog/alt/apache
/blog/alt/linux
/blog/alt/debian

Die neue Struktur soll folgendermaßen aussehen:

/blog/neu/apache
/blog/neu/linux
/blog/neu/debian

Anstatt für jede URL eine eigene Weiterleitung einzurichten, kann eine Regel verwendet werden:

RewriteEngine On

RewriteRule ^/blog/alt/(.*)$ /blog/neu/$1 [R=301,L]

Der Ausdruck:

(.*)

erfasst den restlichen Teil der URL.

Dieser wird über:

$1

wieder in das Ziel eingesetzt.

Damit wird beispielsweise:

/blog/alt/apache

automatisch zu:

/blog/neu/apache

und:

/blog/alt/debian

zu:

/blog/neu/debian

Weiterleitungen abhängig vom Hostnamen

Mit RewriteCond können zusätzliche Bedingungen definiert werden.

Ein klassisches Beispiel ist die Vereinheitlichung einer Domain.

Angenommen, alle Anfragen an:

www.example.de

sollen künftig auf:

example.de

zeigen.

Eine mögliche Konfiguration lautet:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.example\.de$ [NC]
RewriteRule ^/(.*)$ https://example.de/$1 [R=301,L]

RewriteCond definiert dabei die Bedingung, unter der die nachfolgende RewriteRule ausgeführt wird.

Das Flag:

NC

steht für:

No Case

Die Prüfung erfolgt also ohne Beachtung der Groß- und Kleinschreibung.

HTTPS mit mod_rewrite erzwingen

HTTP kann ebenfalls über mod_rewrite auf HTTPS umgeleitet werden:

RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Damit wird geprüft, ob HTTPS aktiv ist.

Ist dies nicht der Fall, wird die Anfrage auf die entsprechende HTTPS-Adresse umgeleitet.

Bei einfachen VirtualHost-Konfigurationen ist ein schlichtes Redirect permanent häufig übersichtlicher. mod_rewrite lohnt sich insbesondere dann, wenn weitere Bedingungen berücksichtigt werden müssen.

Redirect oder RewriteRule?

Beide Methoden haben ihre Berechtigung.

Für eine einfache Weiterleitung wie:

/alte-seite → /neue-seite

ist Redirect meist leichter verständlich:

Redirect 301 /alte-seite https://www.example.de/neue-seite

mod_rewrite bietet sich dagegen an, wenn:

  • reguläre Ausdrücke benötigt werden
  • viele URLs einem gemeinsamen Muster folgen
  • Bedingungen geprüft werden müssen
  • Hostnamen berücksichtigt werden
  • komplexe Migrationen durchgeführt werden
  • URL-Strukturen dynamisch verändert werden sollen

Eine gute Grundregel lautet daher:

So einfach wie möglich konfigurieren und mod_rewrite erst einsetzen, wenn die zusätzliche Flexibilität tatsächlich benötigt wird.

mod_rewrite unter Debian aktivieren

Falls das Modul noch nicht aktiviert wurde, kann dies unter Debian beziehungsweise Ubuntu mit a2enmod erfolgen:

sudo a2enmod rewrite

Anschließend sollte die Apache-Konfiguration überprüft werden:

sudo apachectl configtest

Ist alles korrekt, erscheint:

Syntax OK

Danach kann Apache neu geladen werden:

sudo systemctl reload apache2

Ein Reload ist einem vollständigen Neustart häufig vorzuziehen, weil die laufende Konfiguration möglichst unterbrechungsarm neu eingelesen wird.

VirtualHost aktivieren

Wurde beispielsweise eine neue Konfiguration unter:

/etc/apache2/sites-available/example.conf

angelegt, kann sie unter Debian mit:

sudo a2ensite example.conf

aktiviert werden.

Danach wieder:

sudo apachectl configtest

und:

sudo systemctl reload apache2

Bei Änderungen an produktiven Webservern sollte der configtest grundsätzlich vor dem Reload durchgeführt werden.

Weiterleitungen mit curl überprüfen

Nur weil eine Weiterleitung im Browser scheinbar funktioniert, bedeutet das noch nicht, dass sie technisch genauso arbeitet wie geplant.

Sehr hilfreich ist deshalb curl.

Beispielsweise:

curl -I https://www.example.de/alte-seite

Die Option -I sorgt dafür, dass nur die HTTP-Header abgefragt werden.

Eine funktionierende permanente Weiterleitung könnte beispielsweise so aussehen:

HTTP/1.1 301 Moved Permanently
Location: https://www.example.de/neue-seite

Damit lässt sich unmittelbar erkennen, welchen Statuscode Apache ausliefert und welches Ziel im Location-Header angegeben wird.

Weiterleitung vollständig verfolgen

Mit:

curl -IL https://www.example.de/alte-seite

kann curl den Weiterleitungen folgen.

Das ist besonders hilfreich, wenn mehrere Redirects hintereinander stattfinden.

Beispielsweise:

http://www.example.de
        ↓
https://www.example.de
        ↓
https://example.de

Technisch funktioniert das zwar, optimal ist eine solche Redirect-Kette aber häufig nicht.

Besser wäre möglichst:

http://www.example.de
        ↓
https://example.de

Je weniger unnötige Weiterleitungen stattfinden, desto übersichtlicher und effizienter bleibt die Konfiguration.

Vorsicht vor Redirect-Loops

Eine fehlerhafte Konfiguration kann eine Endlosschleife erzeugen.

Beispielsweise:

/seite-a → /seite-b

und gleichzeitig:

/seite-b → /seite-a

Browser melden dann häufig Fehler wie:

ERR_TOO_MANY_REDIRECTS

Auch falsch formulierte HTTPS- oder Hostname-Regeln können solche Schleifen verursachen.

Deshalb sollten neue Rewrite-Regeln zunächst sorgfältig getestet werden.

301-Redirects nicht unüberlegt einsetzen

Browser und andere Clients können permanente Weiterleitungen zwischenspeichern. Dadurch kann es bei Tests irritierend sein, wenn eine bereits korrigierte Regel im Browser scheinbar weiterhin ausgeführt wird.

Bei umfangreichen Änderungen kann es deshalb sinnvoll sein, Weiterleitungen zunächst kontrolliert mit temporären Redirects zu testen und erst nach erfolgreicher Prüfung auf 301 umzustellen.

Dabei sollte allerdings darauf geachtet werden, temporäre Test-Redirects nicht versehentlich dauerhaft produktiv zu betreiben.

Apache-Logs bei Problemen prüfen

Funktioniert eine Weiterleitung nicht wie erwartet, helfen die Apache-Logs weiter.

Unter Debian befinden sich diese standardmäßig unter:

/var/log/apache2/

Besonders interessant sind:

/var/log/apache2/access.log

und:

/var/log/apache2/error.log

Live lassen sich neue Einträge beispielsweise mit folgendem Befehl beobachten:

sudo tail -f /var/log/apache2/error.log

Bei VirtualHosts können allerdings auch eigene Logdateien über ErrorLog und CustomLog definiert sein.

Typischer Workflow für neue Redirects

In der Praxis bietet sich ein klarer Ablauf an.

Zunächst wird die betreffende VirtualHost-Konfiguration bearbeitet:

sudo nano /etc/apache2/sites-available/example.conf

Anschließend wird beispielsweise eine Weiterleitung ergänzt:

Redirect 301 /alte-seite https://www.example.de/neue-seite

Danach folgt unbedingt der Syntaxcheck:

sudo apachectl configtest

Bei:

Syntax OK

kann Apache neu geladen werden:

sudo systemctl reload apache2

Zum Abschluss wird die Weiterleitung überprüft:

curl -I https://www.example.de/alte-seite

So lässt sich eine Änderung kontrolliert und nachvollziehbar durchführen.

Fazit

URL-Weiterleitungen gehören zu den grundlegenden Aufgaben bei der Administration eines Apache-Webservers. Sie werden bei Domainumzügen, geänderten Seitenstrukturen, HTTPS-Migrationen und zahlreichen anderen Änderungen benötigt.

Apache stellt dafür mit Redirect und mod_rewrite zwei leistungsfähige Werkzeuge bereit.

Für einfache und eindeutige Weiterleitungen sollte möglichst die unkomplizierte Variante verwendet werden:

Redirect 301 /alt https://www.example.de/neu

Sobald Bedingungen, reguläre Ausdrücke oder systematische Änderungen ganzer URL-Strukturen notwendig werden, bietet mod_rewrite wesentlich mehr Möglichkeiten:

RewriteEngine On
RewriteRule ^/alt/(.*)$ /neu/$1 [R=301,L]

Unabhängig von der verwendeten Methode gilt: Vor einem Reload sollte die Apache-Konfiguration immer mit

apachectl configtest

überprüft werden. Anschließend lässt sich mit curl -I kontrollieren, welcher HTTP-Statuscode tatsächlich ausgeliefert wird und wohin der Webserver den Client weiterleitet.

Wer Redirects bewusst einsetzt, vermeidet unnötige 404-Fehler, erhält bestehende Links und sorgt dafür, dass Besucher und Suchmaschinen auch nach Änderungen der Webseitenstruktur zuverlässig am richtigen Ziel landen.