URL-Parameter per .htaccess auf Clean-URL umleiten

URL-Parameter per .htaccess auf Clean-URL umleiten

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?

  1. RewriteEngine On - Aktiviert das Rewrite-Modul.
  2. RewriteCond %{REQUEST_URI} - Prüft den Pfad vor dem Fragezeichen. Hier: Ist es /index.php?
  3. RewriteCond %{QUERY_STRING} - Prüft die Parameter nach dem Fragezeichen. Hier: Ist es content=kontakt?
  4. RewriteRule - Leitet per 301 auf die neue URL um. Das [NC]-Flag ignoriert Groß-/Kleinschreibung.
Das Fragezeichen am Ende der Ziel-URL ist entscheidend! Ohne das ? 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

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?

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

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.