cze 1 2009

Reguły z mod_rewrite nie działają modułem userdir (Apache,Debian, Linux)

Apache LinuxParę dni temu znajomy poprosił mnie o pomoc przy uruchomieniu modułu mod_rewrite w Apache’u który dostarczony jest z Debianem. Problem przejawiał się tym, że nie działało przekierowywanie stron ładowanych modułem userdir (przykładowy adres strony: http://localhost/~uzytkownik/). Opiszę kroki jakie trzeba wykonać aby temat rozwiązać:

Najpierw sprawdźmy czy moduły rewrite i userdir są ładowane podczas uruchomienia Apache. Odpalamy funkcję phpinfo() i szukamy sekcji apache2handler, wiersza Loaded Modules. Tam, wśród różnych opcji, powinny znajdować się dwa interesujące nas pozycje (mod_rewrite oraz mod_userdir).

Jeżeli ich tam nie ma, przechodzimy do katalogu /etc/apache2/mods-enabled/, sprawdzając czy zawiera dowiązania symboliczne ładujące odpowiednie rzeczy:

1
2
3
4
root@venoma:/etc/apache2/mods-enabled# ls -al rewrite* userdir*
lrwxrwxrwx 1 root root 30 06-01 02:09 rewrite.load -> ../mods-available/rewrite.load
lrwxrwxrwx 1 root root 30 05-26 18:14 userdir.conf -> ../mods-available/userdir.conf
lrwxrwxrwx 1 root root 30 05-26 18:14 userdir.load -> ../mods-available/userdir.load

Jeżeli ich tam nie ma, tworzymy je poleceniem:

1
2
3
root@venoma:/etc/apache2/mods-enabled# ln -s ../mods-available/userdir.load
root@venoma:/etc/apache2/mods-enabled# ln -s ../mods-available/userdir.conf
root@venoma:/etc/apache2/mods-enabled# ln -s ../mods-available/rewrite.load

Restartujemy Apache:

1
/etc/init.d/apache2 restart

i ponownie odpalamy phpinfo(). Moduły powinny być już załadowane (założyłem tutaj, że odpowiednie pliki znajdują się w katalogu /etc/apache2/mods-available/)

Teraz otwieramy plik /etc/apache2/sites-available/default. W tymże pliku szukamy linii z opcją AllowOverride w sekcji <Directory /> , aby rewrite działał poprawnie, powinna ona wyglądać tak

1
AllowOverride All

Kolej na konfigurację modułu userdir. Otwieramy /etc/apache2/mods-enabled/userdir.conf, w którym nie powinna pojawić się pozycja AllowOverride None. Prawdopodobnie linijka będzie wyglądała tak:

1
AllowOverride FileInfo AuthConfig Limit Indexes

jest to poprawny wpis.

Ponownie restartujemy Apache:

1
/etc/init.d/apache2 restart

W tej chwili moduł rewrite będzie działał poprawnie. Problemem może okazać się jego użycie wraz z modułem userdir.  Aby wszystko działało poprawnie, trzeba odpowiednio skonstruować  plik .htaccess. Musi on zawierać dyrektywę RewriteBase:

Dla adresu np. http://localhost/~felixd/ powinna ona wyglądać tak:

1
RewriteBase /~felixd/

dla http://localhost/~felixd/projekt2/:

1
RewriteBase /~felixd/projekt2/