Crmgo Blog

htaccess-Umschreibung

htaccess-Umschreibung

Metazeichen Beispiel: Werden verwendet, um Zeichenklassen oder „Markierungen“ im Muster zu definieren. Zum Beispiel Markierungen für den Zeilenanfang oder das Zeilenende. \ Der „Escape“-Backslash. Das folgende Zeichen wird als normales Zeichen und nicht als Sonderzeichen behandelt. Das Zeichen \ wird vor Sonderzeichen gesetzt, wenn diese in ihrer ursprünglichen Form benötigt werden…

htaccess-Umschreibung

Metazeichen

Beispiel:

RewriteRule ^old(.*)$ /new.php [L,R=301]

Sie werden verwendet, um Zeichenklassen oder „Markierungen“ im Muster zu definieren. Zum Beispiel Markierungen für den Anfang oder das Ende einer Zeile.

\ „Escape“-Schrägstrich. Das folgende Zeichen wird als normales Zeichen und nicht als Sonderzeichen behandelt. Das Zeichen \ wird vor Sonderzeichen gesetzt, wenn diese in ihrer ursprünglichen Form benötigt werden. Zum Beispiel entspricht der Ausdruck „jpe\+g“ nur der einen Zeichenkette „jpe+g“.
^ Das Zeichen ^ kennzeichnet den Zeilenanfang.
$ Das Zeichen $ kennzeichnet das Zeilenende.
! Negationszeichen.
. Das Zeichen . steht für jedes beliebige Zeichen (außer dem Zeilenumbruch).
.* Ersetzt eine beliebige Zeichenfolge
".*" Findet alle Teilzeichenfolgen zwischen Anführungszeichen
| Das Zeichen | steht für eine Alternative. Zum Beispiel bedeuten die Ausdrücke „A|B“ und „(ABC|DEF)“ „A oder B“ bzw. „ABC oder DEF“.
() Klammern () werden verwendet, um Zeichen zu gruppieren.
[...] Eckige Klammern [] werden zur Auflistung zulässiger Zeichen verwendet. Zum Beispiel ist der Ausdruck „[abc]“ äquivalent zu „a|b|c“, aber die Variante mit eckigen Klammern ist in der Regel leistungsfähiger. Innerhalb der Klammern können Bereiche angegeben werden: Zum Beispiel ist der Ausdruck „[0-9]“ äquivalent zu „[0123456789]“.
[^...] Invertierte Zeichenklasse. Wenn die Zeichen innerhalb der eckigen Klammern mit dem Zeichen ^ beginnen, steht dies für jedes Zeichen außer den in den Klammern aufgeführten. Zum Beispiel bedeutet der Ausdruck „[^0-9]+“ eine Zeichenkette aus beliebigen Zeichen außer Ziffern.
[...]* Beispielsweise findet [abc]* aufeinanderfolgende Zeichen aus der angegebenen Menge. [^abc]* tut genau das Gegenteil.
\w Buchstabe, Ziffer oder Unterstrich _.
\d Ersetzt jede beliebige Ziffer.
\D Ersetzt jedes beliebige Zeichen, aber keine Ziffer.
[0-9] Ersetzt jede beliebige Ziffer.
[a-z] Jeder Buchstabe von a bis z (der gesamte lateinische Zeichensatz) in Kleinbuchstaben.
[A-Z] Jeder Buchstabe von A bis Z in GROSSBUCHSTABEN.
[a-zA-Z] Jeder Buchstabe von a bis Z in beliebiger Groß- oder Kleinschreibung. [a-Z] bedeutet dasselbe.

Ergänzung: Alles, was nach dem Zeichen '#' steht, wird als Kommentar betrachtet.

Modifikatoren

Beispiel:

RewriteRule (.*) $1? [R=301,L]

Modifikatoren werden nach normalen Zeichen, Sonderzeichen oder deren Gruppen verwendet und erweitern die Möglichkeiten der Muster, um Regeln auszulösen.

? Das Zeichen wird 0 oder 1 Mal wiederholt. Das Fragezeichen wird nach dem Zeichen (oder der Zeichengruppe) platziert, das/die sowohl vorhanden sein als auch fehlen kann. Zum Beispiel passt der Ausdruck „jpe?g“ sowohl auf den String „jpg“ als auch auf „jpeg“.
* Wird von 0 bis 65536 Mal wiederholt. Das Sternchen wird nach dem Zeichen (oder der Zeichengruppe) platziert, das/die fehlen oder unbegrenzt oft hintereinander vorhanden sein kann. Zum Beispiel passen auf den Ausdruck „jpe*g“ die Strings „jpg“, „jpeg“ und „jpeeeeeeg“.
+ Wird von 1 bis 65536 Mal wiederholt. Das Pluszeichen funktioniert analog zum Sternchen, mit dem einzigen Unterschied, dass das vorangehende Zeichen mindestens einmal vorhanden sein muss. Zum Beispiel passen auf den Ausdruck „jpe+g“ die Strings „jpeg“ und „jpeeeeg“, aber nicht „jpg“.
{n} Genau n Mal.
{n,} Von n bis einschließlich 65536 Mal.
{n,m} Von n bis einschließlich m Mal.

Beispiele für die Verwendung:

^stena

Alle Strings, die mit dem Wort „stena“ beginnen. Ein String, der mit dem Wort „dom-stena“ beginnt, erfüllt das Kriterium nicht.

stena$

Alle Strings, die mit der Zeichenfolge „stena“ enden. Ein String, der auf „stena-dom“ endet, wird nicht ausgewählt.

.*

Ein beliebiges Zeichen wird beliebig oft wiederholt. Alle Strings erfüllen das Kriterium.

^(.*)$

Einen beliebigen String auswählen und als Variable $1 für die weitere Verwendung speichern.

[0-9]{1,6}$

Alle Strings auswählen, die von 1 bis 6 Ziffern aus dem Bereich 0–9 enden.

^(.+)/(.+)$

Einen String in zwei Teile aufteilen: vor dem Schrägstrich und danach. Die String-Teile sind über die Variablen $1 und $2 verfügbar.

Wichtig! Da der Modifikator gierig ist, wird die erste Gruppe die maximale Anzahl von Zeichen aufnehmen, die dem Muster entsprechen. Der Schrägstrich ist ein Zeichen wie alle anderen auch.

Beispiel für die Verwendung:

RewriteRule ^(.+)/(.+)$ /?a=$1&b=$2 [R=301,L]

http://www.site.com/1/2/3/4/5 →
http://www.site.com/?a=1/2/3/4&b=5

Flags

Beispiel:

RewriteRule ^htaccess-fake$ - [G]
RewriteRule (.*) page.php\?%1 [L]

Flags sind zusätzliche Optionen. Sie werden in eckigen Klammern durch Kommas getrennt aufgelistet, z. B. [NC] oder [R=301,L].

R (redirect) stoppt den Umwandlungsprozess und gibt das Ergebnis an den Browser des Clients als Weiterleitung auf diese Seite zurück (302, MOVED TEMPORARY). Mit diesem Flag kann ein anderer Ergebniscode angegeben werden, z. B. „R=301“, der eine Weiterleitung mit dem Code 301 (MOVED PERMANENTLY) zurückgibt.
F (forbidden) gibt den Fehler 403 (FORBIDDEN) zurück.
G (gone) gibt den Fehler 410 (GONE) zurück.
P (proxy) – bei diesem Flag führt Apache eine Unteranfrage (Sub-Request) an die angegebene Seite unter Verwendung des Moduls mod_proxy aus, wobei der Benutzer nichts von dieser Unteranfrage mitbekommt. Wenn das Modul mod_proxy nicht Teil Ihrer Apache-Build-Version ist, führt die Verwendung dieses Flags zu einem Fehler.
L (last) stoppt den Umwandlungsprozess, und die aktuelle Regel gilt als endgültig.
N (next) startet den Umwandlungsprozess von der ersten Regel an.
C (chain) verknüpft mehrere Regeln zu einer Kette. Wenn die erste Regel der Kette „nicht zutrifft“, wird die gesamte Kette ignoriert.
NS (nosubreq) erlaubt das „Zutreffen“ der Regel nur für echte Anfragen und ignoriert Unteranfragen (eine Unteranfrage kann beispielsweise durch die Einbindung einer Datei mittels der SSI-Direktive ausgelöst werden).
NC (nocase) deaktiviert die Groß-/Kleinschreibung bei der Auswertung der Regel.
QSA (qsappend) fügt die ursprünglichen Anfrageparameter (Query-String) zur Ersetzung hinzu. Wenn die Ersetzung keine neuen Anfrageparameter enthält, werden die ursprünglichen Anfrageparameter automatisch hinzugefügt. Enthält sie jedoch neue Parameter, gehen die ursprünglichen Anfrageparameter ohne das QSA-Flag verloren.
PT (passthrough) stoppt den Umwandlungsprozess und übergibt die neu erzeugte Regel weiter „in der Kette“, damit sie von Direktiven wie Alias, ScriptAlias, Redirect und ähnlichen verarbeitet werden kann (während bei Verwendung des L-Flags die neue Regel als endgültig gilt und nicht weiter verarbeitet wird).
S (skip) überspringt die nächste Regel, wenn diese Regel „zutreffend“ ist. Es können mehrere Regeln übersprungen werden, indem ihre Anzahl angegeben wird, z. B.: „S=3“.
E (env) setzt eine Umgebungsvariable, z. B.: „E=Variable:Wert“.

Prüfungen

Beispiel:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME}\.html -f

RewriteRule ^(.*)$ $1.php

In den Bedingungen können folgende Prüfungen verwendet werden:

1. Sie können dem Muster ein Ausrufezeichen '!' voranstellen, um anzugeben, dass das Muster nicht zutrifft.

2. Es kann ein lexikografischer String-Vergleich durchgeführt werden:

Lexikografisch kleiner
Lexikografisch größer
Gleichheit
Lexikografisch kleiner oder gleich
Lexikografisch größer oder gleich

3. Vergleich als ganze Zahlen:

Arithmetisch gleich
Arithmetisch größer oder gleich
Arithmetisch größer
Arithmetisch kleiner oder gleich. Um Verwechslungen mit dem Großbuchstaben -l zu vermeiden, verwenden Sie -L
Arithmetisch kleiner. Um Verwechslungen mit dem Großbuchstaben -l zu vermeiden, verwenden Sie -L

4. Tests auf verschiedene Dateiattribute:

Ist ein Verzeichnis.
Ist eine reguläre Datei.
Existiert die Datei.
Ist ein symbolischer Link.
Ist ein symbolischer Link. Äquivalent zum Flag -l.
Ist eine reguläre Datei mit ungleich Null Größe
Existiert die angegebene URL
Ist die Datei ausführbar.

5. Alle diese Prüfungen können auch durch ein vorangestelltes Ausrufezeichen ('!') invertiert werden.

Variablen

Beispiel:

RewriteCond %{REQUEST_URI} /+[^\.]+$

RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

HTTP_USER_AGENT Enthält Informationen über die Art und Version des Browsers sowie des Betriebssystems des Besuchers.
HTTP_REFERER Gibt die Adresse der Seite an, von der der Besucher auf die aktuelle Seite gelangt ist.
HTTP_COOKIE Liste der vom Browser übermittelten Cookies.
HTTP_FORWARDED Die Seite, von der der Benutzer direkt gekommen ist.
HTTP_HOST Serveradresse, z. B. host.com
HTTP_ACCEPT Beschreibt die Präferenzen des Clients bezüglich des Dokumententyps.
REMOTE_ADDR IP-Adresse des Besuchers.
REMOTE_HOST Adresse des Besuchers im normalen Format – z. B. rt99.net.com
REMOTE_IDENT Name des entfernten Benutzers. Format: name.host, z. B. kondr.www.rtt99.net.com
REMOTE_USER Wie REMOTE_IDENT, enthält jedoch nur den Namen. Beispiel: kondr
REQUEST_METHOD Ermöglicht die Bestimmung der Art der Anfrage (GET oder POST). Muss unbedingt analysiert werden, da sie die weitere Verarbeitung der Informationen bestimmt.
SCRIPT_FILENAME Vollständiger Pfad zur Webseite auf dem Server.
PATH_INFO Enthält alles, was an das Skript übergeben wurde.
QUERY_STRING Enthält die Zeichenkette, die als Anfrage bei der Aufrufung eines CGI-Skripts übergeben wurde.
AUTH_TYPE Dient zur Identifizierung des Benutzers.
DOCUMENT_ROOT Enthält den Pfad zum Stammverzeichnis des Servers.
SERVER_ADMIN E-Mail-Adresse des Serverbesitzers, die bei der Installation angegeben wurde.
SERVER_NAME Serveradresse, z. B. kondr.host.com
SERVER_ADDR IP-Adresse Ihrer Website.
SERVER_PORT Port, auf dem Apache läuft.
 SERVER_PROTOCOL  Version des HTTP-Protokolls.
 SERVER_SOFTWARE  Name des Servers, z. B. Apache/1.3.2 (Unix)
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME Diese Variablen dienen der Arbeit mit Zeitangaben in verschiedenen Formaten.
API_VERSION Die Version der API des Apache-Moduls (interne Schnittstelle zwischen Server und Modul) in der aktuellen Server-Build-Version, wie in include/ap_mmn.h definiert.
THE_REQUEST Die vollständige HTTP-Anfrage-Zeichenkette, die vom Browser an den Server gesendet wurde (d. h. „GET /index.html HTTP/1.1“). Sie enthält keine zusätzlichen vom Browser gesendeten Header.
REQUEST_URI Die Ressource, die in der HTTP-Anfrage-Zeichenkette angefordert wurde.
REQUEST_FILENAME Vollständiger Pfad im Dateisystem des Servers zur Datei oder zum Skript, das dieser Anfrage entspricht.
IS_SUBREQ Enthält den Text „true“, wenn die Anfrage derzeit als Unteranfrage ausgeführt wird, andernfalls „false“. Unteranfragen können von Modulen generiert werden, die zusätzliche Dateien oder URIs verarbeiten müssen, um ihre eigenen Aufgaben zu erfüllen.

Logik der Regelausführung (RewriteRule)

Die Ausführung einer Regel umfasst folgende Schritte: Zuerst führt der Umwandlungsmechanismus die Suche nach zusätzlichen Bedingungen für diese Regel durch (RewriteCond-Direktiven). Beachten Sie, dass zusätzliche Bedingungen aus historischen Gründen vor den Regeln (RewriteRule) stehen. Wenn keine zusätzlichen Bedingungen für diese Regel vorhanden sind, führt der Umwandlungsmechanismus einfach die in der Regel angegebene Umwandlung der aktuellen URL durch und wechselt zur nächsten Regel. Wenn jedoch für die auszuführende Regel (RewriteRule) zusätzliche Bedingungen vorhanden sind, die VOR ihr in den RewriteCond-Direktiven angegeben sind, wird ein interner Zyklus zur Verarbeitung dieser zusätzlichen Bedingungen in der Reihenfolge gestartet, in der sie aufgelistet sind, von oben nach unten.

Wenn mindestens eine der für die Regel vorhandenen zusätzlichen Bedingungen NICHT erfüllt ist, wird der gestartete Regel-Ausführungsprozess gestoppt, und die in der Regel angegebene URL-Umwandlung wird NICHT durchgeführt. Damit eine gestartete Regel bis zum Ende ausgeführt wird und die URL ändert, müssen ALLE zusätzlichen Bedingungen, die in den RewriteCond-Direktiven vor dieser Regel angegeben sind, erfüllt sein!

Hier muss zusätzlich erläutert werden, dass die RewriteCond-Direktiven standardmäßig durch den AND-Operator zu einer zusammengesetzten Bedingung verbunden sind. Dieser Operator (AND) wird standardmäßig nicht explizit geschrieben. Daher ergibt sich die Logik, dass alle zusätzlichen Bedingungen wahr sein müssen (da sie über AND verbunden sind), damit die URL-Umwandlung erfolgreich abgeschlossen wird. Die RewriteCond-Direktiven können jedoch mit dem OR-Operator über Flags verbunden werden (siehe Syntax der Direktive). Dies ist bei der Definition zusätzlicher Bedingungen zu beachten.

Syntax der RewriteRule-Direktive:

RewriteRule Шаблон Подстановка [Флаги]

Beispiel:

RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

Wobei:

1.    RewriteRule  – der Name der Regel-Direktive.
2.    Muster  – dies ist genau die Bedingung, deren Erfüllung die Ausführung der Regel auslöst. Diese Bedingung – das Muster – ist eine perl-kompatible reguläre Expression, die auf die aktuelle URL angewendet wird.
3.    Ersetzung  – dies ist genau der Algorithmus zur Änderung der URL, d.h. die Regel zur Änderung (Umwandlung) der URL.
4.    [Flags] der Ersetzung – das dritte Argument der RewriteRule-Direktive. Flags sind durch Kommas getrennte, großgeschriebene Sonderzeichen, die in eckigen Klammern eingeschlossen sind. Flags ergänzen die URL-Umwandlung.

Parameter in der Regel werden in einer Zeile beginnend mit dem Namen der Direktive geschrieben und durch Leerzeichen voneinander getrennt.

Nun lassen Sie uns ein Beispiel für eine RewriteRule-Regel analysieren:

RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

1.    ^(.*)$ - это шаблон, регулярное выражение, которое будет применено к текущему URL. Те, кто знаком с регулярными выражениями, могут прочитать его так: искать в текущей строке URL от начала строки (символ ^) до конца строки (символ $) любой символ (символ .) в количестве от нуля до бесконечности (символ *). Поскольку в этом регулярном выражении есть скобки (), та часть URL, которая соответствует условию в скобках, будет захвачена в переменную подстановки $1, которую мы затем сможем использовать в Подстановке или в СравниваемаяСтрока (это в директиве RewriteCond, о ней ниже).
2.     index.php?/$1 - Подстановка – это собственно и есть правило преобразования URL. Запись index.php?/$1 означает, что строка нового, преобразованного URL должна быть составлена из двух частей, где первая часть строки это постоянное значение index.php?/ а вторая часть строки это значение из переменной подстановки $1. Тут мы вспоминаем что в $1 храниться та часть URL которая соответствовала регулярному выражению в скобках из параметра Шаблон. В итоге мы получаем преобразованный URL вида index.php?/URL_по которому обратились. По другому сказать так, что для всех запросов выполняется внутреннее перенаправление на файл index.php.
3.    [L,QSA] – флаги, где 'last|L' - последнее правило, что означает - остановить процесс преобразования на этом месте и не применять больше никаких следующих правил преобразований для URL. 'qsappend|QSA' - добавлять строку запроса - Этот флаг указывает механизму преобразований на добавление, а не замену, строки запроса из URL к существующей, в строке Подстановка. Используйте это когда вы хотите добавлять дополнительные данные в строку запроса с помощью директив преобразований.

Шпаргалки

Шпаргалка по mod_rewrite

Шпаргалка по mod_rewrite содержит список флагов для директив RewriteRule и RewriteCond, список серверных переменных, руководство по регулярным выражениям и несколько примеров общих правил.

Шпаргалка по регулярным выражениям

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка.

Заключение

Не забывайте в регулярном выражении экранировать служебные символы. Иногда забывают экранировать точку, когда она должна выступать именно как точка, а не как принято в регулярном выражении - как любой символ.

Также не забывайте оборачивать весь блок правил для mod_rewrite в тег: <IfModule mod_rewrite.c></IfModule>

Schreiben Sie nicht zu viele Direktiven für mod_rewrite; verwenden Sie nur die Umleitungsregeln, die Sie tatsächlich benötigen. Seien Sie insbesondere bei externen Redirects vorsichtig – das sind Redirects, die durch Senden eines Server-Headers mit einem HTTP-Statuscode ungleich 200 (Vollständige Seitenausgabe) an den Client ausgelöst werden, meist 301 oder 302, und die den Browser des Clients zur Weiterleitung auf eine andere URL veranlassen, d. h. zu einer neuen Anfrage vom Client aus führen.

Jeder externe Redirect führt daher zwangsläufig zu einem Zeitverlust bei der Bearbeitung der Anfrage, da zunächst eine Antwort an den Client gesendet werden muss, der diese lesen und dann die Anfrage erneut an die neue URL senden muss. Dies ist ein zeitintensiver Vorgang. Redirects sollten daher nur dann eingesetzt werden, wenn sie tatsächlich erforderlich sind.

Hinweis: Dieser Beitrag kann KI-unterstützt erstellt und anschließend redaktionell geprüft worden sein. Verantwortlich: Dmytro Lomaka, Kaltenkirchen.