Umschreiben von URLs mit mod_rewrite für Apache unter Ubuntu 18.04

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:

[[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.

AlleRewriteRulesfolgen 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 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.

  • 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 Zeichenfolgeaboutin 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 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]
  • 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 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.