kolejność składni mod_rewrite
mod_rewrite ma pewne szczególne reguły porządkowania, które wpływają na przetwarzanie. Zanim cokolwiek zostanie zrobione, RewriteEngine On
należy podać dyrektywę, ponieważ włącza to przetwarzanie mod_rewrite. Powinno to nastąpić przed innymi dyrektywami przepisującymi.
RewriteCond
poprzedzanie RewriteRule
powoduje, że JEDNA reguła podlega warunkom. Wszelkie poniższe RewriteRules będą przetwarzane tak, jakby nie podlegały warunkom.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
W tym prostym przypadku, jeśli strona odsyłająca HTTP pochodzi z serverfault.com, przekieruj żądania bloga na specjalne strony z błędami serwera (jesteśmy po prostu wyjątkowi). Jeśli jednak powyższy blok miał dodatkową linię RewriteRule:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Wszystkie pliki .jpg trafiałyby na specjalne strony błędów serwera, nie tylko te z odsyłaczem wskazującym, że pochodzą stąd. Wyraźnie nie jest to celem pisania tych zasad. Można to zrobić za pomocą wielu reguł RewriteCond:
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
Ale prawdopodobnie należy to zrobić przy użyciu nieco trudniejszej składni zastępczej.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Bardziej złożona RewriteRule zawiera warunki do przetwarzania. Ostatni w nawiasach (html|jpg)
mówi RewriteRule, aby pasował do jednego html
lub jpg
, i reprezentował dopasowany ciąg jako 2 $ w przepisanym ciągu. Jest to logicznie identyczne z poprzednim blokiem, z dwiema parami RewriteCond / RewriteRule, po prostu robi to w dwóch liniach zamiast czterech.
Wiele linii RewriteCond jest domyślnie ANDed i może być jawnie ORed. Aby obsłużyć strony odsyłające zarówno w przypadku błędu serwera, jak i superużytkownika (jawne LUB):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Aby obsługiwać strony, o których mowa w ServerFault, w przeglądarkach Chrome (domyślnie AND):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
jest również specyficzny dla zamówienia, ponieważ określa, w jaki sposób następujące RewriteRule
dyrektywy obsługują ich przetwarzanie. Jest to bardzo przydatne w plikach .htaccess. Jeśli jest używana, powinna to być pierwsza dyrektywa pod „RewriteEngine on” w pliku .htaccess. Weź ten przykład:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Mówi to mod_rewrite, że ten konkretny adres URL, który obecnie obsługuje, został dostarczony za pośrednictwem http://example.com/blog/ zamiast fizycznej ścieżki katalogu (/ home / $ Username / public_html / blog) i odpowiednio go traktować. Z tego powodu RewriteRule
uważa, że ciąg znaków zaczyna się od „/ blog” w adresie URL. Oto ta sama rzecz napisana na dwa różne sposoby. Jeden z RewriteBase, drugi bez:
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
Jak widać, RewriteBase
pozwala przepisać reguły, aby wykorzystać ścieżkę witryny do treści zamiast do serwera , co może uczynić je bardziej zrozumiałymi dla tych, którzy edytują takie pliki. Mogą także skracać dyrektywy, co ma walory estetyczne.
RewriteRule dopasowywanie składni
Sam RewriteRule ma złożoną składnię do dopasowywania ciągów. Omówię flagi (takie jak [PT]) w innej sekcji. Ponieważ Sysadmini uczą się na przykładach częściej niż czytając stronę podręcznika, podam przykłady i wyjaśnię, co robią.
RewriteRule ^/blog/(.*)$ /newblog/$1
.*
Konstrukcja pasuje do każdego pojedynczego znaku ( .
) zero lub więcej razy ( *
). Zamknięcie go w nawiasie nakazuje podanie ciągu, który został dopasowany jako zmienna 1 $.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
W tym przypadku pierwszy. * NIE został ujęty w parens, więc nie jest dostarczany do przepisanego łańcucha. Ta reguła usuwa poziom katalogu na nowej stronie blogu. (/blog/2009/sample.html zmienia się na /newblog/sample.html).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
W takim przypadku pierwsze wyrażenie w nawiasie tworzy dopasowaną grupę. Staje się to 1 USD, co nie jest potrzebne i dlatego nie jest używane w przepisanym ciągu.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
W tym przypadku używamy 1 $ w przepisanym ciągu.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Ta reguła używa specjalnej składni nawiasów, która określa zakres znaków . [0–9] odpowiada cyfrom od 0 do 9. Ta konkretna reguła będzie obsługiwać lata od 2000 do 2099.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Działa to tak samo jak poprzednia reguła, ale część {2} każe dwa razy dopasować poprzedni znak (w tym przypadku wyrażenie w nawiasie).
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Ten przypadek będzie pasował do każdej małej litery w drugim dopasowanym wyrażeniu i zrobi to dla jak największej liczby znaków. \.
Konstrukt informuje go traktować jako okres rzeczywistego okresu, a nie znak specjalny to w poprzednich przykładach. Jednak pęknie, jeśli nazwa pliku zawiera myślniki.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Przechwytuje nazwy plików z myślnikami. Ponieważ jednak -
jest znakiem specjalnym w wyrażeniach w nawiasach, musi być pierwszym znakiem w wyrażeniu.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Ta wersja przechwytuje każdą nazwę pliku z literami, cyframi lub -
znakiem w nazwie pliku. W ten sposób określasz wiele zestawów znaków w wyrażeniu nawiasowym.
Flagi RewriteRule
Flagi reguł przepisywania mają wiele specjalnych znaczeń i przypadków użycia .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
Flaga znajduje się [L]
na końcu powyższego wyrażenia. Można użyć wielu flag oddzielonych przecinkiem. Dokumentacja powiązana opisuje każdą z nich, ale tutaj i tak są:
L = ostatni. Przestań przetwarzać RewriteRules, gdy ten pasuje. Zamówienie się liczy!
C = łańcuch. Kontynuuj przetwarzanie następnej reguły RewriteRule. Jeśli ta reguła nie pasuje, następna reguła nie zostanie wykonana. Więcej na ten temat później.
E = Ustaw zmienną środowiskową. Apache ma różne zmienne środowiskowe, które mogą wpływać na zachowanie serwera WWW.
F = zabronione. Zwraca błąd 403, jeśli ta reguła jest zgodna.
G = Przeminęło. Zwraca błąd 410-Gone, jeśli reguła jest zgodna.
H = Handler. Wymusza obsługę żądania tak, jakby to był określony typ MIME.
N = Dalej. Wymusza regułę, aby zacząć od nowa i dopasować ponownie. BĄDŹ OSTROŻNY! Mogą wystąpić pętle.
NC = bez sprawy. Pozwalajpg
aby dopasować zarówno jpg, jak i JPG.
NE = Brak ucieczki. Zapobiega przepisywaniu znaków specjalnych (.? # I itp.) Na ich odpowiedniki w kodzie szesnastkowym.
NS = Brak żądań podrzędnych. Jeśli używasz dołączeń po stronie serwera, zapobiegnie to dopasowaniu do dołączonych plików.
P = Proxy. Wymusza obsługę reguły przez mod_proxy. Przejrzyste dostarczanie treści z innych serwerów, ponieważ Twój serwer internetowy pobiera je i ponownie obsługuje. Jest to niebezpieczna flaga, ponieważ źle napisana zmieni Twój serwer internetowy w otwarty serwer proxy i to jest złe.
PT = przejście. Uwzględnij instrukcje Alias w dopasowaniu RewriteRule.
QSA = QSAppend. Gdy oryginalny ciąg zawiera zapytanie ( http://example.com/thing?asp=foo) dołącz oryginalny ciąg zapytania do przepisanego ciągu. Zwykle byłby odrzucony. Ważne w przypadku treści dynamicznych.
R = Przekierowanie. Podaj przekierowanie HTTP na podany adres URL. Może również podać dokładny kod przekierowania [R = 303]. Bardzo podobny do RedirectMatch
, który jest szybszy i powinien być używany, gdy to możliwe.
S = Pomiń. Pomiń tę zasadę.
T = typ. Podaj typ MIME zwracanej treści. Bardzo podobny do AddType
dyrektywy.
Wiesz, jak powiedziałem, że RewriteCond
dotyczy jednej i tylko jednej reguły? Możesz to obejść, łącząc łańcuchy.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Ponieważ pierwsza RewriteRule ma flagę Łańcuch, druga reguła przepisywania zostanie wykonana, gdy zrobi to pierwsza, czyli wtedy, gdy dopasowana zostanie poprzednia reguła RewriteCond. Przydatne, jeśli wyrażenia regularne Apache powodują ból mózgu. Jednak metoda „wszystko w jednym wierszu”, którą wskazuję w pierwszej sekcji, jest szybsza z punktu widzenia optymalizacji.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Można to uprościć za pomocą flag:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
Ponadto niektóre flagi dotyczą również RewriteCond. W szczególności NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
Dopasuje „ServerFault.com”