Dokumentacja Kursy i specyfikacje

mod_rewrite

RewriteCond

Używając komendy RewriteCond można zdefiniować dodatkowe warunki, które muszą być spełnione, aby zostało wykonane jedno polecenie RewriteRule.

RewriteCond co_sprawdzamy maska_dopasowania

Przykład:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^artykul/ [NC]
RewriteRule ^artykul/([a-zA-Z]+)/?$ /wyswietl.php?artykul=$1 [L]

Jak widać, zmodyfikowaliśmy nasz przykład. Linia druga sprawdza, czy wywoływany adres zaczyna się od "artykul/" - jeśli tak, wykona pierwszą komendę RewriteRule, którą napotka. Flaga NC informuje parser, że ignorujemy wielkość liter.

W następnej linii widzimy znaną nam komendę RewriteRule. Została ona jednak lekko zmodyfikowana. ^artykul/([a-zA-Z]+)/?$ - jak widać po znaku / pojawił się znak zapytania. Zgodnie ze składnią wyrażeń regularnych, informuje on, że znak który go poprzedza może wystąpić lub nie. W ten sposób załatwiamy sprawę linków, które mogą posiadać kończący slash lub nie. Pojawiła się również flaga L, która oznacza zakończenie wykonywania przepisywania – jeżeli w następnych liniach znajdują się kolejne komendy RewriteRule czy RewriteCond to nie zostaną one wykonane. Aby lepiej to zrozumieć, posłużymy się innym przykładem. Jeśli posiadasz popularny serwis WWW, na pewno zetknąłeś się ze zjawiskiem linkowania z obcych serwisów do Twoich obrazków (plików graficznych). Jest to nadużycie, które dodatkowo generuje ruch na Twoim serwerze. Jak się przed tym zabezpieczyć? Można wykorzystać mod-rewrite:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www\.)?twojadomena\.pl [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^http://.*$
RewriteRule \.(jpe?g|gif|bmp|png)$ /obrazki/kradziez.png [L]

Wszystkie trzy komendy RewriteCond sprawdzają wartość zmiennej HTTP_REFERER:

  1. Sprawdza, czy wartość jest inna od twojej domeny, w której działa serwis (linia druga),
  2. Sprawdza, czy wartość czasem nie jest pusta. Pusta wartość oznacza przeważnie, że ktoś w przeglądarce wpisał odnośnika ręcznie. Takich wywołań nie chcemy blokować (linia trzecia),
  3. Sprawdza, czy zawartość tej zmiennej w ogóle zawiera adres URL. Niektóre oprogramowanie podmienia wartość HTTP_REFERER na zwykły tekst (np. oprogramowanie typu firewall). Takich wywołań również nie chcemy blokować (linia czwarta).

Jeśli te trzy warunki są spełnione, wykonywana jest komenda RewriteRule, która dla wszystkich adresów odwołujących się do obrazków, odpowiada wysyłając nowy adres, który wskazuje na obrazek informujący o kradzieży.

Sprawdzanie rodzaju połączenia

Używając mod_rewrite'a możemy sprawdzić, czy użytkownik wywołując daną stronę łączy się po SSL. Jeśli nie, możemy takie połączenie wymusić.

RewriteEngine On
RewriteCond %{HTTPS} !^on$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R]

Uzależnienie przepisania od czasu

Czasami zachodzi potrzeba przekierowania osoby na stronę specjalną w zależności od aktualnego czasu.

RewriteEngine On
RewriteCond %{TIME_HOUR} >20
RewriteCond %{TIME_HOUR} <8
RewriteRule .* /nieczynne.html [R]

Taką regułę można zastosować np. w przypadku sklepu, który działa tylko w godzinach od 8 do 20 (wtedy jest obsługa techniczna). Poza tymi godzinami, niezależnie od wpisywanego adresu, przekierowujemy użytkownika na stronę nieczynne.html