Einführung
Mit demmod_rewrite
-Modul von Apache können Sie URLs sauberer umschreiben und von Menschen lesbare Pfade in codefreundliche Abfragezeichenfolgen übersetzen. Außerdem können Sie URLs basierend auf Bedingungen neu schreiben.
Mit einer.htaccess
-Datei können Sie Umschreiberegeln erstellen und anwenden, ohne auf Serverkonfigurationsdateien zuzugreifen. Durch Platzieren der.htaccess
-Datei im Stammverzeichnis Ihrer Website können Sie das Umschreiben pro Site oder pro Verzeichnis verwalten.
In diesem Lernprogramm aktivieren Siemod_rewrite
und verwenden.htaccess
-Dateien, um eine grundlegende URL-Umleitung zu erstellen, und untersuchen dann einige erweiterte Anwendungsfälle.
Voraussetzungen
Um diesem Tutorial zu folgen, benötigen Sie:
-
Ein Ubuntu 18.04-Server, der gemäß denUbuntu 18.04 initial server setup guide eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Apache wird gemäß Schritt 1 vonHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04 installiert.
[[Schritt-1 -—- Aktivieren von mod_rewrite]] == Schritt 1 - Aktivieren von mod_rewrite
Damit Apache die Umschreiberegeln versteht, müssen wir zuerstmod_rewrite
aktivieren. Es ist bereits installiert, in einer Apache-Standardinstallation jedoch deaktiviert. Verwenden Sie den Befehla2enmod
, um das Modul zu aktivieren:
sudo a2enmod rewrite
Dadurch wird das Modul aktiviert oder Sie werden benachrichtigt, dass das Modul bereits aktiviert ist. Starten Sie Apache neu, damit diese Änderungen wirksam werden.
sudo systemctl restart apache2
mod_rewrite
ist jetzt vollständig aktiviert. Im nächsten Schritt richten wir eine.htaccess
-Datei ein, mit der wir Umschreiberegeln für Weiterleitungen definieren.
[[Schritt-2 - Einrichten von htaccess]] == Schritt 2 - Einrichten von .htaccess
Mit einer.htaccess
-Datei können wir unsere Umschreiberegeln ändern, ohne auf Serverkonfigurationsdateien zugreifen zu müssen. Aus diesem Grund ist.htaccess
für die Sicherheit Ihrer Webanwendung von entscheidender Bedeutung. Der Punkt vor dem Dateinamen stellt sicher, dass die Datei ausgeblendet ist.
[.Hinweis]##
Note: Alle Regeln, die Sie in eine.htaccess
-Datei einfügen können, können auch direkt in Serverkonfigurationsdateien eingefügt werden. Tatsächlich empfiehltofficial Apache documentation die Verwendung von Serverkonfigurationsdateien anstelle von.htaccess
, da Apache diese auf diese Weise schneller verarbeitet.
In diesem einfachen Beispiel ist die Leistungssteigerung jedoch vernachlässigbar. Darüber hinaus ist das Festlegen von Regeln in.htaccess
praktisch, insbesondere bei mehreren Websites auf demselben Server. Es ist kein Neustart des Servers erforderlich, damit die Änderungen wirksam werden, und es sind keine Root-Berechtigungen zum Bearbeiten dieser Regeln erforderlich, um die Wartung zu vereinfachen und Änderungen mit einem nicht privilegierten Konto zu ermöglichen. Einige beliebte Open-Source-Softwareprodukte wie Wordpress und Joomla verwenden häufig eine.htaccess
-Datei, damit die Software bei Bedarf zusätzliche Regeln ändern und erstellen kann.
Bevor Sie.htaccess
-Dateien verwenden, müssen Sie einige weitere Einstellungen einrichten und sichern.
Standardmäßig verbietet Apache die Verwendung einer.htaccess
-Datei zum Anwenden von Umschreiberegeln. Daher müssen Sie zuerst Änderungen an der Datei zulassen. Öffnen Sie die Standard-Apache-Konfigurationsdatei mitnano
oder Ihrem bevorzugten Texteditor.
sudo nano /etc/apache2/sites-available/000-default.conf
In dieser Datei befindet sich in der ersten Zeile ein<VirtualHost *:80>
-Block. Fügen Sie in diesem Block den folgenden neuen Block hinzu, damit Ihre Konfigurationsdatei wie folgt aussieht. Stellen Sie sicher, dass alle Blöcke richtig eingerückt sind.
/etc/apache2/sites-available/000-default.conf
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
. . .
Speichern und schließen Sie die Datei. Starten Sie Apache neu, damit diese Änderungen wirksam werden.
sudo systemctl restart apache2
Erstellen Sie nun eine.htaccess
-Datei im Webstamm.
sudo nano /var/www/html/.htaccess
Fügen Sie diese Zeile oben in die neue Datei ein, um die Rewrite-Engine zu aktivieren.
/var/www/html/.htaccess
RewriteEngine on
Speichern Sie die Datei und beenden Sie sie.
Sie haben jetzt eine betriebsbereite.htaccess
-Datei, mit der Sie die Routing-Regeln Ihrer Webanwendung steuern können. Im nächsten Schritt erstellen wir Beispiel-Website-Dateien, anhand derer wir Umschreibregeln demonstrieren.
[[Schritt-3 - Konfigurieren von URL-Umschreibungen]] == Schritt 3 - Konfigurieren von URL-Umschreibungen
Hier richten wir eine grundlegende URL-Umschreibung ein, die hübsche URLs in tatsächliche Pfade zu Seiten konvertiert. Insbesondere erlauben wir Benutzern den Zugriff aufhttp://your_server_ip/about
, zeigen jedoch eine Seite mit dem Namenabout.html
an.
Erstellen Sie zunächst eine Datei mit dem Namenabout.html
im Webstamm.
sudo nano /var/www/html/about.html
Kopieren Sie den folgenden HTML-Code in die Datei, speichern und schließen Sie sie.
/var/www/html/about.html
About Us
About Us
Sie können unterhttp://your_server_ip/about.html
auf diese Seite zugreifen. Beachten Sie jedoch, dass beim Versuch, aufhttp://your_server_ip/about
zuzugreifen, ein404 Not Found-Fehler angezeigt wird. Um stattdessen mit/about
auf die Seite zuzugreifen, erstellen wir eine Umschreiberegel.
AlleRewriteRules
folgen diesem Format:
Allgemeine RewriteRule-Struktur
RewriteRule pattern substitution [flags]
-
RewriteRule
gibt die Direktive an. -
pattern
ist einregular expression, das der gewünschten Zeichenfolge aus der URL entspricht, die der Viewer im Browser eingibt. -
substitution
ist der Pfad zur tatsächlichen URL, d.h. der Pfad der Datei Apache-Server. -
flags
sind optionale Parameter, mit denen die Funktionsweise der Regel geändert werden kann.
Erstellen wir unsere Regel zum Umschreiben von URLs. Öffnen Sie die Datei.htaccess
.
sudo nano /var/www/html/.htaccess
Fügen Sie nach der ersten Zeile die rot markiertenRewriteRule
hinzu und speichern Sie die Datei.
/var/www/html/.htaccess
RewriteEngine on
RewriteRule ^about$ about.html [NC]
In diesem Fall ist^about$
das Muster,about.html
ist die Substitution und[NC]
ist ein Flag. In unserem Beispiel werden einige Zeichen mit besonderer Bedeutung verwendet:
-
^
gibt den Beginn der URL nachyour_server_ip/
an. -
$
gibt das Ende der URL an. -
about
entspricht der Zeichenfolge "about". -
about.html
ist die tatsächliche Datei, auf die der Benutzer zugreift. -
[NC]
ist ein Flag, das die Groß- und Kleinschreibung der Regel nicht berücksichtigt.
Sie können jetzt in Ihrem Browser aufhttp://your_server_ip/about
zugreifen. Mit der oben gezeigten Regel verweisen die folgenden URLs aufabout.html
:
-
http://your_server_ip/about
aufgrund der Regeldefinition. -
http://your_server_ip/About
, da bei der Regel die Groß- und Kleinschreibung nicht berücksichtigt wird. -
http://your_server_ip/about.html
, da der ursprüngliche Dateiname immer funktioniert.
Folgendes wird jedoch nicht funktionieren:
-
http://your_server_ip/about/
, da die Regel ausdrücklich besagt, dass nachabout
möglicherweise nichts mehr vorhanden ist, da das Zeichen$
nachabout
angezeigt wird. -
http://your_server_ip/contact
, da es nicht mit der Zeichenfolgeabout
in der Regel übereinstimmt.
Sie haben jetzt eine operative.htaccess
-Datei mit einer Grundregel, die Sie ändern und an Ihre Bedürfnisse anpassen können. In den folgenden Abschnitten werden zwei weitere Beispiele für häufig verwendete Anweisungen gezeigt.
[[Beispiel-1 - Vereinfachung von Abfragezeichenfolgen mit Umschreibung]] == Beispiel 1 - Vereinfachung von Abfragezeichenfolgen mit RewriteRule
Webanwendungen verwenden häufigquery strings, die mit einem Fragezeichen (?
) nach der Adresse an eine URL angehängt werden. Separate Parameter werden durch ein kaufmännisches Und (&
) begrenzt. Abfragezeichenfolgen können verwendet werden, um zusätzliche Daten zwischen einzelnen Anwendungsseiten zu übertragen.
Beispielsweise kann eine in PHP geschriebene Suchergebnisseite eine URL wiehttp://example.com/results.php?item=shirt&season=summer
verwenden. In diesem Beispiel werden zwei zusätzliche Parameter an das Anwendungsskript des imaginärenresult.php
übergeben:item
mit dem Wertshirt
undseason
mit dem Wertsummer
. Die Anwendung verwendet möglicherweise die Abfragezeichenfolgeninformationen, um die richtige Seite für den Besucher zu erstellen.
Apache-Umschreiberegeln werden häufig verwendet, um so lange und unangenehme Links wie die oben genannten infriendly URLszu vereinfachen, die einfacher zu tippen und visuell zu interpretieren sind. In diesem Beispiel möchten wir den obigen Link vereinfachen, umhttp://example.com/shirt/summer
zu werden. Die Parameterwerteshirt
undsummer
befinden sich weiterhin in der Adresse, jedoch ohne die Abfragezeichenfolge und den Skriptnamen.
Hier ist eine Regel, um dies zu implementieren:
Einfache Ersetzung
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
shirt/summer
wird explizit in der angeforderten Adresse abgeglichen, und Apache wird angewiesen, stattdessenresults.php?item=shirt&season=summer
zu bedienen.
Die Flags[QSA]
werden häufig in Umschreiberegeln verwendet. Sie weisen Apache an, eine zusätzliche Abfragezeichenfolge an die bereitgestellte URL anzuhängen. Wenn der Besucher alsohttp://example.com/shirt/summer?page=2
eingibt, antwortet der Server mitresults.php?item=shirt&season=summer&page=2
. Ohne diese würde die zusätzliche Abfragezeichenfolge verworfen.
Während diese Methode den gewünschten Effekt erzielt, sind sowohl der Elementname als auch die Jahreszeit in der Regel fest codiert. Dies bedeutet, dass die Regel nicht für andere Elemente wiepants
oder Jahreszeiten wiewinter
funktioniert.
Um die Regel allgemeiner zu gestalten, können wirregular expressions verwenden, um Teile der ursprünglichen Adresse abzugleichen und diese Teile in einem Substitutionsmuster zu verwenden. Die geänderte Regel sieht dann folgendermaßen aus:
Einfache Ersetzung
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
Die erste Gruppe mit regulären Ausdrücken in Klammern stimmt mit einer Zeichenfolge überein, die alphanumerische Zeichen und Zahlen wieshirt
oderpants
enthält, und speichert das übereinstimmende Fragment als Variable$1
. Die zweite reguläre Expressionsgruppe in Klammern entspricht genausummer
,winter
,fall
oderspring
und speichert das übereinstimmende Fragment auf ähnliche Weise als$2
.
Die übereinstimmenden Fragmente werden dann in der resultierenden URL initem
- undseason
-Variablen anstelle der zuvor verwendeten fest codiertenshirt
- undsummer
-Werte verwendet.
Das Obige konvertiert zum Beispielhttp://example.com/pants/summer
inhttp://example.com/results.php?item=pants&season=summer
. Dieses Beispiel ist auch zukunftssicher, sodass mehrere Elemente und Jahreszeiten mit einer einzigen Regel korrekt umgeschrieben werden können.
[[Beispiel-2 - Hinzufügen von Bedingungen mit Logik unter Verwendung von Umschreibeconds]] == Beispiel 2 - Hinzufügen von Bedingungen mit Logik unter Verwendung von RewriteConds
Rewrite-Regeln werden nicht immer ohne Einschränkungen einzeln ausgewertet. Mit der DirektiveRewriteCond
können wir unseren Umschreiberegeln Bedingungen hinzufügen, um zu steuern, wann die Regeln verarbeitet werden. AlleRewriteConds
haben das folgende Format:
Allgemeine RewriteCond-Struktur
RewriteCond TestString Condition [Flags]
-
RewriteCond
gibt die DirektiveRewriteCond
an. -
TestString
ist die Zeichenfolge, gegen die getestet werden soll. -
Condition
ist das Muster oder die Bedingung, die übereinstimmen sollen. -
Flags
sind optionale Parameter, die die Bedingungs- und Bewertungsregeln ändern können.
Wenn einRewriteCond
als wahr ausgewertet wird, werden die unmittelbar folgendenRewriteRule
berücksichtigt. Wenn dies nicht der Fall ist, wird die Regel verworfen. MehrereRewriteCond
können nacheinander verwendet werden, und bei Standardverhalten müssen alle als wahr ausgewertet werden, damit die folgende Regel berücksichtigt wird.
Nehmen wir beispielsweise an, Sie möchten alle Anforderungen an nicht vorhandene Dateien oder Verzeichnisse auf Ihrer Site zurück zur Startseite umleiten, anstatt die Standardfehlerseite von404 Not Foundanzuzeigen. Dies kann mit folgenden Bedingungsregeln erreicht werden:
Leiten Sie alle Anforderungen an nicht vorhandene Dateien und Verzeichnisse zur Homepage um
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /
Mit dem oben genannten:
-
%{REQUEST_FILENAME}
ist die zu überprüfende Zeichenfolge. In diesem Fall ist es der angeforderte Dateiname, eine Systemvariable, die für jede Anforderung verfügbar ist. -
-f
ist eine integrierte Bedingung, die überprüft, ob der angeforderte Name auf der Festplatte vorhanden ist und eine Datei ist.!
ist ein Negationsoperator. In Kombination ergibt!-f
nur dann den Wert true, wenn ein angegebener Name nicht vorhanden ist oder keine Datei ist. -
In ähnlicher Weise wird
!-d
nur dann als wahr ausgewertet, wenn ein angegebener Name nicht existiert oder kein Verzeichnis ist.
DieRewriteRule
in der letzten Zeile werden nur für Anforderungen an nicht vorhandene Dateien oder Verzeichnisse wirksam. DasRewriteRule
selbst ist sehr einfach und leitet jede Anfrage an das Website-Stammverzeichnis des/
weiter.
Fazit
Mitmod_rewrite
können Sie lesbare URLs erstellen. In diesem Lernprogramm haben Sie gelernt, wie Sie mit der DirektiveRewriteRule
URLs umleiten, auch solche mit Abfragezeichenfolgen. Sie haben auch gelernt, wie Sie URLs mithilfe der AnweisungRewriteCond
bedingt umleiten.
Wenn Sie mehr übermod_rewrite
erfahren möchten, schauen Sie sichApache’s mod_rewrite Introduction undApache’s official documentation for mod_rewrite an.