Soubor .htaccess
byl implementován do webového software Apache proto, aby umožnil autorovi stránek měnit některé vlastnosti serveru a nemusel o tyto změny žádat správce serveru. Soubor .htaccess
se umísťuje přímo do adresáře společně s obsahem webu a řídí vlastnosti serveru pro všechny soubory v tomtéž podadresáři a podsložkách. Přednost mají direktivy umístěné „hlouběji“.
Tečka na začátku jména souboru je jeho součástí a je povinná.
Soubor .htaccess
umožňuje řízení přístupu k adresářům. Omezení nastavená v souboru .htaccess
jsou aplikována rekurzivně na všechny podadresáře. Řízení přístupu
je možné pomocí uživatelského jména hesla, nebo pomocí IP adresy/doménového jména. Obě metody lze kombinovat a používat zároveň.
Pro povolení řízení přístupu na základě IP adres slouží direktiva Order deny,allow
určující pořadí provádění jednotlivých pravidel. V případě, že je na prvním místě parametr deny budou nejdříve provedena všechna zakazující (Deny from
) pravidla a teprve po nich všechna povolující (Allow from
) pravidla. Co se stane pokud pořadí parametrů obrátíme je zřejmé. V pravidlech Allow from
a Deny from
můžeme používat jak IP adresy tak doménová jména.
První příklad ukazuje nastavení, kdy je zakázán přístup ze všech adres, kromě IP adres patřící doméně trustica.cz a jejím subdoménám.
Order Deny,Allow Deny from all Allow from trustica.cz
V druhém příkladě je povolen přístup z adresy trustica.cz, kromě badboys.trustica.cz.
Order Allow,Deny Allow from trustica.cz Deny from badboys.trustica.cz
Vyhodnocení pravidel při nastavení Order Allow,Deny
proběhne v následujícím pořadí. Nejdříve je vždy vyhodnoceno implicitní nastavení, které zakáže kompletní přístup. Poté je provedena direktiva Allow
, která povolí přístup z trustica.cz a na závěr je zakázán přístup z badboys.trustica.cz.
Je důležité nezapomínat na správné pořadí Allow
a Deny
. Pokud bychom tyto dva řádky prohodili, vykonal by se jen příkaz Deny
.
Další možností je řízení přístupu na základě dvojice údajů uživatelské jméno/heslo. Nejdříve je třeba autentifikaci pomocí hesla povolit direktivou AuthType basic
tento druh autentifikace povolit. Pomocí direktivy Require
určujeme skupinu uživatelů mající oprávnění pro přístup. Můžeme buďto pomocí parametru valid-user
povolit všechny platné uživatele. Pokud místo parametru valid-user
použijeme parametr user
, můžeme vypsat seznam povolených uživatelů.
Následující část souboru .htaccess
zajistí, že obsah složky, ve které je soubor .htaccess
umístěn, bude přístupná pouze pro uživatele, kteří mají přihlašovací jméno a heslo v souboru .htpasswd.
AuthType Basic AuthName "Zadejte přihlašovací údaje" AuthUserFile .htpasswd Require valid-user
Direktiva AuthName
slouží pro nasatavení titulku přihlašovacího okna.
Pokud bychom chtěli umožnit přihlášení jen některým uživatelů ze souboru .htpasswd, pak změníme pouze direktivu Require
.
AuthType Basic AuthName "Zadejte přihlašovací údaje" AuthUserFile .htpasswd Require user bob alice
Výše uvedený příklad pak umožní přihlášení pouze uživatelům Bob a Alice.
Soubor se seznamem uživatelů se většinou jmenuje .htpasswd a obsahuje seznam uživatelů včetně jejich hesel. Cestu k tomuto souboru je třeba určit pomocí direktivy AuthUserFile
relativně od kořene vašeho webu. Tento soubor server skrývá, nelze jej prohlížet přes web, takže hesla se nikomu nezobrazí.
Pokud kombinuje výše uvedené metody, je možné nastavit, aby k úspěšné autentizaci byla zapotřebí pouze jedna z nich. Toto lze provést pomocí direktivy Satisfy
přidáním následujícího řádku do souboru .htaccess
.
Satisfy Any
Pokud na vašem webu vytvoříte složku, do které nakopírujete libovolné soubory, jsou tyto soubory viditelné pro všechny návštěvníky webu. Jejich zobrazování jde vyřešit triviálně vytvořením souboru, který Apache automaticky zobrazí (například index.html
) místo obsahu složky. Může být i prázdný.
Ke stejnému účelu můžeme použít i soubor .htaccess
. K zakázání zobrazení slouží direktiva IndexIgnore
. Pokud chceme zakázat vypisování obsahu kompletně, použijeme jako parametr *
.
IndexIgnore *
Můžeme však zakázat jen vypisování určitého typu souborů.
IndexIgnore *.jpg *.gif
Výše uvedený příklad zakáže vypsání souborů s koncovkou jpg a gif. Jednotlivé parametry direktivy se oddělují mezerou. Hvězdička zastupuje libovolný počet znaků (0..n). Pokud jméno souboru odpovídá alespoň jednomu parametru, pak se soubor ve výpise nezobrazí.
Pokud uživatel zadá neplatnou adresu stránky, dojde k chybě číslo 404 - Not Found a server vrátí stránku, která ho o tomto problému informuje. Pomocí .htaccess
lze místo této výchozí chybové stránky použít vlastní.
ErrorDocument 404 http://www.trustica.cz/moje_chybova_stranka.php
Tato řádka zaručí, že v případě, že návštěvník stránky zadá adresu neexistující stránky, bude mu vrácena moje_chybova_stranka.php
. Tuto modifikaci je možné provést pro různé stavové kódy. Vlastní chybou stránku lze nastavit pouze u chyb začínajících číslicí 4.
Mod_rewrite je modul pro webový server Apache, který slouží k přepisování obsahu adresy, která přijde jako požadavek serveru. Pokud tedy v prohlížeči zadáme například www.trustica.cz
, dostane tuto adresu náš server, který ji předá modulu mod_rewrite. Mod_rewrite na základě pravidel definovaných v souboru .htaccess
může adresu pozměnit. Pozměněnou adresu pak předá zpět webovému serveru, který na základě již upravené adresy, zpracuje požadavek. Po průchodu modulem, by tedy adresa mohla vypadat jako www.acitsurt.cz
.
Mod_rewrite disponuje velikou konfigurovatelností, a její kompletní popis by byl nad rámec tohoto návodu. Proto ukážeme jen několik užitečných příkladů. Rozsáhlejší manual najdte například na této adrese: http://www.blogstorm.co.uk/htaccess-mod_rewrite-ultimate-guide/
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. -- Brian Moore
Přístup na váš web je nejspíše možný přes několik URL. Např.
http://www.vaseadresa.com http://vaseadresa.com http://www.vaseadresa.com/index.html http://vaseadresa.com/index.html
Poklud zadáte každou z těchto adres dostane zpět různou stránku, která se zdánlivě neliší. Jenže pokud zadáte http://www.vaseadresa.com
budou všechny odkazy na této stránce začínat právě http://www.vaseadresa.com
. Pokud na stránku zavítáte pomocí http://vaseadresa.com
všechny odkazy budou začínat http://vaseadresa.com
. Pomocí mod_rewrite je možné dosáhnout toho, aby pokud zavítáte na libovolnou adresu, byla tato adresa přepsána, a vy dostali vždy opravdu identickou stránku.
Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^vaseadresa.com RewriteRule (.*) http://www.vaseadresa.com/$1 [R=301,L] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ RewriteRule ^index\.html$ http://www.vaseadresa.com/ [R=301,L]
Podrobné vysvětlení jednotlivých řádek této ukázky je nad rámec tohoto návodu, nicméně každý sebepodivnější znak zde má svoji úlohu.
Direktiva RewriteEngine
povoluje mod_rewrite (Tuto direktivu je na našich serverch možné vynechat, neboť je použita již v celkovém nastavení našeho serveru.). Direktivou RewriteCond
je definována podmínka pro aplikování pravidla, které je definováno pomocí direktivy RewriteRule
.
Pro návštěvníka stránek může být problematické pracovat s adresou ve tvaru www.neco.cz/list.php?id=10. Pomocí mod_rewrite je možné dosáhnout toho, aby této adrese odpovídal například adresa www.neco.cz/list/10. Ta je pro absenci některých znaků jednodušší například pro zapsání.
RewriteEngine on RewriteRule ^/list/([^/\.]+)/?$ list.php?id=$1 [L]
Direktiva RewriteRule
říká, že pokud adresa vypadá /list/neco/
a to něco neobsahuje žádné lomítka ani tečky, vezme se to něco a předá se pomocí $1
do požadavku, který je odeslán serveru. Poslední lmítko ve vstupní adrese být nemusí. Parametr [L]
říká, že přepsání adresy se provede lokálně, takže čtenář se o tom vůbec nedozví a uvidí pouze tu upravenou adresu.
Direktiva Options
umožňuje povolení/zakázání některých vlastností serveru.
Při povolování vlastností máme dvě možnosti. První z nich je vyjmenovat seznam vlastností které chceme povolit. Všiměme si, že jednotlivé vlastnosti nepředchází znaménko +,-. Je důležité nezapomenout, že v tomto případě jsou všechny vlastnosti kromě vyjmenovaných zakázané.
Options vlastnost1 vlastnost2
Druhou možností je přidat/odebrat pouze konkrétní vlastnosti. Vlastnost, kterou chceme přidat předchází znak +, zakazovanou vlastnost pak předchází znaménko -.
Options +vlastnost1 -vlastnost2
Povolí výpis obsahu složky, pokud chybí DirectoryIndex
(většinou index.html, nebo index.php).
Povolí serveru sledovat symbolické odkazy. Místo cíle odkazu, vrátí obsah cíle odkazu.
Povolí Server Side Includes. Ty umožňují vkládat do jinak statických stránek direktivy, které server nahradí v okamžiku kdy si klient vyžádá stránku. Klient pak obdrží stránku, kde místo direktivy vidí výsledek jejího vykonání.
Povolí stejnou vlastnost jako Includes, ale zákáže vykonávání direktivy #exec
Nísledující příklad zakáže zobrazení obsahu složky s chybějícím indexem a povolí Server Side Includes.
Options +Includes -Indexes