Einführung
In diesem Tutorial werden wir aktivieren und lernen, wie URL-Umschreibungen mit demmod_rewrite
-Modul von Apache 2 verwaltet werden. Mit diesem Modul können wir URLs auf eine übersichtlichere Weise umschreiben, lesbare Pfade in codefreundliche Abfragezeichenfolgen umwandeln oder URLs basierend auf zusätzlichen Bedingungen umleiten.
Dieser Leitfaden besteht aus zwei Teilen. Der erste Abschnitt richtet eine Beispielwebsite ein und behandelt ein einfaches Umschreibebeispiel. Der zweite Teil enthält zwei ausführlichere Beispiele für häufig verwendete Umschreibregeln.
Voraussetzungen
Um diesem Tutorial zu folgen, benötigen Sie:
-
Ein Ubuntu 16.04-Server, der mitthis initial server setup tutorial eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Apache 2 wird auf Ihrem Server installiert, indem Sie Schritt 1 vonHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04 ausführen.
[[Schritt-1 -—- Aktivieren von mod_rewrite]] == Schritt 1 - Aktivieren von mod_rewrite
Zuerst müssen wirmod_rewrite
aktivieren. Es ist verfügbar, aber bei einer sauberen Apache 2-Installation nicht aktiviert.
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.
Wir müssen noch ein paar Einstellungen einrichten und sichern, bevor wir beginnen können.
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 die Datei.htaccess
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 zum Code umwandelt. Insbesondere erlauben wir Benutzern den Zugriff aufhttp://your_server_ip/about
.
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. Wenn Sie möchten, dass Benutzer stattdessen mitabout
auf die Seite zugreifen, ermöglichen Umschreiberegeln genau diese Funktionalität.
AlleRewriteRules
halten sich an das folgende 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.
Ö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.
Jetzt sollten Sie in Ihrem Browser aufhttp://your_server_ip/about
zugreifen können. 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 nicht:
-
http://your_server_ip/about/
, da die Regel explizit besagt, dass nachabout
unter Verwendung des Zeichens$
möglicherweise nichts mehr vorhanden ist. -
http://your_server_ip/contact
, da es nicht mit der Zeichenfolgeabout
in der Regel übereinstimmt.
Sie haben jetzt eine operative.htaccess
-Datei mit einer einfachen Regel, 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
mod_rewrite
ist ein nützliches Apache-Modul, mit dem effektiv lesbare URLs sichergestellt werden können. 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.