Website-Suche

Erstellen von Umleitungs- und Umschreibungsregeln in .htaccess auf dem Apache-Webserver


Bei der Verwendung des Apache-Webservers werden .htaccess-Dateien (auch als "verteilte Konfigurationsdateien" bezeichnet) verwendet, um die Konfiguration pro Verzeichnis zu spezifizieren oder allgemeiner, um das Verhalten des Apache-Webservers zu ändern, ohne direkt auf die Dateien der virtuellen Hosts zugreifen zu müssen (dies ist z. B. auf gemeinsam genutzten Hosts normalerweise nicht möglich). In diesem Tutorial sehen wir, wie wir URL-Umleitungen und Umschreiberegeln in .htaccess-Dateien einrichten können.

In diesem Tutorial lernen Sie:

  • Funktionsweise von .htaccess-Dateien
  • So richten Sie URL-Umschreibungsregeln in .htaccess-Dateien mit der RewriteRule-Direktive ein
  • So richten Sie URL-Umleitungsregeln in .htaccess-Dateien mit den Direktiven Redirect und RedirectMatch ein

Erstellen von Umleitungs- und Umschreibungsregeln in .htaccess auf dem Apache-Webserver

Verwendete Softwareanforderungen und Konventionen

Sollten Sie .htaccess-Dateien verwenden?

Wie wir bereits erwähnt haben, wird die Verwendung von .htaccess-Dateien nicht empfohlen, wenn Sie direkt mit Konfigurationsdateien für virtuelle Hosts arbeiten können, da dies den Apache-Webserver verlangsamt (wenn die AllowOverride-Direktive verwendet wird, um die Verwendung von .htaccess-Dateien zu erlauben, scannt der Webserver jedes Verzeichnis auf der Suche nach ihnen). In manchen Situationen ist die Verwendung von .htaccess-Dateien jedoch die einzige Lösung.

Der Satz von Direktiven, die in .htaccess-Dateien verwendet werden können, wird in der Konfiguration des Hauptstandorts über die AllowOverride-Direktive innerhalb einer Zeilengruppe <Directory> festgelegt. Um zum Beispiel die Verwendung aller möglichen Direktiven zu ermöglichen, würden wir etwas schreiben wie:

<Directory /path/to/directory>
   AllowOverride All
</Directory>

Die Anweisungen werden auf .htaccess-Dateien angewendet, die sich im angegebenen Verzeichnis und in allen seinen Unterverzeichnissen befinden.

Damit die Direktiven, die wir in diesem Tutorial verwenden werden, funktionieren, müssen die Module mod_alias und mod_rewrite Apache aktiviert sein.

Weiterleitungen (mod_alias)

Wie bereits erwähnt, möchten wir in unseren .htaccess-Dateien möglicherweise einige Umleitungsregeln festlegen, so dass der Client bei der Anforderung einer URL auf eine andere umgeleitet wird.

Wir haben grundsätzlich zwei Möglichkeiten, die Operation durchzuführen: mit den Direktiven Redirect oder RedirectMatch. Was ist der Unterschied zwischen den beiden? Ersteres ermöglicht es uns, eine Umleitung auf der Grundlage einfacher URL-Übereinstimmungen zu erstellen. Ersteres macht im Grunde dasselbe, ist aber leistungsfähiger, da wir damit reguläre Ausdrücke verwenden können.

Die Direktive "Redirect"

Sehen wir uns einige Beispiele für die Verwendung der redirect-Direktive an. Angenommen, wir möchten unsere gesamte Website umleiten:

Redirect 301 / https://url/to/redirect/to

Das obige ist ein ziemlich "extremes" Beispiel. Analysieren wir die Syntax. Als erstes haben wir die Direktive Redirect angegeben.

Das zweite, was wir bereitgestellt haben, ist der HTTP-Code, der für die Umleitung verwendet werden soll: Dieser kann entweder als numerischer Status oder in Form eines Strings bereitgestellt werden.
Ein paar Beispiele:

HTTP-CODESCHLÜSSELWORT
301permanent sind
302Aushilfe
303Weitere Informationen
410fort

Im vorherigen Beispiel haben wir eine dauerhafte Umleitung konfiguriert, da wir den HTTP-Code 301 verwendet haben. Ein Äquivalent dazu wäre:

Redirect permanent / https://url/to/redirect/to

Die Art der Umleitung kann ganz weggelassen werden: Wenn es der Fall ist, wird standardmäßig der Code 302 (temporäre Umleitung) verwendet.

Das dritte Argument, das wir in der Regel angegeben haben, ist der absolute Pfad der "ursprünglichen" Ressource, der abgeglichen werden soll. In diesem Fall haben wir / verwendet, was die Wurzel der Website ist, da wir sie vollständig umleiten möchten. Hier muss der Schema- und Host-Teil der URL weggelassen werden.

Das vierte Argument ist die "neue" URL, zu der der Benutzer umgeleitet werden soll. In diesem Fall können wir, wie im obigen Beispiel, eine vollständige URL verwenden, einschließlich Schema und Host, oder sie weglassen und nur einen Pfad verwenden: Im letzteren Fall würde sie als Teil derselben ursprünglichen Website betrachtet werden. Dieses Argument ist obligatorisch, wenn der angegebene Umleitungsstatus zwischen 301 und 399 liegt, aber es muss weggelassen werden, wenn der angegebene Status nicht in diesem Bereich liegt. Das macht Sinn: Stellen Sie sich vor, wir verwenden einen 410-Status, um zu signalisieren, dass die Ressource weg ist: Es hätte keinen Sinn, eine Umleitungs-URL anzugeben. In diesem Fall würden wir einfach schreiben:

Redirect 410 /path/of/resource

Die Direktive "RedirectMatch"

Mit der Direktive "Redirect" können wir den Pfad der URL angeben, die umgeleitet werden soll, aber er muss schlicht und einfach übereinstimmen, so wie er angegeben ist. Was ist, wenn wir etwas Komplexeres ausführen möchten, wie zum Beispiel Anfragen für alle Dateien mit der Erweiterung .html umzuleiten? In diesen Fällen können wir die RedirectMatch-Direktive verwenden und einen regulären Ausdruck verwenden. Sehen wir uns ein Beispiel an:

RedirectMatch 301 (.*)\.html$ $1.php

Im obigen Beispiel haben wir alle Anfragen für .html Dateien auf unserer Website auf Dateien mit demselben Namen und Pfad, aber mit der Erweiterung .php umgeleitet. Analysieren wir die Regel.

Wie immer ist das erste, was wir bereitgestellt haben, die Direktive, in diesem Fall RedirectMatch. Danach haben wir, wie zuvor, den HTTP-Code bereitgestellt, der für die Umleitung verwendet werden soll. Dann, und das ist das Interessante, haben wir den regulären Ausdruck (.*)\.html$ verwendet.

Für diejenigen unter Ihnen, die bereits mit Regex vertraut sind, sollte dies sofort klar sein, aber schauen wir uns an, wie es funktioniert: Das . (Punkt) im regulären Ausdruck stimmt mit allen Zeichen überein: Es folgt das *, das festlegt, dass der vorherige Ausdruck 0 oder mehr Mal übereinstimmen soll. Der Ausdruck wird in Klammern gesetzt, so dass er gruppiert ist, und der Teil der URL, der ihm entspricht, kann später über die Variable $1 referenziert werden (es können mehrere Gruppen verwendet werden – sie werden nach und nach "benannt", so dass wir zum Beispiel $2 verwenden können, um der zweiten Gruppe zu entsprechen). Nach dem Teil des Ausdrucks, der in Klammern eingeschlossen ist, haben wir angegeben, dass der Pfad mit .html enden soll: Sie können sehen, dass wir das . mit einem umgekehrten Schrägstrich maskiert haben, damit es wörtlich zu
übereinstimmt. Schließlich haben wir $ verwendet, um das Ende der Zeile abzugleichen.

Als Argument für die Umleitungs-URL haben wir $1.php verwendet. Wie wir bereits erklärt haben, wird $1 verwendet, um auf den Teil der URL zu verweisen, der mit dem regulären Ausdruck in Klammern übereinstimmt (das ist der vollständige Pfad abzüglich der .html Erweiterung), also verwenden wir hier im Grunde den gleichen Pfad, aber mit der .php Erweiterung.

URL-Umschreibung (mod_rewrite)

Regeln zum Umschreiben von URLs können sowohl transparent als auch für den Benutzer sichtbar sein. Im ersten Fall fordert der Benutzer eine Seite an, und der Server übersetzt die Anfrage intern auf der Grundlage der bereitgestellten Regel, um die Ressource bereitzustellen: Der Benutzer bemerkt nicht, was passiert, da sich die URL in seinem Browser nicht ändert. Im zweiten Fall erreichen wir stattdessen praktisch eine vollständige Umleitung, die für den Benutzer sichtbar ist.

Beginnen wir mit dem ersten Fall. Wenn wir das URL-Rewriting verwenden möchten, müssen wir zunächst (in diesem Fall in unserer .htaccess-Datei) die folgende Direktive schreiben:

RewriteEngine on

Die RewriteEngine-Direktive wird, wie der Name schon sagt, benötigt, um den Zustand der Apache-Rewrite-Engine zu ändern. Im obigen Beispiel haben wir es aktiviert; Um es zu deaktivieren, müssen wir stattdessen schreiben:

RewriteEngine off

Nehmen wir als Beispiel an, wir haben eine Ressource namens page.html auf unserem Server, die früher über die schlichte und einfache URL erreicht wurde: http://localhost/page.html. Stellen Sie sich nun vor, dass wir die HTML-Datei aus bestimmten Gründen in newpage.html umbenannt haben, aber aus offensichtlichen Gründen möchten wir, dass unsere Kunden die Ressource weiterhin mit der alten URL erreichen können (vielleicht haben sie sie in ihren Browser-Lesezeichen gespeichert). Was wir tun könnten, ist, die folgende, sehr
einfache Regel zu schreiben:

RewriteEngine on
RewriteRule ^page\.html /newpage.html

Die Syntax der Regel ist derjenigen sehr ähnlich, die wir für die RedirectMatch-Direktive verwendet haben: Zuerst haben wir die Direktive selbst, RewriteRule, dann haben wir das Muster, das für den URL-Abgleich verwendet wird: Es muss ein Regex sein. Danach haben wir die Ersetzungszeichenfolge, die verwendet wird, um die ursprüngliche URL zu ersetzen.

Ein viertes Element, das bei der Definition einer RewriteRule verwendet werden kann, sind die Flags, die verwendet werden, um das Verhalten des Webservers zu ändern, wenn eine bestimmte Regel erfüllt ist.

Sehen wir uns ein Beispiel an: Mit der Regel, die wir oben festgelegt haben, findet keine Umleitung statt, wie wir bereits gesagt haben: Die URL in der Adressleiste des Browsers ändert sich nicht. Wenn wir eine Umleitung wünschen, müssen wir dem Ausdruck das R-Flag hinzufügen:

RewriteEngine on
RewriteRule ^page\.html /newpage.html [R]

Flags werden in eckigen Klammern angegeben: In diesem speziellen Fall bewirkt das R-Flag, dass die Regel als Umleitung interpretiert wird. Es ist sogar möglich, die Art der Umleitung anzugeben, die stattfinden soll, indem Sie den zugehörigen HTTP-Code angeben, z. B.:

RewriteRule ^page\.html /newpage.html [R=301]

Ein weiteres häufiges Ding, an das URL-Rewriting gewöhnt ist, ist die "Verschönerung" von URLs für SEO-Zwecke. Nehmen wir zum Beispiel an, wir haben ein PHP-Skript, das ein bestimmtes Produkt aus einer Datenbank anhand seiner ID abruft, die als Abfrageparameter in
der URL angegeben ist, zum Beispiel:

http://localhost/products.php?id=1

Um die Ressource unter der http://localhost/products/1 URL verfügbar zu machen, könnten wir die folgende Regel schreiben:

RewriteEngine on
RewriteRule ^products/([0-9]+)$ /products.php?id=$1

Mit dem [0-9] Regex gleichen wir alle Ziffern ab, und mit dem + sagen wir, dass der vorherige Ausdruck 1 oder mehr Mal übereinstimmen muss, damit die Regel ausgeführt wird. Der übereinstimmende Ausdruck wird in Klammern eingeschlossen, sodass wir mit der Variablen $1 auf den übereinstimmenden Teil der URL in der Zeichenkette "destination" verweisen können. Auf diese Weise wird die ID des Produkts, das wir in der "beautifizierten" URL angeben, zum Wert der id-Variablen in der Abfragezeichenfolge.

Bedingungen für das Umschreiben

Wir haben gerade gesehen, wie der reguläre Ausdruck mit der vom Benutzer bereitgestellten URL übereinstimmen muss, damit eine Rewrite-Regel angewendet werden kann. Im letzten Beispiel haben wir gesehen, wie die http://localhost/products/1 URL intern in http://localhost/products.php?id=1 umgeschrieben werden kann. Aber was ist, wenn der Pfad, der von der neuen URL angegeben wird, auf eine "echte" Datei verweist, die auf dem Server vorhanden ist? Was ist, wenn z. B. /products/1 eine reguläre Datei ist und wir möchten, dass sie so bereitgestellt wird, wie sie ist? In solchen Fällen können wir die Direktive RewriteCond verwenden.

Mit der RewriteCond-Direktive geben wir eine Bedingung an, die beachtet werden sollte, damit das URL-Rewriting stattfinden kann. In diesem Fall möchten wir z. B. festlegen, dass die Umleitung
nicht stattfinden soll, wenn die Datei products/1 auf dem Server vorhanden ist. Wir würden schreiben:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^products/([0-9]+)$ /products.php?id=$1

Wir verwenden die Direktive RewriteCond vor der RewriteRule. Das erste, was wir an die Direktive übergeben haben, ist die Testzeichenfolge, die abgeglichen werden soll. In diesem Zusammenhang können wir eine Reihe von vordefinierten Servervariablen verwenden, wie z.B. %{REQUEST_FILENAME}:
es verweist auf das den vollständigen lokalen Dateisystempfad zu der Datei oder dem Skript, das der Anfrage entspricht.

Hier können wir Ihnen keine vollständige Liste aller verfügbaren Variablen zur Verfügung stellen, die Sie in der Dokumentation zur Apache mod_rewrite finden können.

Nach dem "test string" geben wir die Bedingung an, die erfüllt werden soll: In diesem Fall haben wir !-f verwendet, um anzugeben, dass für die Anwendung der Rewrite-URL die Datei oder das Skript, das der Anfrage entspricht, keine reguläre Datei sein sollte, die auf dem Server vorhanden ist (-f entspricht einer regulären Datei, und ! invertiert das Ergebnis).

Das obige ist ein wirklich einfaches Beispiel für eine RewriteCond-Direktive: mehr als eine kann vor der RewriteRule-Direktive bereitgestellt werden: alle sollten übereinstimmen, damit letztere angewendet wird.

Schlüsse

In diesem Artikel haben wir gesehen, wie wir URL-Umleitungen und URL-Umschreibungsregeln in .htaccess-Dateien festlegen können, wenn wir den Apache-Webserver verwenden. Wir haben einige sehr einfache Beispiele für die Verwendung der Direktiven Redirect, RedirectMatch und RewriteRule gesehen und wie wir sie verwenden können, um bestimmte Verhaltensweisen zu erreichen. Dies war nur als Einführung in diese Themen gedacht, also werfen Sie bitte einen Blick auf die offiziellen Dokumentationsseiten für die mod_alias und die mod_rewrite Module, um tieferes Wissen zu erhalten.

Verwandte Artikel: