mod_rewrite a hezké url

Sun, 22 Apr 2007 15:54:07 +1100

Často vyhledávané slovní spojení na internetu - "Jak na hezké url?" Vyhledávače Vám najdou spoustu hesel, ale jak dojít k opravdu funkčnímu řešení? Sám jsem odpovědi na tohle téma mnohokrát vyhledával, ale málokdy jsem našel skutečné řešení. Odpovědi se mi vždy dostalo až na diskusních fórech: diskuse.jakpsatweb.cz, jaknaweb.com, webzdarma.cz/forum Většina článků se totiž věnuje buď základní syntaxi .htaccessu, nebo 100x omílanému tématu vlastních chybovek.

V tomto článku nebudu popisovat žádný návod na práci se souborem .htaccess, ale nabídnu Vám již hotová řešení, které jsem sám zkoušel, sám je také používám, takže jejich funkčnost je ověřená. Jediný problém, který může nastat je nedostatečná podpora mod_rewrite hostingu. Již dopředu raději upozorním, že např. na IC.cz s těmito přepisy moc nepochodíte.

Jako první bych uvedl základní přesměrování, na verzi adresy s nebo bez www:
http://www.mujweb.cz » http://mujweb.cz

# www > bez www
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^www.mujweb.cz$
RewriteRule (.*) http://mujweb.cz/$1 [R=301,QSA,L]

# verze bez www > s www
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^mujweb.cz$
RewriteRule (.*) http://www.mujweb.cz/$1 [R=301,QSA,L]

Je pouze na Vás, pro kterou verzi se rozhodnete - ale je dobré si jednu zvolit. Pro Google jsou to totiž 2 rozdílné adresy a všechny zpětné odkazy by se Vám dělily.

Jako druhý přepis uvedu přesměrování ze subdomény na doménu. Pokud máte web např. na některém z freehostingů, tak cokoli.mujweb.wz.cz == mujweb.wz.cz. Problém je akorát v tom, pokud to "cokoli" do adresy zadáme, tak to tam také zůstane. Stačí vložit následující řádky do souboru .htaccess, a při zadání adresy jakékoli neexistující subdomény na Vašem webu proběhne přesměrování na Vaši hlavní stránku.

# subdoména > doména (cokoli.mujweb.cz > mujweb.cz)
RewriteEngine On
RewriteBase /
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^(.*).mujweb.cz
RewriteRule (.*) http://mujweb.cz/$1 [R=301,QSA]

Tohle přesměrování samozřejmě nepoužívejte v případě, že máte v .htaccessu vytvořenou subdoménu (tzn. doménu 3. řádu na placeném a doménu 4. řádu na freehostingu)

Subdoména se dá vytvořit následujícím zápisem... Dejme tomu, že máme na webu fotogalerii, a chceme pro ni vytvořit vlastní subdoménu. V kořenovém adresáři vytvoříme složku např. foto, kterou pak pomocí mod_rewrite převedeme na doménu 3. respektive 4. řádu. Pokud tak učiníme, musíme ale počítat s možnými problémy - přepisem vlastně složku povýšíme na úroveň kořenového adresáře, takže:

1. přestanou fungovat relativní HTML odkazy

2. přestane fungovat relativní includování

3. .htaccess v rootu přestane mít na naši subdoménu vliv

4. některé další přepisy tu nebudou fungovat

# subdoména foto.mujweb.cz
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} foto.mujweb.cz
RewriteCond %{REQUEST_URI} !foto/
RewriteRule ^(.*)$ foto/$1

V tuto chvíli nám budou fungovat obě adresy: http://mujweb.cz/foto a http://foto.mujweb.cz. Vy už se musíte postarat o to, aby všechny zpětné odkazy vedly na tu správnou adresu, a vyhledávače indexovali jen to, co chceme my.

Takže subdoménu už jsme vytvořili, ale jde to i zpět? Pokud už Vám ji vyhledávače zaindexovaly, a vy se chcete vrátit zpět k adrese se složkou za lomítkem, stačí použít tento přepis:

 # subdoména > doména/složka
RewriteEngine On
RewriteBase /
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^slozka.mujweb.cz
RewriteRule (.*) http://mujweb.cz/slozka/$1 [R=301,QSA,L]

A na závěr už se konečně pustíme do těch "cool uris". V prvé řadě je ale nutné si ujasnit, jak je vlastně budeme používat: pokud se jedná pouze o klasické includování podle podmínky, není problém. Horší je to např. u výpisu z adresáři... Jelikož nám Cool uris udělají z každého souboru pomyslný adresář, musí samozřejmě platit, že ten adresář neexistuje. Pokud máme např. fotogalerii postavenou na výpisu souborů ze složky, mohli bychom si vystačit s něčím takovým: mujweb.cz/?page=prazdniny » mujweb.cz/prazdniny.html. Tento přepis se dá použít i u klasického includování, a navíc návštěvníkům vytvoří krásnou iluzi statického webu. Lze použít i jiné koncovky, které prohlížeče znají: *.php, *.php3, *.htm, *.asp, *.cgi ... a jiné.

# mujweb.cz/?promenna=neco > mujweb.cz/neco.html
RewriteEngine On
RewriteRule ^(.*).html /?promenna=$1

Nebo jiný zápis, s podobným efektem: (změna je v přidání query stringu a v omezení regulárním výrazem)

RewriteRule ^([A-Za-z0-9-]+).(html)?$ /?promenna=$1 [L,QSA]

Další přepis, který je poměrně nutný při zavádění "hezkých url" je následující: potřebujeme se zbavit indexu.php v adrese. Takže potřebujeme přesměrování, které při zadání http://mujweb.cz/index.php návštěvníka přesměruje na http://mujweb.cz/ To samé lze použít i pro index.htm či index.html...

# mujweb.cz/index.php > mujweb.cz/
RewriteEngine On
RewriteRule ^index.php$ http://mujweb.cz/$1 [R=301]

A teď už ty dlouho očekávaní Cool uris =o) Uvádím 3 funkční verze, jednu z nich pro jednu i dvě proměnné. Jestli na konci lomítko bude nebo ne, už určíte Vy tvarem html odkazů. Ty by měly vypadat nějak takto: a href="/neco/"

# mujweb.cz/?page=neco > mujweb.cz/neco/
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1

Pro dvě proměnné stačí k výše uvedenému přepisu přidat následující řádky:

# mujweb.cz/?page=neco&stranka=druha > mujweb.cz/neco/druha
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?page=$1&stranka=$2

Alternativní možnost pro jednu proměnnou:

# mujweb.cz/?page=neco > mujweb.cz/neco/ (jiná možnost)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /?page=$1 [L]

A třetí možnost zápisu pro jednu proměnnou:

# mujweb.cz/?page=neco > mujweb.cz/neco/ (zase jiná možnost)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9-\_]+)/?$ ?page=$1 [L]

Cool uris nám udělají z každého souboru adresář: takže se opět může stát, že některé HTML odkazy přestanou fungovat: v takovém případě stačí každý a href="/index.php", link href="/style.css", img src="/obrazky/picture.jpg" začít lomítkem. Nezapomeňte také na to, že při přepisu pro více proměnných musíte uvést samostatně přepis pro proměnnou každého řádu.

To by bylo tak asi vše, užívejte si své hezké url. Zasloužíte si je ;-)