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.

RewriteLog "/var/log/httpd/rewrite.log"

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.

RewriteLogLevel 3

Przykładowe zastosowanie

W pliku .htaccess zapisaliśmy przykładową regułę:

RewriteCond %{HTTPS} ^on$
RewriteCond %{REQUEST_URI} ^html [NC]
RewriteRule ^(.*)$ http://www.domena.com/html/$1 [R=301,L]

Nie działa ona nam poprawnie i chcemy przeanalizować, co się dzieje. W konfiguracji hosta wirtualnego dla tej aplikacji dopisujemy znane już nam dyrektywy:

<VirtualHost 100.100.100.100:443>
        ServerName domena.com
        DocumentRoot /home/domena.com/htdocs
        RewriteLog /var/log/httpd/rewrite.log
        RewriteLogLevel 5
        [...]
</VirtualHost>

Po restarcie serwera w pliku, zobaczymy przykładowy log:

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

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.

Podobne artykuły

  • Admn

    Takich artykułów właśnie mi brakowało. Dzięki i czekam na więcej.

    PS. Ankietę wypełniłem :P

  • TomJ

    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 :/