Das Modul mod_rewrite dient der Manipulation von URLs und wird im Zusammenhang mit WordPress in der Regel in den .htaccess-Dateien angewendet. Je nach Art der Installation ergeben sich dabei hin und wieder Probleme, so dass ich auch für mich zum Nachschlagen hier einige Zusammenhänge notiert habe, denn
“Some people, when confronted with a problem, think ‚I know I’ll use regular expressions.‘ Now they have two problems.”
Jamie Zawinski
Ein einfaches Beispiel
ist die mit WordPress ausgelieferte .htaccess, die normalerweise folgenden Inhalt hat:
1. # BEGIN WordPress 2. <IfModule mod_rewrite.c> 3. RewriteEngine On 4. RewriteBase / 5. RewriteRule ^index\.php$ - [L] 6. RewriteCond %{REQUEST_FILENAME} !-f 7. RewriteCond %{REQUEST_FILENAME} !-d 8. RewriteRule . /index.php [L] 9. </IfModule> 10. # END WordPress
Ein Block beginnt mit <IfModule mod_rewrite.c> und endet mit </IfModule>, wobei Zeilen mit einem # Kommentare sind.
Beginnen wir mit der Zeile 3, in der zunächst die RewriteEngine aktiviert wird. Mit Ende des Blocks wird sie automatisch wieder deaktiviert.
<IfModule mod_rewrite.c> RewriteEngine On ... </IfModule>
Danach wird ein Basisverzeichnis benannt, auf das die Regeln angewendet werden sollen. Liegt die WordPress-Installation also im Web-Verzeichnis (www oder public_html) , dann gibt man / an, liegt sie in einem Unterverzeichnis wp, so muss als RewriteBase /wp/ angegeben werden.
<IfModule mod_rewrite.c> RewriteEngine On # Die Installation liegt im Unterverzeichnis wp des Web-Verzeichnisses RewriteBase /wpi/ ... </IfModule>
Die RewriteRules werden der Reihe nach abgearbeitet und besitzen bis zu zwei Parameter und evtl. Optionen. Der erste Parameter ist ein regulärer Ausdruck und die Regel wird angewendet, wenn das Muster dieses Ausdrucks zur Clientanfrage passt.
Das Muster wird wiederum von den Zeichen ^ (Angang) und $ (Ende) begrenzt.
Stellt man ein Ausrufezeichen davor, wird die Regel angewendet, wenn sie NICHT zutrifft.
Da der Punkt alleine verwendet werden kann, um beliebige Zeichen zu symbolisieren, muss er mit dem Escape-Character \ versehen werden, damit der Punkt auch als Punkt interpretiert wird.
Zusätzlich wird in den eckigen Klammern eine Option angegeben. [L] bedeutet hier Last/Letzte und danach werden keine weiteren Regeln mehr angewendet.
Die Regel RewriteRule ^index\.php$ – [L] besagt also, dass eine URL in der index.php vorkommt nicht verarbeitet werden muss und zum Abbruch der Regelbearbeitung führt.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] ... </IfModule>
Wurde index.php in der URL nicht gefunden, werden nun zwei Conditions festgelegt, die Bedingungen für die folgende Regeln festlegen. Sie dienen der Prüfung durch mod_rewrite, ob der angeforderte File- oder Verzeichnisname überhaupt existiert. Die Option -d steht dabei für Directory, die Option -f für File. Das Ausrufezeichen ist dabei die Verneinung, so dass die Bedingungen aussagen: „Wenn der angefoderte Name kein Verzeichnis und keine Datei ist, dann führe die nachfolgende(n) Regel(n) aus„.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d ... </IfModule>
Die letzte Regel ersetzt nun den nicht vorhandenen Verzeichnis- oder Dateinamen in der angeforderten URL einfach wieder mit index.php und stoppt mit [L] jede weitere Abarbeitung von evtl. noch folgenden Regeln, wenn die davor stehenden Conditions (Vorgaben) erfüllt wurden.
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Soweit war das nun nicht sehr schwer, es deckt aber auch nur wenige Anforderungen des WordPress-Lebens ab. Deswegen nun ein schwierigeres Beispiel für mod_rewrite.
WordPress in einem Unterverzeichnis
Ich habe meine Installation nicht im Web-Verzeichnis von https://impuscatura.ro/wp, sondern in einem untergeordneten Verzeichnis. Damit Anfragen mit https://impuscatura.ro/wp oder https://www.impuscatura.ro auf dieses Unterverzeichnis weitergeleitet werden, steht im Webverzeichnis folgende .htaccess:
RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?impuscatura.ro$ RewriteCond %{REQUEST_URI} !^/wpi/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /wpi/\
Die RewriteEngine wird eingeschaltet und es folgen vier Bedingungen:
- Wenn in der URL das Pattern www.impuscatura.ro oder impuscatura.ro enthalten ist (HTTP_HOST)
- und wenn der Pfad in der URL nicht /wpi/ lautet (also bereits auf das korrekte Unterverzeichnis verweist)
- und wenn der Filename in der URL nicht existiert
- und wenn der/die Verzeichnisname(n) nicht existier(t/en),
dann ändere den URL-Teil in impuscatura.ro/wpi/.
Dieses Prinzip kann man auch verwenden, um die URL-Anforderung auf eine bestimmte Seite zu leiten:
RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?impuscatura.ro$ RewriteRule ^(/)?$ wpi/index.php [L]
Gesucht wird in der URL wieder nach dem Pattern www.impuscatura.ro oder impuscatura.ro. Wird es gefunden, dann wird es zu www.impuscatura.ro/wpi/index.php bzw. impuscatura.ro/wpi/index.php.
www oder kein www
Für Suchmaschinen ist es sinnvoll, sich auf eine Version des Domainnamens entweder mit oder ohne www zu einigen. Ich bevorzuge inzwischen die Version ohne www und notiere daher:
RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?impuscatura\.ro$ [NC] RewriteRule ^(.*)$ https://impuscatura.ro/wp/\ [R=301,L]
Bei einer Umleitung [R=301,L] wird ein „R“edirect mit HTTP-Code 301 (dauerhaft weitergeleitet) signalisiert und „L“ast führt dazu, dass keine weiter folgenden Anweisungen aus der .htaccess mehr ausgeführt werden. Die Option [NC] ist das Flag für NoCase, wodurch nicht mehr zwischen Groß- und Kleinschreibung unterschieden wird.
Domainumzug
Dauerhafte Weiterleitungen sind besonders dann sinnvoll, wenn man eine Domain umzieht und (was sicher sehr selten vorkommt) seinen Domain-Namen wechselt. Dann leitet man zum neuen Ziel mit HTTP-Code 301 um.
RewriteEngine On RewriteCond %{REQUEST_URI} !wp-admin/ RewriteCond %{REQUEST_URI} !wp-login\.php RewriteCond %{HTTP_HOST} ^thomas-hupfer.de [NC,OR] RewriteCond %{HTTP_HOST} ^www.thomas-hupfer.de [NC] RewriteRule ^(.*)$ https://impuscatura.ro/wp/\ [R=301,L]
Mit den ersten zwei Bedingungen habe ich mir die Möglichkeit offen gelassen, das Backend von WordPress auf der alten Domain noch zu erreichen. Die letzten beiden Bedingungen werden mit einem logischen oder [OR] verknüpft. Wird thomas-hupfer.de oder www.thomas-hupfer.de gefunden, wird zu https://impuscatura.ro/wp umgeleitet.
Mehr?
Ich hoffe, diese kleine Einführung hat geholfen, ein Grundverständnis für die Funktion der RegEx und deren Anwendung in .htaccess-Dateien zu vermitteln. Reguläre Ausdrücke sind aber noch weit mächtiger, so dass ich demnächst einen weiteren Teil hier posten werde, der tiefer in die Materie geht.
Derweil -> hier noch ein interessanter Link zu Regular Expressions 🙂 und wer seine .htaccess testen möchte, findet -> hier Hilfe.
Ähnliche Beiträge:
-> Lokale installation von WordPress
-> Wenn Bilder bei Twittercards fehlen