.htaccess je velmi silný nástroj, kterému bohužel dost lidí nerozumí, byť není zas tak moc složitý. Největší problém je v tom, že je dost problém najít k němu kvalitní dokumentaci. V tomto článku se podíváme na to, jak zprovoznit „hezká URL“ a ukážeme si pár dobrých on-line nástrojů, které nám s přípravou .htaccess souboru pomohou.
Konfigurace serveru
Prvním krokem zprovoznění hezkých URL je zjištění, jestli váš server podporuje přepis URL. U Apache serveru se o přepis URL stará modul mod_rewrite, který je potřeba v nastavení povolit.
Pokud nemáte možnost konfigurovat server, pak se o instalaci modulu mod_rewrite můžete přesvědčit pomocí příkazu:
[php]phpinfo();[/php]
Upozornění před nastavováním: chybná konfigurace .htaccess může vyvolat interní chybu serveru 500. Pokud k tomu dojde, máte někde chybu v tomto souboru.
Konfigurace .htaccess
Nyní si vytvořte soubor s názvem „.htaccess„, do kterého napište první direktivu, která aktivuje přepis URL.
[html]RewriteEngine On[/html]
První nejjednodušší příklad přesměrování URL spočívá v přesměrování jedné stránky na druhou. O to se nám postará direktiva RewriteRule.
[html]RewriteRule vstup\.html podstrceny_soubor.html[/html]
Soubor vstup.html je to co uživatel zadá do prohlížeče a podstrceny_soubor.html je soubor, který se načte.
Protože takovéto zápisy by byly moc zdlouhavé, používají se místo názvů souborů regulérní výrazy. Takový zápis pak může vypadat například takto:
[html]RewriteRule ^(.*)/$ index.php?page=$1[L][/html]
Toto pravidlo vezme vše co je napsané za http://example.com/, mimo parametry nacházející se za otazníkem např: ?lang=cs&country=cs, a vloží vše do proměnné page. Pokud dojde k vykonání pravidla, nebude díky parametru [L] uvedeném na konci výrazu další pravidlo již vyhodnocováno – nejedná se o povinný parametr. Seznam parametrů je na konci článku.
Ukázka vyhodnocení výrazu
vstup: http://example.com/about, výstup: http://example.com/index.php?page=about
vstup: http://example.com/about/firm, výstup: http://example.com/index.php?page=about/firm
Pokud byste chtěli část URL firm předat do jiného parametru, musíte upravit regulérní příkaz na:
[html]RewriteRule ^(.*)/(.*)/$ index.php?page=$1&stranka=$2[/html]
Tento příkaz by hodnotu about uložil do proměnné page a hodnotu firm do proměnné stranka.
$1 – hodnota první proměnné, $x – hodnota xté proměnné
Proměnné RewriteRule
- %{REQUEST_FILENAME}
- %{REQUEST_URI}
- %{QUERY_STRING}
- %{SERVER_PORT},
- %{SERVER_NAME}
- %{HTTPS}
- %{PATH_INFO}
- %{REQUEST_METHOD}
- %{REMOTE_ADDR}
- %{REMOTE_HOST}
- %{HTTP_USER_AGENT}
- %{HTTP_COOKIE}
- %{HTTP_ACCEPT_LANGUAGE}
- %{HTTP_HOST}
- %{HTTP_REFERER}
- %{ENV:REDIRECT_STATUS}
- %{DOCUMENT_ROOT}
To je sice v principu vše, ty nejprimitivnější přesměrování lze udělat takto jednoduše, nicméně určitě bude potřebovat i další direktivy.
Direktiva RewriteBase
Určuje kořenový adresář, který chceme přepsat
[html]RewriteBase /[/html]
[html]RewriteBase /dir/[/html]
Direktiva RewriteCond
Tato direktiva určuje podmínku, za jaké bude následující pravidlo vyhodnoceno. Je to takové IF, ELSE
[html]
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,QSA,L]
[/html]
Tento příklad přesměruje stránku zadanou bez www, na stránku s www. Parametr [NC] znamená, že se nerozlišuje velikost písmen. [R=301] znamená, že dojde k přesměrování s kódem 301 – trvalý přesun na uvedenou adresu. [QSA] znamená, že dojde k přidání všech parametrů, které byly za doménou první úrovně (např.: ?page=1&lang=cs)
Regulérní výrazy
Znak | Význam |
{ } | definuje minimum a maximum opakování. {2, 5} znamená minimálně dvakrát, maximálně pětkrát |
[ ] | uzavření výrazu – rozsahu |
– | pomlčka definuje rozsah od do např.: A-Z, 0-9 |
^ | má dvě funkce, které se rozlišují podle toho kde ^ je. Pokud je v [ ], pak zastupuje logický výraz NOT. Na jiným místech označuje začátek reg.výrazu. |
$ | označuje konec reg. výrazu |
. | „tečka“ zastupuje jakýkoliv znak, kromě tečky. Chcete-li tečku musíte tento znak napsat se zpětným lomítkem (tzv. escape znak) \. |
\ | escape znak |
? | znamená, že znak před otazníkem, se může objevit jednou, nebo vůbec |
+ | znamená, že se výraz před + musí vyskytnout alespoň jednou |
* | znamená, že se výraz může vyskytnou libovolněkrát |
| | znamená logické OR pro výrazy. Buď jeden nebo druhý výraz |
! | logické NOT |
Příklady:
- [0-9] – zajímají nás hodnoty od 0 do 9
- [a-zA-Z] – zajímají nás malé a velké znaky od A do Z
- [0-9abc] – zajímají nás čísla od 0 do 9 a malé znaky a, b a c
- [pes] – zajímají nás znaky malé p, e a s
- [^0-9] znamená, že výraz bude pravda, pokud vstup nebude obsahovat čísla 0-9
- [^pes] znamená, že výraz bude pravda, pokud vstup nebude obsahovat malé písmena p, e a s
- ^pes$ znamená, že výraz je pravda, pokud obsahuje pouze slovo pes.
- a? – bude pravda, pokud vstup obsahuje malé písmeno a jednou nebo vůbec.
- [a-z]? – bude pravda, pokud vstup obsahuje jedno malé písmeno od a do z.
- (abc)? – bude pravda, pokud vstup obsahuje řetězec abc
- (.*) – znamená cokoliv
- ^stranka-(.*) – bude pravda, pokud vstupní řetězec bude začínat na „stranka-“ a bude následovat čímkoliv
Parametr | Význam |
[OR] | Řetězení podmínek |
[R] | Přesměrování =301 nebo =302 |
[F] | Vygenerování chybové hlášky 403 Forbidden |
[G] | Vygenerování HTTP statusu 401 – Unauthorized |
[L] | Poslední vykonávané pravidlo |
[N] | Znovu spustí průchod pravidly |
[C] | Spojuje dvě pravidla dohromady |
[T] | Odešle požadavek s jiným mine-type |
[NS] | Použij, pokud není definováno další pravidlo |
[NC] | Ignorování velikosti písma |
[QSA] | Zachování proměnných za otazníkem v URL |
[S] | Přeskočí x dalších pravidel. S=3 přeskočí tři další pravidla |
[E] | E=var nastaví proměnné prostřední, které může být dotazováno dalšími pravidly |
Ukázka .htaccess souboru, který pracuje s pěknými URL
[html]
# zapnutí přesměrováni
RewriteEngine On
# nastavení hlavního adresáře
RewriteBase /
# vyloučení aplikace pravidel na soubory css,gif,ico,…
RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png|swf|txt)$
# následujcí se netýká souborů
RewriteCond %{REQUEST_FILENAME} !-f
# netýká se URL končící na /
RewriteCond %{REQUEST_URI} !(.*)/$
# URL nekončící na / doplní o / a přesměruje stránku na stránku s /. Pokud je pravidlo aplikováno, je poslední.
RewriteRule ^(.*)$ $1/ [L,R=301]
# přepisuje http:…./about/ na index.php?page=about a připojí k němu všechny předané parametry za otazníkem. Pokud je pravidlo aplikováno, je poslední.
RewriteRule ^(.*)/$ index.php?page=$1 [L,QSA]
[/html]
On-line nástroje na generování .htaccess
Pokud vám něco nejde nastavit, tak můžete zkusit využít nějaký z on-line generátorů. Od těch však nečekejte nic extra, protože vygenerovat regulérní výraz šitý pro vás na míru je těžké. Berte tedy tyto generátory jen jako pomocníky.