czwartek, 7 czerwca 2012

Apache: Najważniejsze możliwości .htaccess

Apache HTTP Server
Szukając na Google tutoriali do htaccess zwykle natkniemy się na kopie (!) miernych treści, gdzie wśród kilkunastu proponowanych zastosowań giną te najważniejsze, albo nawet nie są wspomniane.

Zamiast wałkować uzupełnianie listy typów MIME (które zwykle są kompletne) czy strony błędów (które zwykle można obsłużyć lepiej), warto się zająć czymś ważniejszym, jak pamięć podręczna i kompresja.


Cache - mod_expires

Moduł expires pozwala na manipulowanie pamięcią podręczną przeglądarki, poprzez modyfikowanie nagłówka Cache-Control. Poniższa konfiguracja sprawdza czy na serwerze zainstalowany jest interesująca nas funkcjonalność, jeśli tak to aktywuje go, a następnie określa wg MIME żywotność plików.
<IfModule mod_expires.c>
    ExpiresActive    on
    ExpiresByType    image/gif     "access plus 1 month"
    ExpiresByType    image/png     "access plus 1 month"
    ExpiresByType    image/jpg     "access plus 1 month"
    ExpiresByType    image/jpeg    "access plus 1 month"
</IfModule>

IE - mod_headers

Headers to ogólne narzędzie do manipulacji nagłówkami zapytań.
Interesującą propozycją, choć nastręczająca pewne problemy, jest dodanie X-UA-Compatible do zapytania, zamiast dokumenty

Tak to wygląda w HTML:
<meta name="X-UA-Compatible" content="IE=Edge;chrome=1" />
Zamiast tego można użyć poniższą konfigurację wg wzorca białej listy, lub czarnej listy.
<IfModule mod_headers.c>
    # Biała lista...
    <FilesMatch "\.(html|php)$" >
        Header set    X-UA-Compatible "IE=Edge;chrome=1"
    </FilesMatch>
   
    # ...lub czarna lista
    Header    set    X-UA-Compatible    "IE=Edge;chrome=1"
    <FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|htc)$" >
        Header    unset    X-UA-Compatible
    </FilesMatch>
</IfModule>

Kompresja - mod_deflate

Bardzo ważnym modułem jest mod_deflate, który w locie kompresuje pliki.
Po sprawdzeniu czy istnieje moduł istnieje ustawiamy filtr dla odpowiedzi, a następnie stosujemy go wg MIME. Zaznaczę że nie warto tego stosować np. przy plikach multimedialnych, które zwykle już są skompresowane.
<IfModule mod_deflate.c>
    SetOutputFilter    DEFLATE
    AddOutputFilterByType    DEFLATE    text/html    text/css    application/javascript
</IfModule>

Ładne linki - mod_rewrite

Ten temat jest akurat bardzo często poruszany, albo może znajdzie się tutaj coś więcej. Moduł rewrite służy do przepisywania/przekierowywania adresów.
Aktualnie popularną sztuczką jest przekierowanie wszystkich zapytań do jednego pliku, daje to możliwość stosowania atrakcyjniejszych adresów.
Przykład zaczerpnąłem z Kohana Framework. Moduł jest uruchamiany, następnie zostaje ustawiony katalog bazowy. Pierwsze RewriteRule blokuje dostęp do wybranych katalogów - adres kierujący do jednego z nich nie jest przetwarzany przez kolejne warunki, a serwer zwraca błąd braku dostępu.
Kolejne linie to ustalenie, że jeśli plik (-f), lub folder (-d) istnieje to adres nie jest przepisywany, czyli jest do nich swobodny dostęp, a adres nie będzie przepisany.
Ostatnia linia bloku to skierowanie wszystkich zapytań do pliku index.php.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^(?:admin|quest|modules|system)\b.* index.php/$0 [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* index.php/$0 [PT]
</IfModule>
Na większości serwerach wszystkie wyżej wymienione możliwości są dostępne, ale nie zaszkodzi być przygotowanym na brak modułów. Wszystkie omówione konfiguracje wrzuciłem do jednego pliku. Więcej informacji w temacie .htaccess warto szukać w dokumentacji Apache HTTP Server i na Stack Overflow.