W dzisiejszych czasach plik .htaccess jest niezbędnym elementem każdej witryny internetowej. Za jego pomocą można zrobić wiele pożytecznych rzeczy w witrynie internetowej. Jest to bardzo często wykorzystywane w systemach takich jak WordPress czy Joomla, wielkich portalach internetowych, jak również na prostych stronach.
Plik .htaccess przez wielu jest postrzegany jako czarna magia. Najczęściej jest to za sprawą wyrażeń regularnych. Tymczasem jest to tylko lista instrukcji dla serwera WWW np Apache w Linuxie. Można go zastosować do:
- przekierowania np ze strony z początkiem WWW na bez WWW i odwrotnie (temu tematowi poświęciłem osobny artykuł – Przekierowanie w .htaccess).
- markowanie adresów np przyjazne linki (więcej o tym w artykule Przekierowanie w .htaccess)
- sterowanie keszem przeglądarki
- zabezpieczanie przed hotlinkowaniem
- oraz wiele innych
Zastosowań dla tego pliku jest niemalże niezliczona ilość. Wszystko zależy głównie od potrzeb i wyobraźni webmastera. Nie jestem w stanie opisać tutaj wszystkich funkcjonalności. Niektórym z nim poświęciłem osobne artykuły, w których dokładnie opisuję co i jak.
Do używania pliku .htaccess niezbędne są wyrażenia regularne. Są one dosyć rozległym tematem, dlatego postanowiłem wpierw napisać artykuł Wyrażenia regularne – łatwiejsze niż myślisz poświęcony właśnie temu zagadnieniu.
Jeżeli nie znacie wyrażeń regularnych, to w pierwszej kolejności powinniście przeczytać ten artykuł i postarać się je opanować, a przynajmniej chociaż trochę poznać.
Moduły w .htaccess
Jak już pisałem wcześniej, ten plik jest jedynie zbiorem dyrektyw dla serwera. Serwer posiada wiele modułów, które są niezbędne do realizowania pewnych zadań. Konfiguracje serwerów mogą być różne. Każdy może ustawić serwer według własnych upodobań.
Jeśli będziemy chcieli użyć funkcję z modułu, którego nie ma serwerze, to zobaczymy błąd 500 (Internal Server Error). Bez zabezpieczeń nie jesteśmy w stanie zagwarantować, że dana strona na pewno będzie działać na każdym serwerze (o ile w ogóle jest to możliwe).
Z Apachem jest jak z programowaniem. Jeśli nie zaimportujemy jakiejś biblioteki, to nie będziemy mogli użyć metod, które są tam zdefiniowane. Komendy dotyczące danego modułu powinny być zawarte w specjalnej instrukcji warunkowej, która sprawdza, czy dany moduł jest na serwerze:
<IfModule mod_rewrite.c> RewriteRule ^/artykuly/([\w.-]+).html$ index.php?typ=artykul&przyjaznyLink=$1 [L,NC] </IfModule>
W powyższym przykładzie stworzyłem przekierowanie z przyjaznego linku na dane zrozumiałe dla skryptu. Wszystko zamknąłem w instrukcji IfModule. W Linuxie za przekierowania odpowiada moduł mod_rewrite.c.
Sterowanie PHP
Z pliku .htaccess można sterować działaniem PHP. Wyróżniamy dwa rodzaje sterowania:
- php_flag – odpowiednik funkcji ini_set w PHP
- php_value
Za pomocą tej pierwszej metody można np wyłączyć Register Globals:
php_flag register_globals off
Drugiej metody możemy użyć np do ustawienia ścieżek importowania plików:
php_value include_path "./admin/"
Niektórym z poprzednich wersji PHP pozostał nawyk otwierania skryptów za pomocą skróconego tagu „<?”. W nowych wersjach PHP skrócone tagi otwierające są ignorowane.
To powoduje, że skrypt PHP jest traktowany jako zwykły tekst i zawartość skryptu jest wypisywana w przeglądarce. Na szczęście plik .htaccess jest w stanie Nam w tym pomóc:
php_value short_open_tag 1
Nagłówki strony
W pliku .htaccess można sterować nagłówkami strony, które są wysyłane do przeglądarki. Za sterowanie nagłówkami odpowiada moduł mod_headers.c, dlatego należy pamiętać o zamykaniu tego w instrukcjach sterujących. Oto najważniejsze operacje:
- usuwanie nagłówków – Header unset Last-Modified
- ustawianie nagłówków – Header set Cache-Control „no-store, no-cache, must-revalidate”
Przekierowania w .htaccess
Podstawowym elementem niemalże każdej strony są przekierowania. Opierają się na trzech instrukcjach:
- RewriteEngine – włączanie i wyłączanie przekierowań
- RewriteRule – reguła określająca przekierowanie
- RewriteCond – instrukcja warunkowa, stosowana przed RewriteRule
Dzięki przekierowaniom tworzone są przyjazne linki. Zasada działania przyjaznych linków jest bardzo prosta:
- użytkownik wpisuje przyjazny link
- Apache parsuje przyjazny link za pomocą wyrażeń regularnych i zamienia na podany przez Nas adres
- otwiera adres, który został wpisany w poprzednim punkcie
Zamiana adresu odbywa się za pomocą grupowania elementów:
RewriteRule ^/zdjecie/([\w-]+),(\d+),(\d+)$ zdjecie.php?adres=$1&szerokosc=$2&wysokosc=$3
Powyższy przykład zamienia adres.pl/zdjecie/jakiesZdjecie.jpg,1024,768 na adres.pl/zdjecie.php?adres=jakiesZdjecie.jpg&szerokosc=1024&wysokosc=768. Oczywiście przed stworzeniem przyjaznych linków musimy zagwarantować, żeby skrypt działał bez tego. Jak zauważyliście, na końcu reguły znajduje się [L,NC]. Są to sterowniki, które odpowiadają za sterowanie daną regułą. Oto najważniejsze z nich:
- L – przerwanie działania modułu przekierowującego po danej regule
- NC – brak wrażliwości na wielkość liter (Not Case sensitive)
- R=numerBłędu – zwrócenie wybranego kodu błędu serwera
Ostatnia opcja jest bardzo przydatna przy przekierowaniach ze strony z www na stronę bez www. Wyszukiwarki obie strony widzą jako dwie różne strony i dlatego każda strona będzie inaczej indeksowana. Aby temu zapobiec, należy poinformować wyszukiwarkę, że obie strony to jest to samo i jedna z nich została definitywnie przeniesiona na drugą z kodem błędu 301 (Moved Permanently):
Przykłady przekierowań w .htaccess
Przyjazny link dla artykułów:
RewriteRule ^artykuly/([\w-]+).html$ artykuly.php?przyjaznyLink=\1 [L,NC]
Przekierowanie zdjęć z adres.pl/zdjecie/jakiesZdjecie.jpg na adres.pl/pliki/zdjecia/jakiesZdjecie.jpg:
RewriteRule ^zdjecie/([^,]+)$ pliki/zdjecia/$1 [L,NC]
Przekierowanie zdjęć z adres.pl/zdjecie/jakiesZdjecie.jpg,1024,768 na adres.pl/zmienRozmiarZdjecia.php?adres=jakiesZdjecie.jpg&szerokosc=1024&wysokosc=768:
RewriteRule ^zdjecie/([^,]+),(\d+),(\d+)$ zmienRozmiarZdjecia.php?adres=\1&szerokosc=\2&wysokosc=\3 [L,NC]
Przekierowanie z WWW na bez WWW:
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC] RewriteRule ^ http://%1%{REQUEST_URI} [L,NC,R=301]
Przekierowanie z bez WWW na WWW:
RewriteCond %{HTTP_HOST} !^(www.|$) [NC] RewriteRule ^http://www.%{HTTP_HOST}%{REQUEST_URI} [L,NC,R=301]
Tajemnice pliku .htaccess zostały odsłonięte. Jak widzicie, nie jest to jakaś tajemna wiedza, o ile znacie wyrażenia regularne. Jak będziecie potrzebować przykłady wykorzystania pliku .htaccess, to czekam na komentarze.