Um zu verstehen, was mod_rewrite tut, müssen Sie zuerst verstehen, wie ein Webserver funktioniert. Ein Webserver antwortet auf HTTP-Anfragen . Eine HTTP-Anfrage auf ihrer grundlegendsten Ebene sieht folgendermaßen aus:
GET /foo/bar.html HTTP/1.1
Dies ist die einfache Anforderung eines Browsers an einen Webserver, der die URL /foo/bar.html
von diesem anfordert . Es ist wichtig zu betonen, dass keine Datei angefordert wird , sondern nur eine beliebige URL. Die Anfrage kann auch so aussehen:
GET /foo/bar?baz=42 HTTP/1.1
Dies ist eine ebenso gültige Anfrage nach einer URL und hat offensichtlich nichts mit Dateien zu tun.
Der Webserver ist eine Anwendung, die einen Port überwacht, HTTP-Anforderungen akzeptiert, die an diesem Port eingehen, und eine Antwort zurückgibt. Es steht einem Webserver völlig frei, auf jede Anfrage so zu antworten, wie er es für richtig hält oder wie Sie sie für die Beantwortung konfiguriert haben. Diese Antwort ist keine Datei, sondern eine HTTP-Antwort, die möglicherweise nichts mit physischen Dateien auf einer Festplatte zu tun hat. Ein Webserver muss nicht Apache sein, es gibt viele andere Webserver, bei denen es sich ausschließlich um Programme handelt, die dauerhaft ausgeführt werden und an einen Port angeschlossen sind, der auf HTTP-Anforderungen reagiert. Sie können selbst eine schreiben. Dieser Absatz sollte Sie von jeder Vorstellung trennen, dass URLs direkt Dateien entsprechen, was wirklich wichtig ist, um sie zu verstehen. :) :)
Die Standardkonfiguration der meisten Webserver besteht darin, nach einer Datei zu suchen, die der URL auf der Festplatte entspricht. Wenn das Dokumentstammverzeichnis des Servers beispielsweise auf "festgelegt" ist /var/www
, wird möglicherweise geprüft, ob die Datei /var/www/foo/bar.html
vorhanden ist, und in diesem Fall bereitgestellt . Wenn die Datei endet in „.php“ wird es den PHP - Interpreter aufrufen und dann das Ergebnis zurück. All diese Zuordnungen sind vollständig konfigurierbar. Eine Datei muss nicht mit ".php" enden, damit der Webserver sie über den PHP-Interpreter ausführen kann, und die URL muss nicht mit einer bestimmten Datei auf der Festplatte übereinstimmen, damit etwas passiert.
mod_rewrite ist eine Möglichkeit, die interne Anforderungsbearbeitung neu zu schreiben . Wenn der Webserver eine Anforderung für die URL erhält /foo/bar
, können Sie diese URL in eine andere URL umschreiben , bevor der Webserver nach einer passenden Datei auf der Festplatte sucht. Einfaches Beispiel:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Diese Regel besagt, dass eine Anfrage , wenn sie mit "/ foo / bar" übereinstimmt, in "/ foo / baz" umgeschrieben wird. Die Anfrage wird dann so behandelt, als wäre /foo/baz
sie stattdessen angefordert worden. Dies kann für verschiedene Effekte verwendet werden, zum Beispiel:
RewriteRule (.*) $1.html
Diese Regel stimmt mit any ( .*
) überein, erfasst es ( (..)
) und schreibt es dann neu, um ".html" anzuhängen. Mit anderen Worten, wenn /foo/bar
die angeforderte URL war, wird sie so behandelt, als ob /foo/bar.html
sie angefordert worden wäre. Weitere Informationen zum Abgleichen, Erfassen und Ersetzen regulärer Ausdrücke finden Sie unter http://regular-expressions.info .
Eine andere häufig anzutreffende Regel lautet:
RewriteRule (.*) index.php?url=$1
Dies stimmt wiederum mit allem überein und schreibt es in die Datei index.php mit der ursprünglich angeforderten URL, die im url
Abfrageparameter angehängt ist. Das heißt, für alle eingehenden Anforderungen wird die Datei index.php ausgeführt, und diese Datei hat Zugriff auf die ursprüngliche Anforderung in $_GET['url']
, sodass sie damit alles tun kann, was sie will.
In erster Linie fügen Sie diese Umschreiberegeln in Ihre Webserver-Konfigurationsdatei ein . Mit Apache * können Sie sie auch in eine Datei .htaccess
einfügen, die in Ihrem Dokumentstamm aufgerufen wird (dh neben Ihren .php-Dateien).
* Wenn von der primären Apache-Konfigurationsdatei zugelassen; Es ist optional, aber oft aktiviert.
Was mod_rewrite nicht macht
mod_rewrite macht nicht alle Ihre URLs auf magische Weise "hübsch". Dies ist ein häufiges Missverständnis. Wenn Sie diesen Link auf Ihrer Website haben:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
Es gibt nichts, was mod_rewrite tun kann, um das hübsch zu machen. Um dies zu einem hübschen Link zu machen, müssen Sie:
Ändern Sie den Link in einen hübschen Link:
<a href="https://stackoverflow.com/my/pretty/link">
Verwenden Sie mod_rewrite auf dem Server, um die Anforderung an die URL /my/pretty/link
mit einer der oben beschriebenen Methoden zu verarbeiten.
(Man könnte mod_substitute
in Verbindung verwenden, um ausgehende HTML-Seiten und ihre enthaltenen Links zu transformieren. Dies ist jedoch normalerweise mehr Aufwand als nur das Aktualisieren Ihrer HTML-Ressourcen.)
Es gibt viel, was mod_rewrite tun kann, und sehr komplexe Übereinstimmungsregeln, die Sie erstellen können, einschließlich der Verkettung mehrerer Umschreibungen, der Weiterleitung von Anforderungen an einen völlig anderen Dienst oder Computer, der Rückgabe bestimmter HTTP-Statuscodes als Antworten, der Umleitung von Anforderungen usw. Es ist sehr leistungsfähig und kann verwendet werden Sehr gut, wenn Sie den grundlegenden HTTP-Anforderungs-Antwort-Mechanismus verstehen. Es macht Ihre Links nicht automatisch hübsch.
In der offiziellen Dokumentation finden Sie alle möglichen Flags und Optionen.