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.
AlleRewriteRuleshalten sich an das folgende Format:
Allgemeine RewriteRule-Struktur
RewriteRule pattern substitution [flags]
-
RewriteRulegibt die Direktive an. -
patternist einregular expression, das der gewünschten Zeichenfolge aus der URL entspricht, die der Viewer im Browser eingibt. -
substitutionist der Pfad zur tatsächlichen URL, d.h. der Pfad der Datei Apache-Server. -
flagssind 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 markiertenRewriteRulehinzu 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. -
aboutentspricht der Zeichenfolge "about". -
about.htmlist 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/aboutaufgrund 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 nachaboutunter Verwendung des Zeichens$möglicherweise nichts mehr vorhanden ist. -
http://your_server_ip/contact, da es nicht mit der Zeichenfolgeaboutin 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 DirektiveRewriteCondkönnen wir unseren Umschreiberegeln Bedingungen hinzufügen, um zu steuern, wann die Regeln verarbeitet werden. AlleRewriteCondshaben das folgende Format:
Allgemeine RewriteCond-Struktur
RewriteCond TestString Condition [Flags]
-
RewriteCondgibt die DirektiveRewriteCondan. -
TestStringist die Zeichenfolge, gegen die getestet werden soll. -
Conditionist das Muster oder die Bedingung, die übereinstimmen sollen. -
Flagssind 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. -
-fist 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!-fnur dann den Wert true, wenn ein angegebener Name nicht vorhanden ist oder keine Datei ist. -
In ähnlicher Weise wird
!-dnur 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 DirektiveRewriteRuleURLs umleiten, auch solche mit Abfragezeichenfolgen. Sie haben auch gelernt, wie Sie URLs mithilfe der AnweisungRewriteCondbedingt umleiten.
Wenn Sie mehr übermod_rewrite erfahren möchten, schauen Sie sichApache’s mod_rewrite Introduction undApache’s official documentation for mod_rewrite an.