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.

Na vaše otázky odpovíme. Nebojte se zeptat.

%d blogerům se to líbí: