Metasymbole
Przykład:
RewriteRule ^old(.*)$ /new.php [L,R=301]
Służą do definiowania grup znaków lub „metek” w szablonie. Na przykład metki początku lub końca linii.
| \ | Ukośnik „ekranujący”. Znak następujący po nim jest traktowany jako zwykły, a nie jako znak specjalny. Znak \ umieszcza się przed znakami specjalnymi, jeśli są one potrzebne w swojej pierwotnej formie. Na przykład wyrażenie „jpe\+g” odpowiada tylko jednemu stringowi „jpe+g”. |
| ^ | Znak ^ oznacza początek linii. |
| $ | Znak $ oznacza koniec linii. |
| ! | Znak zaprzeczenia. |
| . | Znak . oznacza dowolny znak (z wyjątkiem znaku końca linii). |
| .* | Zastępuje dowolny ciąg znaków |
| ".*" | Znajduje wszystkie podciągi między cudzysłowami |
| | | Znak | oznacza alternatywę. Na przykład wyrażenia „A|B” i „(ABC|DEF)” oznaczają odpowiednio „A lub B” oraz „ABC lub DEF”. |
| () | Nawiasy okrągłe () służą do wyodrębniania grup znaków. |
| [...] | Nawiasy kwadratowe [] służą do wyliczania dozwolonych znaków. Na przykład wyrażenie „[abc]” jest równoważne wyrażeniu „a|b|c”, ale wersja z nawiasami kwadratowymi jest zazwyczaj bardziej wydajna. Wewnątrz nawiasów można stosować zakresy: na przykład wyrażenie „[0-9]” jest równoważne wyrażeniu „[0123456789]”. |
| [^...] | Zaprzeczona klasa znaków. Jeśli znaki wewnątrz nawiasów kwadratowych zaczynają się od znaku ^, oznacza to dowolny znak, z wyjątkiem tych wymienionych w nawiasach. Na przykład wyrażenie „[^0-9]+” oznacza ciąg składający się z dowolnych znaków, z wyjątkiem cyfr. |
| [...]* | Na przykład [abc]* — polecenie znajdzie kolejne znaki z podanego zbioru. [^abc]* — dokładnie odwrotnie. |
| \w | Litera, cyfra lub podkreślenie _. |
| \d | Zastępuje dowolną cyfrę. |
| \D | Zastępuje dowolny znak, ale nie cyfrę. |
| [0-9] | Zastępuje dowolną cyfrę. |
| [a-z] | Dowolna litera od a do z (cały zestaw znaków łacińskich) w małych literach. |
| [A-Z] | Dowolna litera od A do Z w WIELKICH literach. |
| [a-zA-Z] | Dowolna litera od a do Z w dowolnej wielkości liter. [a-Z] — to samo. |
Dopełnienie. Wszystko, co znajduje się po znaku '#', jest traktowane jako komentarz.
Modyfikatory
Przykład:
RewriteRule (.*) $1? [R=301,L]
Modyfikatory stosuje się po zwykłych znakach, znakach specjalnych lub ich grupach i pozwalają rozszerzyć możliwości szablonów w celu uruchamiania reguł.
| ? | Symbol powtarza się 0 lub 1 raz. Symbol ? umieszcza się po symbolu (lub grupie symboli), który może być obecny lub nieobecny. Na przykład wyrażeniu "jpe?g" pasują zarówno ciąg "jpg", jak i "jpeg". |
| * | Powtarza się od 0 do 65536 razy. Symbol * umieszcza się po symbolu (lub grupie symboli), który może być nieobecny lub występować nieograniczoną liczbę razy z rzędu. Na przykład wyrażeniu "jpe*g" pasują ciągi "jpg", "jpeg" oraz "jpeeeeeeg". |
| + | Powtarza się od 1 do 65536 razy. Symbol + działa analogicznie do symbolu *, z tą różnicą, że poprzedzający go symbol musi być obecny co najmniej raz. Na przykład wyrażeniu "jpe+g" pasują ciągi "jpeg" i "jpeeeeg", ale nie "jpg". |
| {n} | Dokładnie n razy. |
| {n,} | Od n do 65536 razy włącznie. |
| {n,m} | Od n do m razy włącznie. |
Przykłady użycia:
^stena
Dowolne ciągi zaczynające się od słowa stena. Ciąg zaczynający się od słowa dom-stena nie spełni kryterium.
stena$
Dowolne ciągi kończące się zestawem symboli stena. Ciąg kończący się na stena-dom nie zostanie dopasowany.
.*
Dowolny symbol powtarzany dowolną liczbę razy. Pod kryterium podpadną wszystkie ciągi.
^(.*)$
Dopasować dowolny ciąg i zapisać go jako zmienną $1 do późniejszego użycia.
[0-9]{1,6}$
Dopasować wszystkie ciągi kończące się od 1 do 6 cyfr z zakresu od 0 do 9.
^(.+)/(.+)$
Podzielić ciąg na dwie części: przed ukośnikiem i po nim; części ciągu będą dostępne pod zmiennymi $1 i $2.
Ważne! Ponieważ modyfikator jest zachłanny, do pierwszej grupy trafi maksymalna liczba symboli spełniających wzorzec. Ukośnik jest takim samym symbolem jak wszystkie pozostałe.
Przykład użycia:
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
Flagi
Przykład:
RewriteRule ^htaccess-fake$ - [G] RewriteRule (.*) page.php\?%1 [L]
Flagi to dodatkowe opcje. Wymienia się je w nawiasach kwadratowych, oddzielone przecinkiem, np. [NC] lub [R=301,L].
| R | (redirect) zatrzymuje proces przekształcania i zwraca wynik klientowi przeglądarki jako przekierowanie do tej strony (302, MOVED TEMPORARY). Dzięki tej flagi można podać inny kod odpowiedzi, np. „R=301” spowoduje przekierowanie z kodem 301 (MOVED PERMANENTLY). |
| F | (forbidden) zwraca błąd 403 (FORBIDDEN). |
| G | (gone) zwraca błąd 410 (GONE). |
| P | (proxy) – dzięki tej flagi Apache wykonuje podżądanie (sub-request) do wskazanej strony przy użyciu modułu mod_proxy, przy czym użytkownik nie dowiaduje się o tym podżądaniu. Jeśli moduł mod_proxy nie jest częścią Twojej kompilacji Apache, użycie tej flagi spowoduje błąd. |
| L | (last) zatrzymuje proces przekształcania, a bieżąca reguła jest uznawana za ostateczną. |
| N | (next) uruchamia proces przekształcania od pierwszej reguły w kolejności. |
| C | (chain) łączy kilka reguł w łańcuch. Jeśli pierwsza reguła w łańcuchu „nie zostanie spełniona”, cały łańcuch jest ignorowany. |
| NS | (nosubreq) pozwala na „spełnienie” reguły tylko dla prawdziwych żądań, ignorując podżądania (podżądanie może zostać wywołane np. przez dołączenie pliku za pomocą dyrektywy SSI). |
| NC | (nocase) wyłącza sprawdzanie wielkości liter podczas spełniania reguły. |
| QSA | (qsappend) dodaje oryginalne parametry żądania (query string) do zastąpienia. Jeśli zastąpienie nie zawiera nowych parametrów żądania, oryginalne parametry żądania są dodawane automatycznie. Jeśli jednak zawiera, to bez flagi QSA oryginalne parametry żądania zostaną utracone. |
| PT | (passthrough) zatrzymuje proces przekształcania i przekazuje otrzymany nowy adres URL dalej „wzdłuż łańcucha”, aby mogły go przetworzyć dyrektywy takie jak Alias, ScriptAlias, Redirect itp. (w przypadku flagi L nowy adres URL jest uznawany za ostateczny i nie podlega dalszej obróbce). |
| S | (skip) pomija następną regułę, jeśli dana reguła została „spełniona”. Można pominąć kilka reguł, podając ich liczbę, np.: „S=3”. |
| E | (env) ustawia zmienną środowiskową, np.: „E=zmienna:wartość”. |
Sprawdzania warunków
Przykład:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !
RewriteCond %{REQUEST_FILENAME}\.html
RewriteRule ^(.*)$ $1.php
W warunkach można użyć następujących sprawdzeń:
1. Możesz poprzedzić wzorzec symbolem '!', aby oznaczyć brak dopasowania do wzorca.
2. Można wykonać porównanie leksykograficzne ciągów znaków:
| <Warunek | Leksykograficznie mniejsze |
| >Warunek | Leksykograficznie większe |
| = Warunek | Równość |
| <= Warunek | Leksykograficznie mniejsze lub równe |
| >= Warunek | Leksykograficznie większe lub równe |
3. Porównanie jako liczb całkowitych:
| -eq | Równa liczbowo |
| -ge | Większa lub równa liczbowo |
| -gt | Większa liczbowo |
| -le | Mniejsza lub równa liczbowo. Aby uniknąć pomyłki z wielką literą -l, użyj -L |
| -lt | Mniejsza liczbowo. Aby uniknąć pomyłki z wielką literą -l, użyj -L |
4. Testy różnych atrybutów plików:
| -d | Czy jest katalogiem. |
| -f | Czy jest zwykłym plikiem. |
| -F | Czy plik istnieje. |
| -l | Czy jest dowiązaniem symbolicznym. |
| -L | Czy jest dowiązaniem symbolicznym. Odpowiednik flagi -l. |
| -s | Czy jest zwykłym plikiem o rozmiarze niezerowym |
| -U | Czy podany URL istnieje |
| -x | Czy plik jest wykonywalny. |
5. Wszystkie te sprawdzenia mogą być poprzedzone prefiksem wykrzyknika ('!') w celu odwrócenia ich wartości.
Zmienne
Przykład:
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
| HTTP_USER_AGENT | Zawiera informacje o typie i wersji przeglądarki oraz systemu operacyjnego odwiedzającego. |
| HTTP_REFERER | Podaje adres strony, z której użytkownik przeszedł na tę stronę. |
| HTTP_COOKIE | Lista plików COOKIE przesyłanych przez przeglądarkę |
| HTTP_FORWARDED | Strona, z której użytkownik bezpośrednio przeszedł |
| HTTP_HOST | Adres serwera, np. host.com |
| HTTP_ACCEPT | Opisuje preferencje klienta dotyczące typu dokumentu. |
| REMOTE_ADDR | Adres IP odwiedzającego. |
| REMOTE_HOST | Adres odwiedzającego w normalnej formie — np. rt99.net.com |
| REMOTE_IDENT | Nazwa zdalnego użytkownika. Ma format nazwa.host, np. kondr.www.rtt99.net.com |
| REMOTE_USER | Takie samo jak REMOTE_IDENT, ale zawiera tylko nazwę. Przykład: kondr |
| REQUEST_METHOD | Pozwala określić typ żądania (GET lub POST). Powinno być obowiązkowo analizowane, ponieważ określa dalszy sposób przetwarzania informacji. |
| SCRIPT_FILENAME | Pełna ścieżka do strony internetowej na serwerze. |
| PATH_INFO | Zawiera wszystko, co zostało przekazane do skryptu. |
| QUERY_STRING | Zawiera ciąg znaków przekazany jako żądanie podczas wywołania skryptu CGI. |
| AUTH_TYPE | Używany do identyfikacji użytkownika |
| DOCUMENT_ROOT | Zawiera ścieżkę do katalogu głównego serwera. |
| SERVER_ADMIN | Adres e-mail właściciela serwera podany podczas instalacji. |
| SERVER_NAME | Adres serwera, np. kondr.host.com |
| SERVER_ADDR | Adres IP Twojej strony internetowej. |
| SERVER_PORT | Port, na którym działa Apache. |
| SERVER_PROTOCOL | Wersja protokołu HTTP. |
| SERVER_SOFTWARE | Nazwa serwera, np. Apache/1.3.2 (Unix) |
| TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME | Zmienne przeznaczone do pracy z czasem w różnych formatach. |
| API_VERSION | Jest to wersja API modułu Apache (wewnętrzny interfejs między serwerem a modułem) w bieżącej kompilacji serwera, zdefiniowana w pliku include/ap_mmn.h. |
| THE_REQUEST | Pełny ciąg żądania HTTP wysłany przez przeglądarkę do serwera (tj. „GET /index.html HTTP/1.1”). Nie zawiera żadnych dodatkowych nagłówków wysyłanych przez przeglądarkę. |
| REQUEST_URI | Zasób żądany w ciągu żądania HTTP. |
| REQUEST_FILENAME | Pełna ścieżka w systemie plików serwera do pliku lub skryptu odpowiadającego temu żądaniu. |
| IS_SUBREQ | Zawiera tekst „true”, jeśli żądanie jest obecnie wykonywane jako podżądanie, „false” w przeciwnym razie. Podżądania mogą być generowane przez moduły, które muszą obsługiwać dodatkowe pliki lub URI, aby wykonać własne zadania. |
Logika wykonania reguły (RewriteRule)
Wykonanie reguły oznacza następujące działania: najpierw mechanizm przekształceń wyszukuje dodatkowe warunki dla tej reguły (dyrektywy RewriteCond). Pamiętajmy, że z powodów historycznych warunki dodatkowe znajdują się przed regułami (RewriteRule). Jeśli dla tej reguły nie ma warunków dodatkowych, mechanizm przekształceń po prostu wykonuje wskazane w regule przekształcenie bieżącego URL i przechodzi do następnej reguły. Jednakże jeśli dla wykonywanej reguły (RewriteRule) istnieją warunki dodatkowe, określone PRZED NIMI w dyrektywach RewriteCond, uruchamiany jest wewnętrzny cykl przetwarzania tych warunków dodatkowych w kolejności, w jakiej są wymienione, od góry do dołu.
Jeśli co najmniej jeden z dostępnych dla reguły warunków dodatkowych NIE jest spełniony, prowadzi to do zatrzymania uruchomionego procesu wykonania reguły, a przekształcenie URL określone w regule NIE jest wykonywane. Aby reguła uruchomiona do wykonania została ukończona i zmieniła URL, konieczne jest, aby WSZYSTKIE warunki dodatkowe określone w dyrektywach RewriteCond przed tą regułą zostały spełnione!
Warto tutaj dodatkowo wyjaśnić, że dyrektywy RewriteCond domyślnie są łączone ze sobą operatorem AND w jeden złożony warunek. Po prostu ten operator (AND) nie jest zapisywany domyślnie. Stąd taka logika, że wszystkie warunki dodatkowe muszą być prawdziwe (ponieważ są łączone przez AND), aby przekształcenie URL zakończyło się pomyślnie. Jednak dyrektywy RewriteCond można łączyć warunkiem OR za pomocą flag (patrz składnia dyrektywy). Należy o tym pamiętać przy określaniu warunków dodatkowych.
Składnia dyrektywy RewriteRule:
RewriteRule Шаблон Подстановка [Флаги]
Przykład:
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
Gdzie:
1. RewriteRule – to nazwa dyrektywy – reguły.
2. Szablon - to właśnie ten warunek, którego spełnienie uruchamia wykonanie reguły. Ten warunek – Szablon – jest wyrażeniem regularnym zgodnym z Perl, które jest stosowane do bieżącego URL.
3. Podstawienie – to właśnie ten algorytm zmiany URL, czyli reguła zmiany (przekształcania) URL.
4. [Flagi] podstawienia – trzeci argument dyrektywy RewriteRule. Flagi to rozdzielone przecinkami, wielkie znaki specjalne, zamknięte w nawiasach kwadratowych. Flagi uzupełniają przekształcenie URL.
Parametry w regule są zapisywane w jednym wierszu, zaczynając od nazwy dyrektywy, a oddzielone są od siebie spacją.
Teraz przeanalizujmy przykład reguły RewriteRule:
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
1. ^(.*)$ - to Szablon, wyrażenie regularne, które zostanie zastosowane do bieżącego adresu URL. Osoby zaznajomione z wyrażeniami regularnymi mogą odczytać go w następujący sposób: wyszukaj w bieżącym ciągu adresu URL od początku linii (znak ^) do końca linii (znak $) dowolny znak (znak .) w ilości od zera do nieskończoności (znak *). Ponieważ to wyrażenie regularne zawiera nawiasy (), część adresu URL, która spełni warunek w nawiasach, zostanie przechwycona do zmiennej podstawienia $1, której będziemy mogli później użyć w Podstawieniu lub w PorównywanyCiąg (jest to w dyrektywie RewriteCond, o której poniżej).
2. index.php?/$1 - Podstawienie – to właściwie jest reguła przekształcania adresu URL. Zapis index.php?/$1 oznacza, że ciąg nowego, przekształconego adresu URL powinien być złożony z dwóch części, gdzie pierwsza część ciągu to stała wartość index.php?/ a druga część ciągu to wartość ze zmiennej podstawienia $1. Tutaj przypominamy sobie, że w $1 zawarta jest ta część adresu URL, która odpowiadała wyrażeniu regularnemu w nawiasach z parametru Szablon. W rezultacie otrzymujemy przekształcony adres URL w postaci index.php?/URL, pod który nastąpiło odwołanie. Inaczej mówiąc, dla wszystkich żądań wykonywane jest wewnętrzne przekierowanie do pliku index.php.
3. [L,QSA] – flagi, gdzie 'last|L' - ostatnia reguła, co oznacza - zatrzymaj proces przekształcania w tym miejscu i nie stosuj żadnych kolejnych reguł przekształceń dla adresu URL. 'qsappend|QSA' - dodaj ciąg zapytania - Ta flaga wskazuje mechanizmowi przekształceń na dodanie, a nie zastąpienie, ciągu zapytania z adresu URL do istniejącego, w ciągu Podstawienia. Używaj tego, gdy chcesz dodawać dodatkowe dane do ciągu zapytania za pomocą dyrektyw przekształceń.
Skróty
Skrót do mod_rewrite
Skrót do mod_rewrite zawiera listę flag dla dyrektyw RewriteRule i RewriteCond, listę zmiennych serwera, przewodnik po wyrażeniach regularnych oraz kilka przykładów ogólnych reguł.
- Pobierz w formacie PDF ~79 KB
- Pobierz w formacie PNG ~79 KB
Skrót do wyrażeń regularnych
Skrót stanowi ogólne przewodnik po szablonach wyrażeń regularnych bez uwzględnienia specyfiki żadnego języka.
- Pobierz w formacie PDF ~96 KB
- Pobierz w formacie PNG ~81 KB
Podsumowanie
Pamiętaj o uciekaniu znaków specjalnych w wyrażeniu regularnym. Czasami zapomina się uciekać kropkę, gdy powinna ona występować jako kropka, a nie zgodnie z konwencją wyrażeń regularnych - jako dowolny znak.
Ponadto pamiętaj, aby zamknąć cały blok reguł dla mod_rewrite w znaczniku: <IfModule mod_rewrite.c></IfModule>
Nie dodawaj niepotrzebnie wielu dyrektyw dla mod_rewrite; stosuj tylko te reguły przekształceń, które są Ci naprawdę potrzebne. Szczególną ostrożność należy zachować przy zewnętrznych przekierowaniach – są to przekierowania realizowane poprzez wysłanie do klienta nagłówka serwera z kodem innym niż 200 (czyli bez dostarczania pełnej strony), a z innym kodem (najczęściej 301 lub 302), co powoduje przekierowanie przeglądarki klienta na inny adres URL, czyli wykonanie nowego żądania po stronie klienta.
Każde zewnętrzne przekierowanie zawsze wiąże się z dodatkowym czasem przetwarzania żądania, ponieważ należy wysłać do klienta odpowiedź, którą on musi odczytać, a następnie ponowić żądanie pod nowym adresem URL. Jest to operacja wymagająca dodatkowego czasu. Dlatego przekierowania powinny być stosowane wyłącznie wtedy, gdy są naprawdę konieczne.
