Jak udělat hezká URL pomocí .htaccess?

.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:

phpinfo();

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.

RewriteEngine On

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.

RewriteRule vstup\.html    podstrceny_soubor.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:

RewriteRule ^(.*)/$    index.php?page=$1[L]

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:

RewriteRule ^(.*)/(.*)/$ index.php?page=$1&stranka=$2

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

RewriteBase /

 

RewriteBase /dir/

Direktiva RewriteCond

Tato direktiva určuje podmínku, za jaké bude následující pravidlo vyhodnoceno. Je to takové IF, ELSE


RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,QSA,L]

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

# 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]

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.