Wenn ein Benutzer eine bestimmte URL in einen Browser eingibt und die Eingabetaste drückt, versucht der Webserver, der die Anfrage erhält, eine Datei auf dem Server unter dem in der URL angegebenen Pfad zu finden. Wird nichts entlang des Pfades gefunden, wird eine Indexdatei wie index.html oder index.php geöffnet. Wird nichts gefunden, wird ein 404-Fehler zurückgegeben. Wir hätten keine schönen und leicht verständlichen URLs, wenn die Dinge nicht so funktionieren würden, wie sie es jetzt tun. Diese URLs werden auf vielen Websites verwendet. Das Apache Mod Rewrite Modul wurde entwickelt, um dieses Problem zu lösen. In diesem Tutorial werden wir sehen, wie man es aktiviert.
Wenn alles wie beschrieben funktionieren würde, müsste beim Öffnen eines beliebigen Links dieser Website im Stammverzeichnis eine Datei oder ein Skript mit demselben Namen in der Adressleiste erscheinen. Das ist aber nicht der Fall. Bei der Anforderung dieser URL versucht der Webserver, eine solche Datei zu finden, aber wenn er sie nicht findet, gibt er keinen 404-Fehler zurück, sondern übergibt die Kontrolle an das Modul mod_rewrite, das bei allen solchen URLs das Skript index.php ausführt und ihm den Abfrage-String nach der Domain übergibt. PHP verwendet dann diese Daten, um die vom Benutzer gewünschte Seite zu finden und zurückzugeben.
Um mod rewrite zu aktivieren, führen Sie einen einfachen Befehl aus:
$ sudo a2enmod rewrite
Nach dem Neustart des Webservers:
$ sudo systemctl restart apache
Nur weil das Modul auf der Ebene des Apache-Webservers aktiviert ist, heißt das nicht, dass es auch für eine Website funktioniert. Zu diesem Zweck muss es in der .htaccess-Datei konfiguriert werden, um anzugeben, an welches Skript Anfragen an nicht existierende Seiten weitergeleitet werden sollen. Damit die .htaccess-Datei funktioniert, muss die Direktive AllowOwerride: All
zum Abschnitt Directory des virtuellen Hosts hinzugefügt werden
Ein Beispiel:
Als Nächstes müssen Sie zum Beispiel in WordPress Zeilen wie diese zur .htaccess-Datei hinzufügen:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Der gesamte Code wird in der IfModule-Direktive platziert, so dass der darin enthaltene Code nur ausgeführt wird, wenn das Modul mod_rewrite aktiviert ist; andernfalls werden diese Zeilen einfach ignoriert. Die Anweisung RewriteEngine On aktiviert das Modul für das aktuelle Verzeichnis. Dann gibt RewriteBase an, dass die gesamte Zeichenkette nach der Domain an das Skript übergeben werden soll. Danach folgen RwriteRule-Regeln mit Bedingungen für RewriteCond, die streng sequentiell ausgeführt werden.
Eine der RewriteRule-Regeln ^index .php$ - [L]
besagt, dass die URL nach / umgeschrieben werden soll, wenn sie index.php enthält. In diesem regulären Ausdruck wird die gesamte Zeichenfolge angegeben und der Punkt mit einem Backslash maskiert. Das [L]
-Flag bedeutet, dass die URL dieser Regel entspricht und die folgenden Regeln nicht überprüft werden sollen. Nachdem diese Regel ausgeführt wurde, wird die URL umgeschrieben und der Webserver geht davon aus, dass er die Anfrage / erhalten hat, die Regelanalyse beginnt erneut, und dieses Mal wird sie mit der letzten Regel übereinstimmen.
Die RewriteCond-Bedingungen gelten für alle nachfolgenden Regeln. RewriteCond %{REQUEST_FILENAME} !-f
und RewriteCond %{REQUEST_FILENAME} !-d
sorgen dafür, dass die letzte Regel nur ausgeführt wird, wenn die URL keine Datei oder kein Ordner ist. Die letzte Regel leitet alles auf das Skript ./index.php um.
Wenn Sie die mod_rewrite-Einstellungen nicht verstehen, lohnt es sich, nachzusehen, was im Webserver während der Umleitungen vor sich geht. Dazu müssen Sie in der Konfiguration des virtuellen Hosts der Website diese Zeile hinzufügen.
Zum Beispiel:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
In der Protokolldatei, die in der ErrorLog-Direktive angegeben ist, sehen Sie dann alle Versuche des Webservers, die URL gemäß Ihren Regeln umzuwandeln, und können verstehen, was Sie falsch machen. In diesem Tutorial haben wir uns damit beschäftigt, wie man Apache mod rewrite aktiviert, wie das Ganze funktioniert und wie man nach Fehlern sucht.