Dodatkowe warunki dopasowania w mod_rewrite


Używając komendy RewriteCond można zdefiniować dodatkowe warunki, które muszą być spełnione, aby wykonane zostały reguły (RewriteRule).

Składnia tej komendy wygląda następująco:

RewriteCond sprawdzany_parametr warunek flagi
  • sprawdzany_parametr – używamy tu zmiennej globalnej,
  • warunek – wyrażenie regularne dopasowywane do sprawdzanego parametru (zmiennej globalnej),
  • flagi – ich występowanie jest opcjonalne. Wyróżniamy 2 flagi:
    • [NC] – nocase (ignorowanie wielkości liter),
    • [OR] – warunek logiczny „lub”.
WAŻNE! Warunków może być wiele, domyślnie (czyli bez flagi [OR]) przyjmowana jest zasada, że wszystkie wymienione po sobie warunki (występujące przed RewriteRule) muszą być spełnione.
WAŻNE! Wykaz najbardziej popularnych zmiennych znajdziesz w tym artykule.

Przykład:

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

Jak widać przykład został nieco zmodyfikowany. Linia druga sprawdza, czy wywoływany adres zaczyna się od “artykul/” – jeśli tak, wykona pierwszą komendę RewriteRule, którą napotka poniżej. Flaga NC informuje parser, że ignorujemy wielkość liter.

Natomiast w następnej linii  (trzeciej) widzimy znaną nam komendę RewriteRule. Została ona jednak lekko zmodyfikowana.

  • Pojawiła się fraza “^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 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

Jakie artykuły na temat mod_rewrite znajdę w dokumentacji home.pl?

  • Czy artykuł był pomocny ?
  • Tak   Nie

Tematy powiązane

Szukaj
Generic filters
Tylko dokładne dopasowania
Szukaj w tytułach
Szukaj w treści
Wyświetl posty typu:
lub