Jak działa htaccess

Ustawienia pliku .htaccess dotyczą treści katalogu, w którym ten plik jest umieszczony, zarówno jak treści wrszystkich katalogów, znajdujących się na dowolny poziom głębiej tego katalogu. Jeżeli w którymś z podkatalogów znajdzie się inny plik .htaccess, ustawienia z tego pliku zastępią sobą ustawienia z pliku poziomu wyżej dla tego podkatalogu.

W pliku .htaccess można ustawić wiele różnych parametrów i regulować dostęp. Można ten plik wykorzystać, żeby:

  • ustawić przekierowania (na przykład z darmowej domeny na płatną);
  • realizować przyjazne adresy stron;
  • ustawić własną stronę błędu 404 lub 403 dla każdej ze swoich domen;
  • kontrolę cachingu;
  • ograniczyć dostęp do plików lub katalogów
  • regulować inne ustawienia.

Z powodów bezpieczeństwa na hostingu mintme.host wprowadzone następujące ograniczenia:

  • Wyłączono możliwość sterowania parametrami php za pomocą dyrektyw php_value.
  • Dyrektywa ErrorDocument jest ignorowana; własne strony błędów można ustawić na kontach płatnych poprzez wgranie je do katalogu errors/nr-błędu.html (np. errors/404.html).

Przeanalizujmy kilku najczęściej stosowanych funkcji htaccess.

Przyjazne adresy

Kiedy na stronie wszystkie zapytania kierują się do index.php, bez pliku .htaccess będą wyglądały podobnie do happyuser.mintme.host/index.php?q=nazwastrony. Przyjazne adresy pozwalają to zmienić w taki sposób, żeby zapytanie o happyuser.mintme.host/nazwastrony automatycznie było przekazane przez serwer www do index.php.

Zobaczmy jak to ustawienie wygląda w pliku .htaccess Wordpress'a:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
    

Najpierw sprawdzane jest czy włączony moduł przekierowań (<IfModule mod_rewrite.c>), potem poprzez dyrektywy RewriteEngine i RewriteBase ustawia się, że dla tego katalogu będą stosowane przekierowania.

Dyrektywa RewriteRule ^index\.php$ - [L] powoduje, że zapytania do index.php nie są przekierowane, a inne kondycje przekierowania są omijane (flaga [L]).

Jeżeli jednak zapytanie nie dotyczy index.php, sprawdzane są następujące dyrektywy RewriteCond, które w tym przypadku testują, czy na serwerze nie istnieje pliku lub katalogu pod adresem zapytania, i jeżeli nie, wykonane jest przekierowanie w ostatnim RewriteRule - czyli zapytanie jest przekazane do pliku index.php.

Ograniczenie dostępu do katalogu

Inna często stosowana funkcja .htaccess to ograniczenie dostępu do podkatalogów strony w taki sposób, żeby były dostępny tylko właścicielowi strony przez FTP lub oprogramowaniu serwerowym, ale nie przez otwarty dostęp z przeglądarki. Może to być np. katalog z kopiami zapasowymi bazy dany lub katalog z wewnętrznym kodem php, który nie jest wyzwalany bezpośrednio zewnątrz.

Przepuśćmy, że na stronie jest podkatalog backups w którym są przechowywane kopie zapasowe bazy danych, które są robione automatycznie za pomocą zadania crona. Żeby ograniczyć dostęp do tego katalogu zewnątrz, wystarczy stworzyć taki plik .htaccess w tym katalogu:

Deny from all

Kiedy ktokolwiek spróbuje wejść do tego katalogu, serwer www zwróci błąd 403 Forbidden (Dostęp zakazany). Kopie zapasowe będą dostępne tylko przez FTP właścicielowi strony.

Przekierowanie subdomeny www

Chociaż dodawanie www. do domeny jest bardzo rozpowszechnione, pochodzi to z wczesnych czasów rozwoju WWW, kiedy jeszcze nie był to najpopularniejszy protokół łączenia się z serwerem.

Dziś wiele stron stosują przekierowanie z subdomeny www. na główną domenę, żeby skrócić i uprościć wyświetlany adres.

Na hostingu mintme.host subdomena www. jest dodawana automatycznie jako alias do domeny bez prefiksu - co powoduję, że na tej domenie wyświetla się ta sama strona. Ale nie jest robione przekierowanie - ta decyzja pozostawiona jest do właściciela strony.

Żeby ustawić przekierowanie z domeny www.happyuser.mintme.host na domenę happyuser.mintme.host, należy w głównym katalogu domeny happyuser.mintme.host wgrać plik .htaccess o takiej treści:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.happyuser\.cba\.pl$ [NC]
RewriteRule ^(.*)$ http://happyuser.mintme.host/$1 [R=301,L]
    
Zapytania o http://www.happyuser.mintme.host/ulubiona-strona.php zostaną automatycznie przekierowane na http://happyuser.mintme.host/ulubiona-strona.php.