Pisząc reguły RewriteRule (mod_rewrite), możemy napotkać sporo problemów, zwłaszcza kiedy jest ich wiele. Na szczęście serwer Apache udostępnia dwie opcje, które pomogą nam się zalogować i odszukać, jaki popełniliśmy błąd. Odpowiadają za to parametry RewriteLog oraz RewriteLogLevel. Dyrektywy te można dopisać w dwóch miejscach. Pierwszym z nich jest plik konfiguracyjny całego serwera, a drugim konfiguracja wirtualnego hosta.
Pierwsza (RewriteLog) dyrektywa ustawia plik, w jakim będą logowane dane pochodzące z modułu mod_rewrite
. Jeżeli nazwy pliku nie zaczniemy od znaczka (’/’), wtedy plik zostanie zapisany relatywnie do katalogu, ustawionego w dyrektywie Server Root
.
[bash]RewriteLog "/var/log/httpd/rewrite.log"[/bash]
Dyrektywa ta powinna pojawić się tylko raz w pliku konfiguracyjnym serwera. Jeżeli chcemy wyłączyć logowanie, najprościej jest skasować ten parametr lub ustawić RewriteLogLevel na wartość 0. Nie jest zalecane ustawianie pliku jako /dev/null
. Mimo, że nie będą zapisywane żadne dane na dysk, to dane będę i tak generowane, co może znacząco zwolnić pracę serwera.
Parametr RewriteLogLevel odpowiada za poziom logowania danych do pliku, gdzie 0 oznacza wyłączone logowanie, a 9 loguje każdą czynność serwera. Ustawiając bardzo wysokie wartości, możemy znacząco obciążyć serwer, dlatego zalecane jest korzystanie z wartości 2 lub 3. Dane logowane na tym poziomie, są wystarczające do analizy.
[bash]RewriteLogLevel 3[/bash]
Przykładowe zastosowanie
W pliku .htaccess zapisaliśmy przykładową regułę:
[bash]RewriteCond %{HTTPS} ^on$
RewriteCond %{REQUEST_URI} ^html [NC]
RewriteRule ^(.*)$ http://www.domena.com/html/$1 [R=301,L][/bash]
Nie działa ona nam poprawnie i chcemy przeanalizować, co się dzieje. W konfiguracji hosta wirtualnego dla tej aplikacji dopisujemy znane już nam dyrektywy:
[bash]<VirtualHost 100.100.100.100:443>
ServerName domena.com
DocumentRoot /home/domena.com/htdocs
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 5
[…]
</VirtualHost>[/bash]
Po restarcie serwera w pliku, zobaczymy przykładowy log:
[bash]193.238.93.130 – – [30/Dec/2011:09:28:00 +0000] [domena.com/sid#2b331f133bb0][rid#2b332e1ea980/initial] (4) [perdir /home/domena.com/htdocs/html/] RewriteCond: input=’on’ pattern=’^on$’ => matched
193.238.93.130 – – [30/Dec/2011:09:28:00 +0000] [domena.com/sid#2b331f133bb0][rid#2b332e1ea980/initial] (4) [perdir /home/domena.com/htdocs/html/] RewriteCond: input=’/html/pricing.html’ pattern=’^html’ [NC] => not-matched[/bash]
Z powyższego logu możemy wyczytać następujące informacje:
Opis | Przykład |
Adres hosta jaki wywołał URL | 193.238.93.130 |
Zdalny login | Zazwyczaj będzie to „-„ |
Autoryzacja HTTP | Nazwa użytkownika lub „-” w przypadku braku logowania |
Data i czas żądania (request) | [30/Dec/2011:09:28:00 +0000] |
Wirtualny host oraz jego ID | [domena.com/sid#2b331f133bb0] |
ID żądania (request) | [rid#2b332e1ea980/initial] |
Poziom logowania | (4) |
Treść błędu | [perdir /home/domena.com/htdocs/html/] RewriteCond: input=’/html/pricing.html’ pattern=’^html’ [NC] => not-matched |
Dzięki temu wiemy, jaki błąd popełniliśmy, (input='/html/pricing.html' pattern='^html' [NC] => not-matched
) tworząc regułę (RewriteCond %{REQUEST_URI} ^html [NC]
).
Jeżeli w logach Apacha widzimy błąd, RewriteLog not allowed here
oznacza to, że dodaliśmy dyrektywy w złym miejscy. Najprawdopodobniej w pliku .htaccess
.
Takich artykułów właśnie mi brakowało. Dzięki i czekam na więcej.
PS. Ankietę wypełniłem :P
Polecam bo to się bardzo przydaje. Warto pamiętać, że poziom logowania 3 już wystarcza do odszukania problemu.
Przyda się bo mi częśto nie działa jakiś rewrite na mojej stronce :/