Syntaxreihenfolge von mod_rewrite
mod_rewrite hat einige spezielle Ordnungsregeln, die sich auf die Verarbeitung auswirken. Bevor etwas getan wird, muss die RewriteEngine On
Direktive angegeben werden, da dies die Verarbeitung von mod_rewrite einschaltet. Dies sollte vor allen anderen Umschreibeanweisungen erfolgen.
RewriteCond
vorhergehende RewriteRule
macht diese EINE Regel abhängig von der Bedingung. Alle folgenden RewriteRules werden so verarbeitet, als wären sie nicht an Bedingungen geknüpft.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
In diesem einfachen Fall, wenn der HTTP-Verweis von serverfault.com stammt, leiten Sie Blog-Anfragen auf spezielle Serverfehlerseiten um (wir sind nur das Besondere). Wenn der obige Block jedoch eine zusätzliche RewriteRule-Zeile hatte:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Alle .jpg-Dateien werden auf die speziellen Serverfehlerseiten verschoben, nicht nur auf diejenigen mit einem Verweis, der angibt, dass sie von hier stammen. Dies ist eindeutig nicht die Absicht der Art und Weise, wie diese Regeln geschrieben sind. Dies könnte mit mehreren RewriteCond-Regeln geschehen:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Aber wahrscheinlich sollte dies mit etwas kniffligerer Ersatzsyntax geschehen.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Die komplexere RewriteRule enthält die Bedingungen für die Verarbeitung. Die letzte Klammer (html|jpg)
weist RewriteRule an, entweder nach html
oder zu suchen jpg
und die gefundene Zeichenfolge als $ 2 in der neu geschriebenen Zeichenfolge darzustellen. Dies ist logisch identisch mit dem vorherigen Block, mit zwei RewriteCond / RewriteRule-Paaren, es wird nur auf zwei Zeilen anstatt auf vier ausgeführt.
Mehrere RewriteCond-Zeilen sind implizit UND-verknüpft und können explizit ODER-verknüpft werden. So behandeln Sie Verweise von ServerFault und Super User (explizites ODER):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
So bedienen Sie ServerFault-bezogene Seiten mit Chrome-Browsern (implizites UND):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
ist auch auftragsspezifisch, da angegeben wird, wie die folgenden RewriteRule
Anweisungen ihre Verarbeitung handhaben. Es ist sehr nützlich in .htaccess-Dateien. Bei Verwendung sollte dies die erste Anweisung unter "RewriteEngine on" in einer .htaccess-Datei sein. Nehmen Sie dieses Beispiel:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Dies sagt mod_rewrite, dass diese bestimmte URL, die derzeit verarbeitet wird, über http://example.com/blog/ anstelle des physischen Verzeichnispfads (/ home / $ Benutzername / public_html / blog) angekommen ist, und behandelt sie entsprechend. Aus diesem Grund wird davon RewriteRule
ausgegangen, dass die Zeichenfolge nach dem "/ blog" in der URL beginnt. Hier ist das Gleiche auf zwei verschiedene Arten geschrieben. Eine mit RewriteBase, die andere ohne:
RewriteEngine On
##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg) $1.sf.$2
##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Wie Sie sehen, RewriteBase
können Sie durch das Umschreiben von Regeln den Pfad der Website zum Inhalt und nicht zum Webserver nutzen , wodurch diese für diejenigen verständlicher werden, die solche Dateien bearbeiten. Außerdem können sie die Richtlinien kürzer machen, was ästhetisch ansprechend ist.
RewriteRule-Matching-Syntax
RewriteRule selbst verfügt über eine komplexe Syntax zum Abgleichen von Zeichenfolgen. Ich werde die Flaggen (Dinge wie [PT]) in einem anderen Abschnitt behandeln. Da Sysadmins häufiger anhand von Beispielen lernen als durch Lesen einer Manpage, werde ich Beispiele geben und erklären, was sie tun.
RewriteRule ^/blog/(.*)$ /newblog/$1
Das .*
Konstrukt entspricht einem einzelnen Zeichen ( .
) null oder mehrmals ( *
). Durch das Einschließen in Klammern wird die Zeichenfolge angegeben, die als $ 1-Variable abgeglichen wurde.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
In diesem Fall war das erste. * NICHT in den Parens enthalten und wird daher nicht für die umgeschriebene Zeichenfolge bereitgestellt. Diese Regel entfernt eine Verzeichnisebene auf der neuen Blog-Site. (/blog/2009/sample.html wird zu /newblog/sample.html).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
In diesem Fall richtet der erste Ausdruck in Klammern eine übereinstimmende Gruppe ein. Dies wird zu $ 1, was nicht benötigt und daher in der neu geschriebenen Zeichenfolge nicht verwendet wird.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
In diesem Fall verwenden wir $ 1 in der umgeschriebenen Zeichenfolge.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Diese Regel verwendet eine spezielle Klammer - Syntax , die ein Zeichen gibt Bereich . [0-9] entspricht den Ziffern 0 bis 9. Diese spezielle Regel behandelt Jahre von 2000 bis 2099.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Dies macht das Gleiche wie die vorherige Regel, aber der Abschnitt {2} sagt, dass es zweimal mit dem vorherigen Zeichen (in diesem Fall mit einem Klammerausdruck) übereinstimmen soll.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Dieser Fall stimmt mit jedem Kleinbuchstaben im zweiten übereinstimmenden Ausdruck überein, und zwar für so viele Zeichen wie möglich. Das \.
Konstrukt weist es an, die Periode als eine tatsächliche Periode zu behandeln, nicht das Sonderzeichen, das es in den vorherigen Beispielen ist. Es wird jedoch unterbrochen, wenn der Dateiname Striche enthält.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Dies fängt Dateinamen mit Bindestrichen ein. Da -
es sich jedoch um ein Sonderzeichen in Klammern handelt, muss es das erste Zeichen im Ausdruck sein.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Diese Version fängt jeden Dateinamen mit Buchstaben, Zahlen oder dem -
Zeichen im Dateinamen ein. Auf diese Weise geben Sie mehrere Zeichensätze in einem Klammerausdruck an.
RewriteRule-Flags
Die Flags für Umschreiberegeln haben eine Vielzahl von speziellen Bedeutungen und Verwendungszwecken .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
Das Flag steht [L]
am Ende des obigen Ausdrucks. Es können mehrere durch Komma getrennte Flags verwendet werden. Die verlinkten Dokumentationen beschreiben jeden einzelnen, aber hier sind sie trotzdem:
L = Letzte. Stoppen Sie die Verarbeitung von RewriteRules, sobald diese übereinstimmt. Bestellung zählt!
C = Kette. Fahren Sie mit der Verarbeitung der nächsten RewriteRule fort. Wenn diese Regel nicht übereinstimmt, wird die nächste Regel nicht ausgeführt. Dazu später mehr.
E = Umgebungsvariable einstellen. Apache verfügt über verschiedene Umgebungsvariablen, die sich auf das Verhalten von Webservern auswirken können.
F = Verboten. Gibt einen 403-Forbidden-Fehler zurück, wenn diese Regel zutrifft.
G = gegangen. Gibt einen 410-Gone-Fehler zurück, wenn diese Regel zutrifft.
H = Handler. Erzwingt, dass die Anforderung wie der angegebene MIME-Typ behandelt wird.
N = Weiter. Erzwingt, dass die Regel erneut gestartet und abgeglichen wird. ACHTUNG! Dies kann zu Schleifen führen.
NC = Kein Fall. Erlaubtjpg
passend zu jpg und JPG.
NE = kein Entrinnen. Verhindert das Umschreiben von Sonderzeichen (.? # & Etc) in ihre Hex-Code-Entsprechungen.
NS = Keine Unteranfragen. Wenn Sie serverseitige Includes verwenden, werden Übereinstimmungen mit den enthaltenen Dateien verhindert.
P = Proxy. Erzwingt die Behandlung der Regel durch mod_proxy. Stellen Sie Inhalte von anderen Servern transparent bereit, da Ihr Webserver sie abruft und erneut bereitstellt. Dies ist eine gefährliche Flagge, da eine schlecht geschriebene Ihren Webserver in einen offenen Proxy verwandelt und That is Bad.
PT = Pass Through. Berücksichtigen Sie Alias-Anweisungen beim RewriteRule-Abgleich.
QSA = QSAppend. Wenn die ursprüngliche Zeichenfolge eine Abfrage enthält ( http://example.com/thing?asp=foo) Hängen Sie die ursprüngliche Abfragezeichenfolge an die umgeschriebene Zeichenfolge an. Normalerweise wird es verworfen. Wichtig für dynamischen Inhalt.
R = Umleiten. Stellen Sie eine HTTP-Umleitung zur angegebenen URL bereit. Kann auch einen genauen Weiterleitungscode bereitstellen [R = 303]. Sehr ähnlich RedirectMatch
, was schneller ist und wenn möglich verwendet werden sollte.
S = Überspringen. Überspringe diese Regel.
T = Typ. Geben Sie den MIME-Typ des zurückgegebenen Inhalts an. Sehr ähnlich der AddType
Richtlinie.
Weißt du, wie ich sagte, dass dies RewriteCond
nur für eine Regel gilt? Nun, das können Sie umgehen, indem Sie sie verketten.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Da die erste RewriteRule das Chain-Flag hat, wird die zweite RewriteRule ausgeführt, wenn die erste dies tut. Dies ist der Fall, wenn die vorherige RewriteCond-Regel übereinstimmt. Praktisch, wenn Apache-reguläre Ausdrücke Ihr Gehirn verletzen. Die All-in-One-Line-Methode, auf die ich im ersten Abschnitt verweise, ist jedoch unter dem Gesichtspunkt der Optimierung schneller.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Dies kann durch Flags vereinfacht werden:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
Einige Flags gelten auch für RewriteCond. Vor allem NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
Entspricht "ServerFault.com"