Einrichten von mod_rewrite für Apache unter Ubuntu 14.04

Einführung

In diesem Tutorial werden wir aktivieren und lernen, wie URL-Umschreibungen mit dem + mod_rewrite + - Modul von Apache2 verwaltet werden. Mit diesem Tool können wir URLs übersichtlicher umschreiben und lesbare Pfade in codefreundliche Abfragezeichenfolgen umwandeln.

Dieses Handbuch ist in zwei Hälften unterteilt: Die erste enthält eine Beispielwebanwendung und die zweite enthält Erläuterungen zu häufig verwendeten Umschreibregeln.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 - Installieren von Apache

In diesem Schritt verwenden wir ein eingebautes Paketinstallationsprogramm mit dem Namen "+ apt-get". Es vereinfacht die Verwaltung drastisch und erleichtert eine saubere Installation.

Aktualisieren Sie zunächst den Paketindex des Systems. Dadurch wird sichergestellt, dass alte oder veraltete Pakete die Installation nicht beeinträchtigen.

sudo apt-get update

Apache2 ist der oben genannte HTTP-Server und der weltweit am häufigsten verwendete. Führen Sie zum Installieren Folgendes aus:

sudo apt-get install apache2

Informationen zu den Unterschieden zwischen Nginx und Apache2, den beiden beliebtesten Open-Source-Webservern, finden Sie unter this article.

Schritt 2 - Aktivieren von mod_rewrite

Jetzt müssen wir + mod_rewrite + aktivieren.

sudo a2enmod rewrite

Dadurch wird das Modul aktiviert oder Sie werden benachrichtigt, dass das Modul bereits aktiv ist. Starten Sie Apache neu, damit diese Änderungen wirksam werden.

sudo service apache2 restart

Schritt 3 - Einrichten von .htaccess

In diesem Abschnitt richten wir eine + .htaccess + - Datei ein, um die Verwaltung von Umschreiberegeln zu vereinfachen.

Mit einer "+ .htaccess " - Datei können wir unsere Umschreibregeln ändern, ohne auf Serverkonfigurationsdateien zugreifen zu müssen. Aus diesem Grund ist " .htaccess" für die Sicherheit Ihrer Webanwendungen von entscheidender Bedeutung. Der Punkt vor dem Dateinamen stellt sicher, dass die Datei ausgeblendet ist.

Wir müssen noch ein paar Einstellungen einrichten und sichern, bevor wir beginnen können.

Erlauben Sie zunächst Änderungen in der Datei "+ .htaccess". Öffnen Sie die Apache-Standardkonfigurationsdatei mit "+ nano +" oder Ihrem bevorzugten Texteditor.

sudo nano /etc/apache2/sites-enabled/000-default.conf

In dieser Datei finden Sie den Block + <VirtualHost *: 80> + in Zeile 1. Fügen Sie in diesem Block den folgenden Block hinzu:

/etc/apache2/sites-available/default<Directory /var/www/html>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride All
               Order allow,deny
               allow from all
</Directory>

Ihre Datei sollte jetzt mit den folgenden übereinstimmen. Stellen Sie sicher, dass alle Blöcke richtig eingerückt sind.

/etc/apache2/sites-available/default<VirtualHost *:80>
   <Directory /var/www/html>

       . . .

   </Directory>

   . . .
</VirtualHost>

Starten Sie Apache neu, damit diese Änderungen wirksam werden.

sudo service apache2 restart

Erstellen Sie nun die Datei "+ .htaccess".

sudo nano /var/www/html/.htaccess

Fügen Sie diese erste Zeile oben in die neue Datei ein, um die + RewriteEngine + zu aktivieren.

/var/www/html/.htaccessRewriteEngine on

Speichern und schließen Sie die Datei.

Führen Sie den folgenden Befehl aus, um sicherzustellen, dass andere Benutzer nur Ihr "+ .htaccess +" lesen können, um die Berechtigungen zu aktualisieren.

sudo chmod 644 /var/www/html/.htaccess

Sie haben jetzt eine funktionsfähige "+ .htaccess" -Datei, mit der Sie die Routing-Regeln für Ihre Webanwendungen festlegen können.

Schritt 4 - Einrichten von Dateien

In diesem Abschnitt richten wir eine grundlegende URL-Umschreibung ein, mit der hübsche URLs in tatsächliche Codepfade konvertiert werden. Insbesondere werden wir Benutzern erlauben, auf "+ / about +" zuzugreifen.

Zunächst erstellen wir eine Datei mit dem Namen "+ about.html".

sudo nano /var/www/html/about.html

Kopieren Sie den folgenden Code in die HTML-Seite.

/var/www/html/about.html<html>
   <head>
       <title>About Us</title>
   </head>
   <body>
       <h1>About Us</h1>
   </body>
</html>

Sie können unter "+ / about.html" oder "+ / about.html" auf Ihre Webanwendung zugreifen. Beachten Sie nun, dass nur auf "+ about.html" zugegriffen werden kann. Wenn Sie versuchen, auf "+ / about" zuzugreifen, wird der Fehler "Not Found" angezeigt. Wir möchten, dass Benutzer stattdessen auf "+ about +" zugreifen. Unsere Umschreiberegeln ermöglichen genau diese Funktionalität.

Öffnen Sie die Datei "+ .htaccess".

sudo nano /var/www/html/.htaccess

Fügen Sie nach der ersten Zeile Folgendes hinzu.

/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]

Ihre Datei sollte jetzt mit der folgenden identisch sein.

/var/www/html/.htaccessRewriteEngine on
RewriteRule ^about$ about.html [NC]

Herzliche Glückwünsche. Sie können jetzt auf "+ / about +" in Ihrem Browser zugreifen!

Dies ist ein gutes einfaches Beispiel, das die allgemeine Syntax zeigt, der alle Rewrite-Regeln folgen.

+ ^ about $ + ist der String, der von der URL abgeglichen wird. Das heißt, es ist das, was der Betrachter in seinem Browser eingibt. In unserem Beispiel werden einige Metacharacters verwendet.

  • + ^ + gibt den Anfang der URL an, nachdem + / + entfernt wurde.

  • + $ + zeigt das Ende der URL an

  • + about + stimmt mit der Zeichenfolge "about" überein

+ about.html + ist der tatsächliche Pfad, auf den der Benutzer zugreift. Das heißt, Apache wird weiterhin die Datei "+ about.html +" bereitstellen.

+ [NC] + ist ein flag, das die Großschreibung in der URL ignoriert.

Mit der oben gezeigten Regel verweisen die folgenden URLs auf "+ about.html":

  • + / about +

  • + / Über +

  • + / about.html

Folgendes wird nicht:

  • + / about / +

  • + / contact +

Gemeinsame Muster

In diesem Abschnitt werden einige häufig verwendete Anweisungen aufgeführt.

Ihre Webanwendung wird jetzt ausgeführt und von einer geschützten "+ .htaccess +" - Datei gesteuert. Das einfachste Beispiel wurde oben aufgenommen. In diesem Abschnitt werden zwei weitere Beispiele vorgestellt.

Sie können Beispieldateien unter den Ergebnispfaden einrichten, wenn Sie möchten. In diesem Lernprogramm werden jedoch keine HTML- und PHP-Dateien erstellt. nur die Regeln für das Umschreiben.

Beispiel 1: Vereinfachen von Abfragezeichenfolgen mit RewriteRule

Alle + RewriteRule + s haben das folgende Format:

RewriteRule pattern substitution [flags]
  • * RewriteRule *: Gibt die Direktive + RewriteRule + an

  • * pattern *: Ein regulärer Ausdruck, der der gewünschten Zeichenfolge entspricht

  • * Ersetzung *: Pfad zur eigentlichen URL

  • * flags *: optionale Parameter, mit denen die Regel geändert werden kann

Webanwendungen verwenden häufig query strings, die mit dem Fragezeichen +? + An eine URL angehängt und mit dem Et-Zeichen + & + abgegrenzt werden. Diese werden beim Abgleichen der Umschreiberegeln ignoriert. Manchmal sind jedoch Abfragezeichenfolgen erforderlich, um Daten zwischen Seiten zu übertragen. Beispielsweise kann eine in PHP geschriebene Suchergebnisseite Folgendes verwenden:

http://example.com/results.php?item=shirt&season=summer

In diesem Beispiel möchten wir dies vereinfachen, um zu werden:

http://example.com/shirt/summer
  • Beispiel 1A: Einfacher Ersatz *

Unter Verwendung einer Umschreiberegel könnten wir Folgendes verwenden:

/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

Das oben Genannte ist ziemlich selbsterklärend, da es tatsächlich "+ shirt / summer " zu " results.php? Item = shirt & season = summer +" abbildet. Dies erzielt unseren gewünschten Effekt.

  • Beispiel 1B: Übereinstimmungsoptionen *

Wir möchten dies jedoch auf alle Jahreszeiten verallgemeinern. Also werden wir Folgendes tun:

  • Geben Sie eine Reihe von Optionen mit dem Booleschen Wert "+ | +" an, was "ODER" bedeutet.

  • Gruppieren Sie die Übereinstimmung mit + () + und verweisen Sie dann mit + $ 1 + auf die Gruppe, mit + 1 + für die erste übereinstimmende Gruppe

Die Rewrite-Regel wird jetzt:

/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1

Die oben gezeigte Regel stimmt mit einer URL von "+ shirt / " überein, gefolgt von einer bestimmten Saison. Diese Staffel wird mit ` () ` gruppiert und dann mit ` $ 1 +` im nachfolgenden Pfad referenziert. Dies bedeutet zum Beispiel, dass:

http://example.com/shirt/winter

wird:

http://example.com/results.php?item=shirt&season=winter

Dadurch wird auch der gewünschte Effekt erzielt.

  • Beispiel 1C: Übereinstimmende Zeichensätze *

Wir möchten jedoch auch einen beliebigen Artikeltyp angeben, nicht nur URLs unter "+ / shirt +". Also werden wir Folgendes tun:

  • Schreiben Sie einen regelmäßigen Ausdruck, der allen alphanumerischen Zeichen entspricht. Der Klammerausdruck + [] + stimmt mit einem beliebigen Zeichen darin überein, und der Ausdruck + stimmt mit einer beliebigen Anzahl von Zeichen überein, die in Klammern angegeben sind

  • Gruppieren Sie die Übereinstimmung und referenzieren Sie sie mit "+ $ 2 +" als zweite Variable in der Datei

/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2

Das obige konvertiert zum Beispiel:

http://example.com/pants/summer

to:

http://example.com/results.php?item=pants&season=summer
  • Beispiel 1D: Übergeben von Abfragezeichenfolgen *

In diesem Abschnitt werden keine neuen Konzepte vorgestellt, sondern ein eventuell auftretendes Problem behandelt. Nehmen wir an, wir möchten im obigen Beispiel "+ http: // example.com / pants / summer " umleiten, übergeben aber eine zusätzliche Abfragezeichenfolge "? Page = 2 +". Wir möchten folgendes:

http://example.com/pants/summer?page=2

Zuordnen zu:

http://example.com/results.php?item=pants&season=summer&page=2

Wenn Sie versuchen, mit unseren aktuellen Einstellungen auf die oben angegebene URL zuzugreifen, ist die Abfragezeichenfolge "+ page = 2 " verloren gegangen. Dies lässt sich leicht mit einem zusätzlichen ` QSA +` Flag beheben. Wenn Sie die Umschreiberegel so ändern, dass sie der folgenden entspricht, wird das gewünschte Verhalten erzielt.

/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

Beispiel 2: Hinzufügen von Bedingungen mit Logik

Mit + RewriteCond können wir unseren Umschreiberegeln Bedingungen hinzufügen. Alle + RewriteCond + s haben das folgende Format:

RewriteCond TestString Condition [Flags]
  • * RewriteCond *: Gibt die Direktive + RewriteCond + an

  • * TestString *: Der String, gegen den getestet werden soll

  • * Bedingung *: das passende Muster

  • * Flags *: Optionale Parameter, die die Bedingung ändern können

Wenn eine + RewriteCond + als wahr ausgewertet wird, wird die unmittelbar folgende + RewriteRule + berücksichtigt.

  • Beispiel 2A: Standardseite *

In einem imaginären Administrationsbereich möchten wir möglicherweise alle fehlerhaften URLs zurück auf die Homepage leiten, anstatt Benutzer mit einem 404 zu begrüßen. Anhand einer Bedingung können wir prüfen, ob die angeforderte Datei existiert.

/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

Dies leitet so etwas wie "+ / admin / blargh " zu " / admin / home +" um.

Mit dem oben genannten:

  • +% {REQUEST_FILENAME} + ist die zu überprüfende Zeichenfolge

  • +! - f + verwendet den Operator +! + not für den Dateinamen

  • + RewriteRule leitet alle Anfragen zurück zu` + / admin / home + `

Beachten Sie, dass ein syntaktisch und technisch korrekterer Ansatz darin besteht, das 404-Fehlerdokument zu definieren.

/var/www/html/.htaccessErrorDocument 404 /error.html
  • Beispiel 2B: IP-Zugriffsbeschränkung *

Obwohl dies auch mit anderen Methoden erreicht werden kann, kann ein "+ RewriteCond +" verwendet werden, um den Zugriff auf eine IP-Adresse oder eine Sammlung von IP-Adressen einzuschränken.

In diesem Beispiel wird der Datenverkehr von überall * außer * 12.34.56.789 blockiert.

/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Dieses Beispiel ist einfach die Negation von Beispiel 3 aus dem alten mod_rewrite-Artikel. Die gesamte Anweisung lautet: "Wenn die Adresse not 12.34.56.789 lautet, erlauben Sie keinen Zugriff."

Zusamenfassend:

  • "+% ​​{REMOTE_ADDR} +" ist die Adresszeichenfolge

  • +! ^ (12 \ .34 \ .56 \ .789) $ + umgeht alle +. + Punkte mit einem + \ + Backslash und negiert die IP-Adresse mit +! +

  • Das "+ F " - Flag verbietet den Zugriff, und das " L +" - Flag zeigt an, dass dies die letzte Regel ist, die ausgeführt wird, wenn sie ausgeführt wird

Wenn Sie lieber 12.34.56.789 * blockieren * möchten, verwenden Sie stattdessen Folgendes:

/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Weitere Regeln zum Umschreiben und zum Verhindern von Direktverknüpfungen finden Sie in den part 1 und https: // www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-page-2[part 2].

Fazit

+ mod_rewrite + kann effektiv verwendet werden, um lesbare URLs zu gewährleisten. Die + .htaccess + - Datei selbst hat jedoch viel mehr Verwendungsmöglichkeiten als nur dieses Modul, und es sollte beachtet werden, dass möglicherweise viele andere Apache-Module installiert werden, um ihre Funktionalität zu erweitern.

Es gibt andere Ressourcen, die die Fähigkeiten von + mod_rewrite + beschreiben:

+ mod_rewrite + ist ein kritisches Modul für die Sicherheit von Webanwendungen, kann aber manchmal in Umleitungsschleifen oder allgegenwärtigen, mehrdeutigen +500 verbotenen + Fehlern enden. Tipps zum Debuggen von + .htaccess + finden Sie unter this StackOverflow post.

Rewrite-Regeln werden mit regulären Ausdrücken geschrieben. Wenn Sie ein Experte werden möchten, lesen Sie in diesem https://www.digitalocean.com/community/tutorials/an-einführung-zu-regelmäßigen- Ausdrücken[tutorial all about regular expressions] nach.

Zur schnellen Analyse Ihrer Muster für reguläre Ausdrücke finden Sie hier einen online debugger, der sofortiges Feedback und Live-Interpretationen Ihrer Muster für reguläre Ausdrücke liefert.