Rewrite für WordPress in der .htaccess

Regular Expressions

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/$1

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/$1 [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/$1 [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

Buy Me a Coffee at ko-fi.com

You May Also Like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Aus persönlichen Gründen...

... kann ich den Blog im Moment leider nicht wie gewohnt betreuen und Anfragen zeitnah beantworten. Lediglich die technische Funktionalität versuche ich aufrecht zu erhalten. Sollte es trotzdem was Neues hier geben, dann schreibe ich eine Info in die Telegram-Gruppe.


In der Telegram-Gruppe können Sie sich weiterhin mit anderen Lesern von Împuşcătura austauschen.

Zur Telegram-Gruppe