Czym jest .htaccess?
.htaccess to plik konfiguracyjny znajdujący się na serwerze z oprogramowaniem Apache Web Server. Jeśli istnieje w katalogu głównym, jest wykrywany i wykonywany przez oprogramowanie przed wykonaniem jakichkolwiek skryptów – zarządza docieraniem do adresów, a jego najważniejsza funkcja to konfigurowanie zestawów przekierowań.
Jak stworzyć plik .htaccess?
Wystarczy przygotować jego treść w dowolnym edytorze tekstu (Notatnik, Notepad++, SublimeText) i zapisać pod nazwą .htaccess. .htaccess to cała nazwa pliku. Nie jest to rozszerzenie i nie można go stworzyć pod nazwą typu plik21.htaccess. Utworzony plik należy umieścić w katalogu głównym domeny (zazwyczaj „public_html”) jeśli reguły mają dotyczyć całej domeny. Ponadto dla każdej subdomeny, a także folderu można przygotować osobne pliki .htaccess.
Do czego służy?
W pliku .htaccess można przekierować odwiedzających na inną stronę, skonfigurować strony błędów, zabezpieczyć strony hasłem, a także wykonać wszelkie działania dotyczące kierowania ruchem po stronie serwera.
Przykładowa zawartość pliku
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domena.pl(.*) [NC]
RewriteRule ^(.*)$ http://domena.pl/$1 [R=301,L]
RewriteRule ^usuniety-adres$ http://domena.pl/nowy-adres [L,R=301]
RewriteEngine on – włącza moduł mod_rewrite, który realizuje dalsze komendy.
RewriteCond %{HTTP_HOST} ^www.domena.pl(.*) [NC] – definiuje rozpoznawany warunek, gdzie pierwszy ciąg znaków oznacza rozpoznawany element (w tym przypadku to %{HTTP_HOST} – host żądany od serwera), natomiast drugi ciąg znaków oznacza wartość elementu, która wywoła warunek (w tym przypadku to ^www.domena.pl(.*) [NC] – wersja domeny z przedrostkiem www., bez różnicy odnośnie wielkości liter). Podana reguła sprawdza, czy domena na serwerze została odpytana z przedrostkiem www, a wynik wpływa na kolejną linię w pliku.
RewriteRule ^(.*)$ http://domena.pl/$1 [R=301,L] – wykonuje komendę zależną od warunku w poprzedniej linii, gdzie pierwszy ciąg znaków oznacza element modyfikowany (w tym przypadku to ^(.*)$ – wszystkie adresy), natomiast drugi ciąg znaków oznacza sposób modyfikacji (w tym przypadku to http://domena.pl/$1 [R=301,L] – przekierowanie 301 na domenę bez przedrostka www.). Razem z poprzednią linią, ten zestaw RewriteCond – RewriteRule zapewnia, że wszystkie adresy w domenie są dostępne wyłącznie pod adresem bez przedrostka www.
RewriteRule ^usuniety-adres$ http://domena.pl/nowy-adres [L,R=301] – wykonuje niezależną komendę. Zasady są podobne do poprzedniej linii, jednak tutaj warunek został ukryty w pierwszym ciągu znaków, ponieważ modyfikacja jest wykonywana tylko, gdy adresem jest domena.pl/usuniety-adres. W przypadku próby załadowania tego adresu, serwer przekieruje odpytującego na domena.pl/nowy-adres.
Popularne przekierowania w .htaccess
Przekierowanie umożliwia przejście z jednego adresu URL na drugi.
Przekierowania zaczynamy od umieszczenia na początku pliku RewriteEngine On, który aktywuje moduł mod_rewrite.
Przyjazna i skuteczna metoda przekierowania, która informuje przeglądarki o tym, że strona została przeniesiona na inny adres URL.
RewriteEngine On
RewriteRule ^poprzedni-adres$ http://domena.pl/nowy-adres [L,R=301]
Wymuszenie HTTPS w adresie URL domeny
Po aktywacji certyfikatu SSL, można wymusić automatyczne przekierowanie na stronę z HTTPS użytkownika poniższą instrukcją:
RewriteEngine On
RewriteCond %{HTTP_HOST} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI}
Wymuszenie przedrostka www w adresie URL domeny
Dostępność strony pod dwoma wersjami – z oraz bez przedrostka www – utrudnia prowadzenie właściwego SEO. Zawsze warto zadbać o zdefiniowanie jednej, najważniejszej wersji. Przekierowanie na wersję www.:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domena.pl(.*) [NC]
RewriteRule ^(.*)$ http://www.domena.pl/$1 [R=301,L]
Wymuszenie adresu URL bez przedrostka www
Analogicznie, przekierowanie na wersję bez www.:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.domena.pl(.*) [NC]
RewriteRule ^(.*)$ http://domena.pl/$1 [R=301,L]
Przekierowanie całej domeny na nową
Poniższa reguła jest przydatna, jeśli chcemy stary adres podstrony przenieść na nowy.
RewriteEngine On
RewriteCond %{HTTP_HOST} !poprzednia-domena.pl$ [NC]
RewriteRule ^(.*)$ http://nowa-domena.pl/$1 [L,R=301]
Przekierowanie bez użycia mod_rewrite
Jeśli moduł mod_rewrite nie jest dostępny, przekierowania 301 można zrealizować za pomocą komendy Redirect 301.
Redirect 301 /starapodstrona.php http://www.domena.pl/nowapodstrona.html
Własna strona błędu
Utworzenie własnej strony błędu to standardowe, ważne działanie, które pozwala na dłużej zatrzymywać użytkowników. Za pomocą odpowiedniej podstrony można wskazać adresy podobne do odwiedzonego i/lub udostępnić wyszukiwarkę.
Skonfigurowanie niestandardowej strony błędu umożliwia instrukcja zamieszczona poniżej:
ErrorDocument 404 /error_pages/404.html
Gdzie /error_pages/404.html to ścieżka do podstrony błędu.
Analogicznie można utworzyć dedykowane podstrony dla innych popularnych błędów, takich jak 403 (odmowa dostępu) czy 500 (błąd serwera).
Blokowanie określonych adresów IP
W przypadku wykrycia użytkowników/skryptów nadużywających zasobów lub próbujących zaszkodzić stronie, warto pozbawić ich dostępu do serwera już na poziomie .htaccess.
Deny from all
Blokada wszystkich adresów IP z wyjątkiem zdefiniowanych
Order Allow,Deny
Allow from 123.456.789.0
Komenda Order definiuje kolejność przetwarzania. W tym przypadku Allow,Deny oznacza, że najpierw będą przetwarzane wszystkie komendy Allow, a w przypadku braku właściwej dla danego IP reguły, zostanie zrealizowana komenda Deny.
Order Deny,Allow
Deny from 123.456.789.0
Odwrotnie w stosunku do poprzedniego przykładu, najpierw przetwarzane są komendy Deny, a jeśli nie dotyczą odpytującego to jest on domyślnie dopuszczany do serwera.
Blokowanie użytkowników na podstawie strony odsyłającej
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} niechcianadomena\.pl [NC]
RewriteRule .* - [F]
Powyższa instrukcja blokuje ruch pochodzący z przejść z domeny niechcianadomena.pl. Do poprawnego funkcjonowania, serwer powinien mieć włączoną opcję FollowSymlinks – jeśli nie jest, serwer zwróci błąd 500, co można naprawić za pomocą odkomentowania (usunięcia znaku #) linii # Options +FollowSymlinks. Użytkownicy, którym dostęp został odmówiony, otrzymają podstronę kodu błędu 403, którą można odpowiednio spersonalizować zgodnie z punktem 6.
Można również wdrożyć ograniczenie dotyczące większej ilości domen:
RewriteEngine On
# Options + FollowSymlinks
RewriteCond %{HTTP_REFERER} pierwszaniechcianadomena\.pl [NC,OR]
RewriteCond %{HTTP_REFERER} druganiechcianadomena\.pl [NC]
RewriteRule .* - [F]
Dodatkowe domeny, oprócz ostatniej, powinny zawierać dodatkową flagę [OR], która pozwala na wydłużenie sprawdzania warunków.
Zatrzymanie hotlinków
Pliki graficzne mogą być bezpośrednio z naszego serwera wyświetlane na innych stronach – jest to hotlinking, który powoduje utratę transferu, a często jest również naruszeniem praw autorskich. Można temu zapobiec za pomocą instrukcji:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(subdomena\.)?domena\.pl/.*$ [NC]
RewriteRule ^.*\.(bmp|tif|gif|jpg|jpeg|jpe|png)$ http://www.nooooooooooooooo.com/ [F]
Domena i subdomena to strony z dozwolonym dostępem do plików graficznych. Pozostałe strony podejmujące próbę hotlinkowania zostaną przekierowane do http://www.nooooooooooooooo.com/.
Blokowanie witryny przed botami
Podobnie jak dla stron odsyłających, blokowanie dostępu można warunkować również nazwami botów:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^nazwabota [OR]
RewriteCond %{HTTP_USER_AGENT} ^nazwabota
RewriteRule .* - [F]
Lista wszystkich nazw botów jest dostępna pod adresem useragentstring.com.
Ustawienie domyślnej strony głównej lub folderu
Standardowo serwer po odpytaniu serwera prezentuje użytkownikowi plik index.*, jednak można to zmienić w .htaccess:
DirectoryIndex innyplik.php
Ponadto można specyficznie dla poszczególnych folderów ustalić pliki, które będą wyświetlane pod odpytaniu domena.pl/folder/.
Ochrona za pomocą hasła
Dostęp do folderu lub plików może być ograniczony po stronie serwera za pomocą hasła. Przykład ochrony pliku wp-login.php, który służy do logowania w CMSie WordPress:
<Files wp-login.php>
Order Deny,Allow
Deny from All
Satisfy Any
AuthName "Dostep Chroniony"
AuthUserFile /dostepchroniony/.htpasswda1
AuthType Basic
Require valid-user
</Files>
Następuje tu odwołanie do pliku .htpasswd, który ma postać:
login:haslo
Przy czym hasło jest zakodowane za pomocą crypt(). Plik można wygenerować samodzielnie w PHP lub za pomocą wielu darmowych narzędzi, na przykład htaccesstools.com.
Blokada popularnych prób włamania w systemie WordPress
Należy wdrażać ostrożnie, ponieważ podany zestaw reguł może zmienić funkcjonowanie wtyczek.
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ ///.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\=?(http|ftp|ssl|https):/.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\?.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(asp|ini|dll).*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(htpasswd|htaccess|aahtpasswd).*\ HTTP/ [NC]
RewriteRule .? - [F,NS,L]
Innym wartym polecenia rozwiązaniem jest użycie dowolnych wtyczek zabezpieczających, które automatycznie również modyfikują .htaccess.
Złożone przekierowania z użyciem wyrażeń regularnych
Plik .htaccess akceptuje pełne wyrażenia regularne, co daje dowolne możliwości kształtowania adresów, wykraczające poza wyżej podane przykłady. Wdrożenia, szczególnie pod kątem SEO, są specyficzne dla poszczególnych systemów oraz stron. Odpowiednie wyrażenia regularne można przygotować za pomocą świetnego narzędzia Regexr.com. Poniżej umieszczone zostały przykłady specyficznych wdrożeń.
Usunięcie końcówek .html z adresów:
RewriteCond %{THE_REQUEST} \.html
RewriteRule ^(.*)\.html$ /$1 [R=301,L]
Ograniczenie dostępu do adresów z parametrami (podstrona?parametr=wartosc):
RewriteCond %{THE_REQUEST} ^[A-Z]+ /.*\ HTTP
RewriteCond %{QUERY_STRING} !^$
RewriteRule .* http://domena.pl%{REQUEST_URI}? [R=301,L]
Obsługa przyjaznych adresów:
RewriteCond %{REQUEST_URI} ^kategoria/ [NC]
RewriteRule ^kategoria/([0-9][0-9])/?$ /index.php?kategoria=$1 [L]
24-godzinne przechowywanie w pamięci plików statycznych:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$">
Header set Cache-Control "max-age=28800"
</FilesMatch>