piątek, 23 października 2009

Co to jest .htaccess

Wielu osobom skrót .htaccess kojarzy się przede wszystkim z możliwością kontrolowania dostępu do strony internetowej za pomocą hasła. I choć jest to rzeczywiście jedno z bardziej popularnych zastosowań tego pliku, to jego rola jest znacznie szersza. Mechanizm .htaccess został zaprojektowany jako narzędzie do zmiany konfiguracji Apache’a w odniesieniu do pojedynczych katalogów na serwerze. W ten sposób nawet zwykły użytkownik może zmodyfikować ustawienia Apache’a, aktywując funkcje obsługi skryptów CGI i przetwarzania dyrektyw SSI czy ograniczając dostęp osób do strony z konkretnego adresu IP. Pliki .htaccess są także wykorzystywane do przygotowywania własnych stron błędów generowanych przez serwer. I to wszystko jest możliwe na poziomie pojedynczego katalogu w serwisie internetowym. Dla wszystkich naraz lub każdego z osobna.

Warto jednak wiedzieć, że ustawienia wprowadzane do konfiguracji przez .htaccess mogą być równie dobrze definiowane na poziomie głównego pliku ustawień Apache’a. Jakby tego było mało, dokumentacja serwera wprost odradza stosowanie .htaccess, jeżeli nie mamy ku temu wyraźnych przesłanek. Kiedy zatem nie powinniśmy używać tego mechanizmu? Podstawowa odpowiedź na to pytanie brzmi: wtedy, gdy mamy dostęp do plików konfiguracyjnych serwera. Reguły zapisane w .htaccess możemy z powodzeniem zawrzeć w ramach dyrektywy w głównym pliku ustawień Apache’a. Podejście to ma dwie kluczowe przesłanki. Pierwsza z nich związana jest ze zwiększonym obciążeniem serwera. Komputer, który musi przetwarzać dodatkowe reguły zapisane w kilku-kilkudziesięciu plikach konfiguracyjnych, potrzebuje więcej zasobów. Druga dotyczy bezpieczeństwa: jeżeli udostępniamy możliwość zmiany konfiguracji Apache’a, to w pewnym zakresie tracimy nad nim kontrolę. Użytkownicy mogą modyfikować jego ustawienia, co potencjalnie może prowadzić do naruszenia zasad bezpieczeństwa.

Mimo tych zastrzeżeń mechanizm .htaccess jest bardzo przydatnym narzędziem. Jeśli korzystamy z usług dostawcy hostingu, to dostęp do .htaccess umożliwi nam uruchomienie serwera WWW zgodnie z naszymi oczekiwaniami. Z drugiej strony, jeżeli jesteśmy właścicielami serwera i mamy do niego dostęp z uprawnieniami administratora, powinniśmy rozważyć konfigurację Apache’a na poziomie głównych plików konfiguracyjnych.

Admin musi pozwolić

Włączenie mechanizmu .htaccess odbywa się w głównych plikach konfiguracyjnych Apache’a. To właśnie tu decydujemy, czy możliwe będzie użycie plików .htaccess, a jeżeli tak, to w jakim zakresie. Służy do tego dyrektywa AllowOverride definiowana w sekcji dla głównego katalogu serwera lub jego podkatalogów. Dyrektywa ta może przyjmować wartość None, All, AuthConfig, FileInfo, Indexes, Limit oraz Options. Jak łatwo się domyślić, ustawienie tej opcji na
AllowOverride None

wyłącza użycie plików .htaccess. Serwer nie uwzględni wówczas konfiguracji w nich zapisanej, nawet jeżeli istnieją one w odpowiednich katalogach. Z kolei zastąpienie słowa None wpisem All zezwoli na użycie .htaccess w pełnym zakresie. Administrator może również przyznać uprawnienia tylko do zmiany niektórych jego ustawień. Służą do tego dyrektywy grup:
AuthConfig – włączenie mechanizmów autoryzacji odwiedzających stronę,
FileInfo – zmiana typu dokumentów (MIME, strony błędów),
Indexes – modyfikacja ustawień związanych z obsługą katalogów (strona główna, listowanie katalogów),
Limit – limitowanie dostępu do strony za pomocą mechanizmu zezwól/odmów (allow/deny),
Options – kontrolowanie opcji specyficznych dla katalogów (np. włączanie CGI, SSI itd.).

Opcje te można ze sobą łączyć, a zatem, aby zezwolić użytkownikom na zmianę konfiguracji serwera w zakresie autoryzacji i limitowania dostępu do serwera w ustawieniach Apache’a dla wybranego katalogu (sekcja Directory), wprowadzamy zapis:
AllowOverride AuthConfig Limit

Szczegółowe informacje na ten temat zostały zawarte w dokumentacji Apache’a [1]. Warto ją przeczytać, jeżeli chcemy dokładnie poznać znaczenie dyrektywy AllowOverride.

Choć poniższą poradę należy traktować raczej jako ciekawostkę, to niektórzy zechcą zrobić z niej użytek. Warto wiedzieć, że plik .htaccess może mieć dowolną inną nazwę, o ile wskażemy to w konfiguracji Apache’a. Służy do tego dyrektywa AccessFileName definiowana w ustawieniach serwera. Ma ona następującą składnię:
AccessFileName .configuration

gdzie .configuration oznacza nową nazwę pliku, który będzie odczytywany w poszukiwaniu lokalnej konfiguracji serwera.

Tworzenie .htaccess

Plik .htaccess jest zwykłym plikiem tekstowym ASCII. Jest on czytelny dla człowieka i może zostać utworzony za pomocą dowolnego edytora, np. Notatnika w Windows czy Vim lub Emacs w Linuksie. Zachowując zmiany, warto zwrócić uwagę na dość nietypową, szczególnie w środowisku Windows, jego nazwę. Rozpoczyna się ona kropką, po której następuje coś na kształt rozszerzenia. I choć jest to plik tekstowy, nie ma on przyrostka .txt. Tak przygotowany zbiór przenosimy na serwer np. za pomocą protokołu FTP. Trzeba pamiętać, aby skopiować go w trybie transmisji ASCII, a nie binarnym.

Zbiór .htaccess „działa” w obrębie katalogu, w którym został umieszczony, oraz wszystkich jego podfolderach. Jeżeli zatem zapiszemy .htaccess w katalogu głównym serwera, zmiany w nim wprowadzone obejmą swoim zasięgiem cały serwis WWW. Nic nie stoi na przeszkodzie, aby w każdym z podkatalogów zdefiniować osobny plik .htaccess. Ale uwaga: parametry ustawień zawarte w .htaccess zapisanych w danym katalogu zastępują te ustalone na poziomie głównego pliku konfiguracyjnego serwera i wszystkich plików umieszczonych wyżej w strukturze drzewa katalogów.

Dostęp na hasło

Użycie haseł to najprostsza metoda na ograniczenie dostępu do naszej strony lub wybranego jej katalogu. Zanim odwiedzający obejrzy zawartość serwisu, będzie musiał wprowadzić nazwę użytkownika i hasło. Choć mechanizm ten możemy zaimplementować, korzystając z języków programowania (PHP, JavaScript itd.), znacznie szybciej podobny efekt uzyskamy, gdy zastosujemy zbiory .htaccess.

Na początek przygotowujemy plik zawierający hasła dostępu wraz ze skojarzonymi z nimi osobami (nazwami użytkownika). Jest to zbiór tekstowy .htpasswd, w którym hasła są zaszyfrowane za pomocą algorytmu MD5. Z tego też względu do wykonania tego zadania posłużymy się programem htpasswd dostarczanym wraz z Apache’em. Jest on zazwyczaj dostępny w domyślnej ścieżce przeszukiwania serwera, a jego uruchomienie powinno mieć następującą postać:
htpasswd -c /home/apache/hasla/.htpasswd janek

gdzie /home/apache/hasla/ jest ścieżką do katalogu, w którym będziemy przechowywali hasła, .htpasswd nazwą pliku je przechowującym, a janek to użytkownik, dla którego definiujemy dostęp. Na koniec pozostaje nam dwukrotnie wprowadzić hasło i pamiętać, że pliki te powinny być przechowywane poza miejscem, w którym udostępniamy stronę WWW. Inaczej mówiąc, hasła zapisujemy w katalogu, do którego ma dostęp serwer Apache, ale który nie jest osiągalny z poziomu przeglądarki internetowej. Aby dopisać dodatkowych użytkowników do pliku z hasłami w kolejnym wywołaniu htpasswd, pomijamy parametr -c.

Gdy pierwszy krok mamy za sobą, w pliku .htaccess definiujemy reguły autoryzacji użytkowników. Przykładowe wpisy mogą mieć następującą postać:
AuthType Basic
AuthName "Galeria zdjec"
AuthUserFile /home/apache/hasla/.htpasswd
Require user janek franek iza

gdzie parametr AuthUserFile określa ścieżkę do pliku .htpasswd, janek, franek oraz iza są natomiast osobami uprawnionymi do przeglądania danego zasobu. Zamiast wymieniać użytkownika z osobna, możemy posłużyć się parametrem valid-user:
require valid-user

Wówczas wszyscy użytkownicy mający odpowiednie wpisy w .htpasswd będą mogli logować się do serwisu. Pole AuthName zawiera informację, którą możemy przekazać użytkownikom, a która identyfikuje nasz serwis. Pojawi się ona w okienku logowania do strefy chronionej hasłem. Z kolei AuthType wskazuje typ autoryzacji HTTP. W tym przypadku jest to Basic.

Nasze reguły możemy wzbogacić o funkcję ograniczającą dostęp do strony tylko z wybranego adresu IP, puli adresów lub domeny, np.:
Access allow 40.53.218.11
Access allow serwer.pl

Wróćmy jednak do pliku .htpasswd. Przykładowa jego zawartość może mieć postać:
janek:Epowp5bTSabac
franek:IqOcGapAdnEmI

Choć hasła to zwykły ciąg znaków, już na pierwszy rzut oka widać, że są one zaszyfrowane przez program htpasswd. Jego użycie jest możliwe tylko wówczas, gdy mamy dostęp do linii komend serwera. Dostawcy hostingu niechętnie jednak oferują taką usługę. W takim przypadku musimy poradzić sobie w inny sposób. Pierwszy polega na wykorzystaniu mechanizmów w panelu administracyjnym serwera WWW. Operator umożliwia wówczas automatyczne wygenerowanie użytkowników i skojarzonych z nim haseł z poziomu zwykłej przeglądarki internetowej. Drugie rozwiązanie opiera się na programach działających online. Potrafią one wygenerować zaszyfrowane hasła, które następnie kopiujemy do pliku .htpasswd i przenosimy na serwer. Przykładowe generatory znajdziemy na stronach .htpasswd Content Generator [2] oraz .htpasswd generator [3].

Strony błędów

„404 File Not Found” – takim standardowym komunikatem serwer poinformuje nas, że strona, której zażądaliśmy, nie została odnaleziona. To jeden z najczęściej spotykanych błędów występujących podczas przeglądania Internetu. Predefiniowanych kodów zwracanych przez serwer jest znacznie więcej i dotyczą one m.in. wewnętrznych błędów serwera czy nieautoryzowanego dostępu do serwisu. Kody statusu nie muszą jednak wcale oznaczać błędu. Przykładowo: komunikat 200 OK. wysłany do przeglądarki informuje o odnalezieniu strony na serwerze. Obszerną listę kodów znajdziemy na stronach Wikipedii [4] oraz organizacji W3C [5].

Administrator strony internetowej może samodzielnie zadecydować, jaką akcje ma podjąć Apache w przypadku wystąpienia błędu. W praktyce najczęściej stosuje się mechanizm wyświetlania własnej strony (dokumentu) błędu zawierającej zrozumiały dla przeciętnego użytkownika przekaz o zaistniałej sytuacji zamiast surowego, technicznego komunikatu od serwera. Strony błędów mogą zostać zdefiniowane w pliku .htaccess. Jego konstrukcja jest bardzo prosta:
ErrorDocument 404 /komunikaty/nieznaleziono.html
ErrorDocument 403 "Nie masz dostępu do tej strony."
ErrorDocument 500 "/cgi-bin/obsluga_bledow.pl"
ErrorDocument 403 http://www.serwer.pl

Po słowie kluczowym ErrorDocument należy podać kod statusu oraz podejmowaną przez serwer akcję. Może to być załadowanie innej strony WWW (pierwszy wiersz przykładu), wyświetlenie komunikatu tekstowego (drugi wiersz), wywołanie skryptu (trzeci wiersz) czy po prostu przekierowanie do innego serwisu, także z innej domeny (czwarty wiersz). W przypadku gdy definiujemy własne strony błędów, np. w postaci pliku HTML, należy je odpowiednio wcześniej przygotować, przenieść na serwer i wskazać ścieżkę dostępu.

Zmiana strony startowej

Gdy wpiszemy w przeglądarce adres strony WWW obsługiwanej przez Apache’a, to przy standardowej jego konfiguracji automatycznie wyświetlana jest predefiniowana strona startowa. Jest to najczęściej plik index.html lub index.php umieszczony w głównym katalogu serwera. To powszechnie przyjęte nazewnictwo ma swoje odzwierciedlenie w konfiguracji Apache’a. Nazwa pliku startowego definiowana jest bowiem za pomocą parametru DirectoryIndex i najczęściej przyjmuje postać:
DirectoryIndex index.html index.htm index.php index.cgi

Kolejność wpisów ma tutaj znaczenie. I tak Apache najpierw będzie szukał pliku index.html, później index.htm, a na końcu index.cgi. Jeżeli z jakichś względów chcemy to domyślne zachowanie serwera zmienić, możemy użyć pliku .htaccess. Wystarczy, że umieścimy w nim wpis:
DirectoryIndex startowa.html

który nadpisze wartość tego parametru z głównego pliku konfiguracyjnego Apache’a. Od tego momentu domyślną stroną startową będzie plik startowa.html.

Blokowanie dostępu do strony

O ile .htpasswd umożliwia limitowanie dostępu do serwisu na poziomie użytkownika, tak mechanizm allow/deny pozwoli nam zablokować lub zezwolić na wyświetlanie strony osobom łączącym się ze wskazanego adresu IP, puli adresów czy domeny. Przykładowa konstrukcja wpisu w .htpasswd może wyglądać następująco:
order allow,deny
deny from serwer.pl
deny from 40.53.218.11
deny from 40.53.217.
allow from all

Parametr order pozwala ustalić kolejność przetwarzania dyrektyw allow i deny. W przypadku wpisu order allow,deny najpierw nakładane są warunki zezwalające na dostęp, a dopiero później te, które go zabraniają.

Na liście wpisów zamieszczamy tych, którym chcemy zablokować dostęp (w przykładzie tych z domeny serwer.pl oraz adresu 40.53.218.11 i całej puli adresów 40.53.217.), a następnie zezwalamy pozostałym (from all) na przeglądanie zasobów serwera.

CGI i SSI

Za pomocą .htaccess ustalimy także wiele innych parametrów pracy Apache’a. Nie sposób ich wszystkich wymienić, więc przytoczymy te najpopularniejsze. Aby możliwe było ich zaaplikowanie, dyrektywa AllowOverride musi być ustawiona na All lub w węższym zakresie na Options. Jeśli wybrany katalog serwera służy do przechowywania i wykonywania skryptów CGI, tworzymy dyrektywę:
Options +ExecCGI

I analogicznie, aby odebrać te prawa, jako parametr Options wpisujemy -ExecCGI. W podobny sposób włączymy obsługę mechanizmu SSI (Server Side Includes). Pozwala on na dynamiczne osadzanie wielu stron w jednym dokumencie. Jeżeli chcemy aktywować SSI dla wybranego katalogu, w .htaccess zamieszczamy wpis:
Options +Includes

Dodatkowo sprawdźmy, czy w głównym pliku konfiguracyjnym Apache’a zdefiniowano sposób obsługi CGI i SSI. Służą do tego dyrektywy:
AddHandler cgi-script .cgi
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Wpisy te możemy równie dobrze zamieścić w pliku .htaccess, o ile administrator przyznał dodatkowo możliwość modyfikacji ustawień z grupy FileInfo.

Listowanie katalogów

Na koniec chyba najprzyjemniejsza i najprostsza do zrozumienia dyrektywa Indexes. W niektórych domyślnych konfiguracjach serwera jest ona włączona. Jej działanie polega na wyświetlaniu zawartości katalogu, jeśli nie została wprowadzona pełna nazwa pliku oraz gdy nie istnieje plik startowy definiowany dyrektywą DirectoryIndex. Funkcja ta jest natomiast niezbyt chętnie udostępniana przez administratorów. Nie powinniśmy bowiem pozwalać odwiedzającym naszą stronę na przeglądanie zawartości katalogu, o ile oczywiście nie ma ku temu wyraźnych przesłanek. Aby zablokować listowanie wybranego katalogu, w pliku .htaccess umieszczamy wpis:
Options -Indexes

Analogicznie jak w poprzednich przypadkach, aby włączyć domyślnie nieaktywną funkcję listowania, znak minusa zastępujemy plusem. Warto zwrócić uwagę także na dyrektywę IndexIgnore. Pozwala ona na selektywne ograniczenie listowanych plików. Warto sprawdzić, czy nie jest ona już zdefiniowana w głównym pliku konfiguracyjnym. W wersji 2 serwera w dystrybucji znajduje się następujący wpis:
IndexIgnore .??* *~ *# RCS CVS *,v *,t

Ogranicza on listowanie m.in. plików rozpoczynających się od kropki, czyli choćby omawianego zbioru .htaccess. Zastosowano tutaj symbole wieloznaczne, np. * zastępującą dowolny ciąg znaków. W razie potrzeb możemy tę listę rozszerzyć o własne wpisy. Jeżeli nie chcemy, aby podczas wyświetlania zawartości katalogów były widoczne pliki graficzne (GIF, JPEG i PNG), możemy tę dyrektywę rozszerzyć o dodatkowe parametry:
IndexIgnore .??* *~ *# RCS CVS *,v *,t *.gif *jpg *jpeg *.png

Przedstawione zagadnienia nie wyczerpują możliwości, jakie daje użycie pliku .htaccsess. Żeby zachęcić do lepszego ich poznania, powiedzmy tylko tyle, że możliwe jest blokowanie botów czy bezpośrednich linków do plików na naszym serwerze.



Warto odwiedzić

[1] AllowOverride

http://httpd.apache.org/docs/2.2/mod/core.html#allowoverride

[2] .htpasswd Content Generator

http://home.flash.net/cgi-bin/pw.pl

[3] .htpasswd generator

http://www.htaccesstools.com/htpasswd-generator/

[4] Kody statusu protokołu HTTP

http://pl.wikipedia.org/wiki/Kod_odpowiedzi_HTTP

[5] Kody statusu protokołu HTTP (język angielski)

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Brak komentarzy:

Prześlij komentarz