Apache logo.htaccess zaś to oczywiście plik konfiguracyjny serwera Apache (choć nie tylko on je interpretuje) pozwalający na zmianę konfiguracji serwera (o ile globalna konfiguracja serwera zezwala na stosowanie plików .htaccess). Działa tylko w katalogu (i jego podkatalogach), do którego wgramy plik .htaccess. Zwróćcie uwagę, że nazwa pliku zaczyna się od kropki – w systemach typu Linux oznacza to plik ukryty. Dzięki plikom .htaccess możemy ustawić wiele różnych parametrów takich jak np. przekierowania, własne strony błędów, blokady dostępu dla wybranych IP (albo dostęp tylko dla wybranych IP), autoryzację loginem i hasłem, przepisywanie linków i wiele innych.

Własne strony błędów

Strony błędów definiuje się tak:

ErrorDocument 400 /400.html
ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
ErrorDocument 503 /503.html

Oznacza to, że w razie wystąpienia błędu, dajmy na to, 404 (”nie ma takiej strony”) serwer wyświetli nam stronę 404.html znajdującą się w katalogu głównym serwera.

Można też od razu w pliku .htaccess wpisać kod HTML z komunikatem o błędzie (choć zalecam jednak stosowanie plików):

ErrorDocument 401 "Musisz <strong>być</strong> <a href="/login.php">zalogowany</a> aby móc obejrzeć tą stronę!"

Blokowanie dostępu

Aby zablokować np. upierdliwego internautę albo uciążliwą wyszukiwarkę/bota wystarczy wprowadzić w pliku .htaccess następujący wpis:

Deny from XXX.XXX.XXX.XXX

gdzie zamiast ciągu XXX.XXX.XXX.XXX należy wpisać adres IP, który chcemy zablokować.

Jeśli zaś chcemy ograniczyć dostęp do jakiegoś katalogu tylko dla wybranego IP (np. naszego domowego, tak aby nikt poza nami nie miał dostępu do plików) należy posłużyć się następującym zapisem:

Deny from all
Allow from XXX.XXX.XXX.XXX

gdzie pierwsza linijka powoduje całkowite zablokowanie dostępu, zaś druga dopuszcza dostęp z numeru XXX.XXX.XXX.XXX.

Blokować możemy pojedyncze numery IP lub całe bloki, np.

order allow,deny
deny from 123.45.6.7
deny from 012.34.5.
allow from all

Zwróćmy uwagę na pierwszą linijkę powyższego kodu – ustawia ona kolejność aplikowania reguł: najpierw zezwolenie (allow) a potem odrzucenie (deny). Dlatego pomimo, że zapis allow from all (który normalnie “skasowałby” występujące przed nim reguły deny) jest na końcu to jednak reguły deny zostaną zastosowane.

Zabezpieczanie dostępu do katalogu hasłem

Aby zabezpieczyć dostęp do katalogu hasłem musisz zrobić dwie rzeczy:

- stworzyć plik zawierający login (umówmy się, że będzie to tomek) i zaszyfrowane hasło (np. warszawa1), nazwać go .htpasswd i wgrać do katalogu niedostępnego z internetu (załóżmy, że będzie to /usr/local/twoj/bezpieczny/katalog/ i wpisać do niego następujący kod:

tomek:VhsmZRSciVEnA

- wprowadzić do pliku .htaccess poniższy wpis:

AuthUserFile /usr/local/twoj/bezpieczny/katalog/.htpasswd
AuthGroupFile /dev/null
AuthName EnterPassword
AuthType Basicrequire user tomek

Aby wygenerować zaszyfrowane hasło możemy posłużyć się np. generatorem dostępnym tu albo tu.

Powyższy wpis spowoduje, że dostęp do wybranej części witryny będzie mógł uzyskać tylko użytkownik tomek po podaniu poprawnego hasła.

Blokowanie wyświetlania zawartości katalogu

Czasem zdarza się, że w jakimś katalogu nie ma pliku index.html. Wtedy domyślnie serwer wyświetla zawartość tego katalogu. Aby temu zapobiec należy wprowadzić następujący wpis:

Options -Indexes

albo tak:

IndexIgnore *

Gwiazdka (tzw. dzika karta) oznacza wszystkie pliki. Możemy też np. zablokować wyświetlanie tylko określonych plików, np. obrazków:

IndexIgnore *.jpg *.gif *.png

Jeśli zaś mamy domyślnie zablokowane wyświetlanie zawartości katalogów to możemy je włączyć używając takiego wpisu:

Options +Indexes

A jeśli chcemy być naprawdę sprytni to możemy jeszcze dołożyć opis zawartości katalogu (lub inną wiadomość) poprzez wgranie do interesującego nas katalogu jednego (lub obydwu) z plików: HEADER (zostanie wyświetlony na początku, przed listą plików) oraz README (zostanie wyświetlony jako stopka, po liście plików.

Przekierowania

Przy użyciu pliku .htaccess możemy tworzyć przekierowania wywołań do zupełnie innego pliku lub nawet do innej witryny. Można dzięki temu np. zmienić nazwę pliku na nową, ale jednocześnie zachować stare odwołanie do strony. Można też np. po prostu poskracać dzięki temu linki do wybranych stron. Przykład:

Redirect /sciezka/od/katalogu/glownego/plik.htm http://www.zupelnieinnawitryna.pl/nowa/lokalizacja/plik.php

Można też ustawić przekierowanie dla całych katalogów, np. jeśli masz katalog o nazwie starykatalog na starej witrynie i chcesz dać do niego dostęp z nowej witryny: http://www.nowawitryna.pl/nowykatalog/. W tym celu należy posłużyć się następującym wpisem:

Redirect /starykatalog http://www.nowawitryna.pl/nowykatalog

Efekt jest taki, że kiedy ktoś wywołuje plik znajdujący się poniżej katalogu /starykatalog to zostanie przekierowany na nową witrynę a w linku znajdą się wszystkie dodatkowe informacje potrzebne do prawidłowego przekierowania, np. jeśli ktoś wywołuje plik:

http://www.starawitryna.pl/starykatalog/starepliki/images/image.gif

to zostanie przekierowany do:

http://www.nowawitryna.pl/nowykatalog/starepliki/images/image.gif

Blokowanie użytkowników/witryn wg pochodzenia

Wyobraź sobie sytuację: sprawdzasz logi serwera i okazuje się, że Twoja witryna ma dużą odwiedzalność – duży ruch przychodzący z jednej witryny. Zaglądasz na tą witrynę, ale nigdzie nie możesz znaleźć linku prowadzącego do twojej. Wniosek: najprawdopodobniej witryna ta stosuje tzw. hotlinking, czyli wykorzystuje pliki z twojej strony (np. zdjęcia albo arkusze stylów) na swojej. Jest to praktyka naganna, ale niestety zdarza się. Ale na szczęście dzięki plikom .htaccess możemy się przed tym bronić.

Co jest nam potrzebne? Poza samym plikiem .htaccess musimy mieć jeszcze zainstalowany moduł serwera Apache o nazwie mod_rewrite abyśmy mogli wykrywać pochodzenie ruchu.

Blokowanie ruchu z pojedynczego serwera:

RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} bandyta\.pl [NC]
RewriteRule .* - [F]

Blokowanie ruchu z wielu serwerów:

RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} bandyta\.pl [NC,OR]
RewriteCond %{HTTP_REFERER} kolejnybandyta\.pl
RewriteRule .* - [F]

Zauważmy, że nazwa domeny bandyta\.pl zapisana jest z backslashem przed kropką. Backslash jest znakiem ucieczkowym i musimy go zastosować przed kropką ponieważ stosujemy tu wyrażenie regularne a kropka w wyrażeniach regularnych oznacza “dowolny znak”. Nam nie chodzi o “dowolny znak” tylko właśnie o kropkę i dlatego musimy użyć backslasha, aby Apache zrozumiał, że chodzi nam o kropkę. Flaga [NC] dodana na końcu nazwy domeny oznacza, że serwer Apache ma interpretować ten zapis niezwracając uwagi na wielkość liter, tak więc czy odwołanie nastąpi z bandyta.pl czy Bandyta.pl – zostanie zablokowane. Ostatnia linijka oznacza, że zamiast wyświetlenia żądanego zasobu zostanie zwrócony błąd 403. Cała różnica pomiędzy blokowaniem pojedynczego serwera a blokowaniem wielu serwerów polega na zmianie flagi z [NC] na [NC, OR] w przypadku każdej kolejnej domeny Z WYJĄTKIEM OSTATNIEJ NA LIŚCIE.

W obydwu przypadkach mamy też linijkę Options +FollowSymlinks, która jest zakomentowana (znak # na początku linijki oznacza komentarz – linijka ta nie jest wtedy interpretowana przez serwer Apache). Odkomentuj ją jeśłi twój serwer Apache nie jest skonfigurowany z FollowSymLinks w sekcji <directory></directory> w pliku httpd.conf. Poznasz to po tym, że serwer zwraca błąd 500 Internal Server error podczas próby użycia powyższego kodu.

No, to by było na tyle, jeśli chodzi o część pierwszą. Postaram się w najbliższych dniach napisać ciąg dalszy a w nim:

  • obrona przed hotlinkowaniem,
  • włączanie SSL przez .htaccess,
  • obrona przed botami i ripperami,
  • zmienianie domyślnej strony głównej,
  • dodawanie typów MIME,
  • zapobieganiu odczytywaniu pliku .htaccess,
  • i może jeszcze o czymś.

Osobny wpis poświęcę też na opisanie przepisywania linków przy pomocy mod_rewrite.