Beim Relaunch einer Website ändern sich oft die URL-Strukturen. Alte URLs mit Query-Parametern wie ?id=123&cat=5 sollen auf saubere, sprechende URLs umgeleitet werden. Das geht per .htaccess mit RewriteCond und QUERY_STRING.
Das Problem: Parameter-URLs auf Clean-URLs umleiten
Viele ältere CMS-Systeme erzeugen URLs mit Parametern:
www.beispiel.de/index.php?content=kontakt
www.beispiel.de/cms/show.asp?Template=5&level1=88&level2=89
www.beispiel.de/artikel.php?id=42&kategorie=technik
Nach dem Relaunch sollen diese auf saubere URLs weiterleiten:
www.beispiel.de/kontakt/
www.beispiel.de/technik-artikel/
www.beispiel.de/technik/artikel-42/
Eine einfache RewriteRule reicht dafür nicht, weil die Parameter (alles nach dem ?) nicht Teil der URI sind. Du brauchst eine zusätzliche RewriteCond, die den Query-String prüft.
Die Lösung: RewriteCond mit QUERY_STRING
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index\.php$ [NC]
RewriteCond %{QUERY_STRING} ^content=kontakt$ [NC]
RewriteRule ^(.*)$ /kontakt/? [L,R=301]
Was passiert in diesen vier Zeilen?
- RewriteEngine On - Aktiviert das Rewrite-Modul.
- RewriteCond %{REQUEST_URI} - Prüft den Pfad vor dem Fragezeichen. Hier: Ist es
/index.php? - RewriteCond %{QUERY_STRING} - Prüft die Parameter nach dem Fragezeichen. Hier: Ist es
content=kontakt? - RewriteRule - Leitet per 301 auf die neue URL um. Das
[NC]-Flag ignoriert Groß-/Kleinschreibung.
? am Ende hängt Apache die alten Parameter an die neue URL an. Aus /kontakt/ wird dann /kontakt/?content=kontakt. Das leere Fragezeichen am Ende schneidet den alten Query-String ab.
Weitere Praxisbeispiele
Mehrere Parameter umleiten
RewriteCond %{REQUEST_URI} ^/cms/show\.asp$ [NC]
RewriteCond %{QUERY_STRING} ^Template=5&level1=88&level2=89$ [NC]
RewriteRule ^(.*)$ /neue-seite/? [L,R=301]
Nur einen Parameter prüfen (Rest egal)
RewriteCond %{QUERY_STRING} (^|&)id=42($|&) [NC]
RewriteRule ^artikel\.php$ /technik/artikel-42/? [L,R=301]
Die Klammern (^|&) und ($|&) stellen sicher, dass der Parameter sowohl allein als auch in Kombination mit anderen Parametern gefunden wird.
Alle URLs eines alten Pfads umleiten
RewriteCond %{REQUEST_URI} ^/altes-cms/ [NC]
RewriteRule ^(.*)$ /? [L,R=301]
Hier werden alle Aufrufe unter /altes-cms/ auf die Startseite umgeleitet - unabhängig von Parametern.
Typische Stolperfallen
- Fragezeichen vergessen - Der häufigste Fehler. Ohne
?am Ende der Ziel-URL werden die alten Parameter mitgeschleppt. - & in der .htaccess - In der .htaccess schreibst du
&als normales&. Das&ist nur für HTML. - Reihenfolge der RewriteCond - Alle Bedingungen müssen vor der zugehörigen RewriteRule stehen. Jede RewriteRule "verbraucht" die davor stehenden Conditions.
- Encoding - Sonderzeichen in Parametern (Leerzeichen, Umlaute) werden URL-kodiert.
%20statt Leerzeichen,%C3%BCstatt ü.
Testen mit curl
Ob deine Regel funktioniert, prüfst du am schnellsten mit curl:
curl -I "https://www.beispiel.de/index.php?content=kontakt"
In der Ausgabe sollte HTTP/1.1 301 Moved Permanently und Location: https://www.beispiel.de/kontakt/ stehen.
Wann brauchst du das?
- Website-Relaunch - Altes CMS mit hässlichen URLs wird durch ein neues System mit Clean-URLs ersetzt
- CMS-Migration - Wechsel von einem System zum anderen (z.B. TYPO3 zu WordPress, ASP zu PHP)
- URL-Bereinigung - Alte Parameter-URLs existieren noch in Google und sollen korrekt umgeleitet werden
Häufige Fragen
Kann ich Sprungmarken (#) per .htaccess umleiten?
Nein. Der Hash-Teil einer URL (alles nach dem #) wird vom Browser nie an den Server gesendet. Apache sieht ihn nicht und kann ihn nicht verarbeiten. Wenn du auf einen bestimmten Anker weiterleiten willst, muss das per JavaScript auf der Zielseite passieren.
Funktioniert das auch auf Nginx?
Auf Nginx gibt es keine .htaccess. Dort nutzt du die if-Direktive mit $args in der Server-Konfiguration. Die Logik ist ähnlich, die Syntax anders.
Wie viele Regeln kann ich in der .htaccess haben?
Technisch unbegrenzt. Bei sehr vielen Regeln (hunderte) kann die Performance leiden, weil Apache jede Regel bei jedem Request prüft. In dem Fall ist eine Redirect-Map oder eine Lösung auf Anwendungsebene (PHP) sinnvoller.
Verwandte Artikel
- .htaccess-Datei - Alle wichtigen Anwendungen
- PHP Redirect 301 - Permanente Weiterleitung mit PHP
- HTTP zu HTTPS Weiterleitung
- PHP Redirect 302 - Temporäre Weiterleitung
Kommentararchiv 5
5 Kommentare zwischen 2016 und 2018. Leser fragten nach konkreten Umleitungsregeln für ihre Projekte.
Häufigste Frage: Wie leite ich eine URL mit index.php?content=kontakt auf /kontakt/ um? Antwort: RewriteCond auf QUERY_STRING und RewriteRule mit Fragezeichen am Ende der Ziel-URL.
Sprungmarken: Ein Leser fragte nach Redirects mit #-Ankern. Diese lassen sich nicht per .htaccess umleiten, da der Hash-Teil nie an den Server gesendet wird. Lösung: Per JavaScript auf der Zielseite.