Htaccess – zmienne mod_rewrite

W codziennej pracy do swobodnego poruszania się w regułach .htaccessa wystarczy kilka zmiennych. Poznaj 5 najczęściej używanych zmiennych – to niewiele i warto je znać.

Ten artykuł dotyczy modułu mod_rewrite i opisuje tylko najczęściej używane zmienne. Ich zawartość może być dowolnie ustawiana przez Użytkownika – miej to na uwadze!

Zmienne te przechowują m.in. żądania klienta oraz ustawienia serwera na których się tutaj skupimy. Zapisywane są wielkimi literami i aby ich użyć w regule obejmujemy je w nawiasy klamrowe, poprzedzając je symbolem procenta, np. RewriteCond %{REQUEST_URI} . Ich zawartość możesz podejżeć np. wstawiając zestaw reguł do „debugowania” .htaccessa.

REQUEST_URI

Ta zmienna zawiera tylko ścieżkę z zapytania, np. dla /htaccess-variables-top-5?lang=pl będzie to „/htaccess-variables-top-5” bez dodatkowych parametrów zapytania ( „?lang=pl” ).

# Dopasuje każde odpytanie adresu zaczynającego się od /htaccess-variables
RewriteCond %{REQUEST_URI} ^/htaccess-variables
RewriteRule .* /cel-przekierowania [R=301,L]

Jak widać, zmienna ta oferuje nam do porównania podobną zawartość jak zwykłe użycie RewriteRule. Należy jednak pamiętać, że wartość do jakiej RewriteRule będzie testowała wyrażenie regularne zależy od kontekstu w jakim się znajduje. Co prawda umieszczona w pliku .htaccess znajdującym się w katalogu głównym strony (np. public_html) wartość ta jest zbliżona do %{REQUEST_URI}, bo nie posiada tylko poprzedzającego ukośnika (ang. slash). Jednak jeśli umieścimy taką regułę w podkatalogu (np. public_html/images) i sprawdzimy co znajduje się pod adresem /images/kot.webp to odkryjemy, że w RewriteRule znajduje się tylko „kot.webp”, gdy w %{REQUEST_URI} nadal jest pełna ścieżka, „/images/kot.webp”.

QUERY_STRING

Ta zmienna zawiera tylko dodatkowe parametry zapytania, np. w adresie /htaccess-variables-top-5?lang=pl będzie to fragment „lang=pl” (bez znaku zapytania).

# Dopasuje każde odpytanie adresu zawierającego tylko parametr "lang=pl"
RewriteCond %{QUERY_STRING} ^?lang=pl$
RewriteRule .* /cel-przekierowania [R=301,L]

Jak widać, tym razem nie możemy użyć samej reguły RewriteRule, bo jej wartość nigdy nie zawiera dodatkowych parametrów żądania. Taka konstrukcja jest często używana, np. do sprawdzania filtrów w sklepie.

THE_REQUEST

Ta zmienna zawiera pełną linię zapytania, jakie wysłała przeglądarka do serwera, czyli metodę, adres i protokół:

GET /htaccess-variables-top-5 HTTP/1.1

Możemy użyć jej w następujący sposób (pamiętaj o poprzedzeniu spacji znakiem ucieczki (ang. escape character) „\” ):

# Dopasuje każde odpytanie adresu /htaccess-variables metodą GET - tak jak teraz został załadowany ten artykuł
RewriteCond %{THE_REQUEST} ^GET\ /htaccess-variables
RewriteRule .* /cel-przekierowania [R=301,L]

# Gdyby jednak ten artykuł posiadał formularz, to po jego przesłaniu metodą POST zadziałałaby poniższa reguła:
RewriteCond %{THE_REQUEST} ^POST\ /htaccess-variable
RewriteRule .* /cel-przekierowania [R=301,L]

Jak widać dysponujemy tutaj pełnym zapytaniem, więc tworząc trochę bardziej skomplikowane wyrażenia regularne mamy dostęp zarówno do REQUEST_URI, QUERY_STRING a nawet metody zapytania.

HTTP_HOST

Ta zmienna zawiera nazwę hosta, czyli wartość pomiędzy protokołem (np. „http://”) a ścieżką (np. /index.php). Możemy jej użyć np. do przekierowania między wersjami „z www” na „bez www”:

# Jeśli klient odpytuje wersję "www.bwrite.pl" to przekieruj go do "bwrite.pl"
RewriteCond %{HTTP_HOST} !^bwrite\.pl$
RewriteRule ^ https://bwrite.pl%{REQUEST_URI} [L,R=301]

HTTPS

Zmienna %{HTTPS} może zawierać tylko dwie wartości. Wartość „on” gdy połączenie używa protokołu SSL/TLS lub wartość „off” jeśli go nie używa. Przydatna np. w przekierowaniu na wersję https serwisu:

# Jeśli połączenie nie jest po https, przekieruj na takie
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

W powyższej regule RewriteRule może wydawać się że brakuje jeszcze zmiennej %{QUERY_STRING}. Otóż tym nie musimy się martwić, podczas przekierowań parametry zapytania są przenoszone automatycznie.

Inne zmienne

Pełną listę zmiennych wraz z krótkimi przykładami znajdziesz na stronie AskApache.com . Inne zmienne mod_rewrite dają dostęp również do ciasteczek, referera czy danych o certyfikacie SSL.