Jak na cool URL jednoduše s PHP a mod_rewrite

Pátek, Září 30, 2011

Poslední dobou vídám na různých fórech na internetu často otázky na mod_rewrite, kdy se tazatel ptá na to jak podstrčit jinou adresu a vytváří kolikrát šílené konstrukty v .htaccess. V tomto článku se nebudu snažit popsat mod_rewrite ani jak fungují regulární výrazy ani nic podobného, to se můžete dočíst zde případně i zde, ale ukážu zde jednoduché a efektivní řešení jak pracovat s adresami aby vypadaly hezky a aby se s nimi krásně pracovalo.

Jak na mod_rewrite?

Pravidla pro mod_rewrite se zapisují do souboru .htaccess a musí být na serveru povoleny. Není potřeba vymýšlet žádné složité konstrukty, pouze stačí vše přesměrovat na index webu zhruba takto:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [L,QSA]

Tento zápis zajistí, že všechny adresy, které reálně neexistují, budou přesměrovány na index.php. Úvodní podmínky jsou nezbytně nutné, protože pokud by zde nebyly, pak by i požadavky na obrázky nebo css soubory skončily také na index.php a to nechceme.

Momentálně máme zajištěné přesměrování, ale jednotlivé adresy mohou být jak s lomítkem na konci tak bez lomítka na konci, což není příliš dobře. Dále tedy provedeme sjednocení. Následující kód zajistí, že všechny adresy budou přesměrovány na index.php a pokud budou končit lomítkem, pak budou přesměrovány na variantu bez lomítka.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [L,QSA]

Tím veškerá práce na souboru .htaccess končí. Dále se podíváme na zpracování adres v PHP.

Zpracování v PHP

Stejně jak jednoduché to je se souborem .htaccess, tak jednoduché je to i na straně php. Využijeme serverové proměnné $_SERVER['REQUEST_URI'] pro získání aktuální adresy, ze které separujeme jednotlivé části.

$p = strpos($_SERVER['REQUEST_URI'], '?');
if($p === false){
$patch = explode('/', $_SERVER['REQUEST_URI']);
}else{
$patch = explode('/', substr($_SERVER['REQUEST_URI'], 0, $p));
}
array_shift($patch);

Na začátku zjistíme, jestli adresa obsahuje otazník. Pokud ano, pak jej musíme oříznout, protože požadavky za otazníkem nás v adrese nezajímají. Ty jsou předány klasicky v poli $_GET. Po té adresu rozbijeme podle znaku ‚/‘ do pole $patch, a protože požadavek vždy začíná lomítkem, pak nakonec první položku pole odstraníme.

Nyní již máme v poli $patch jednotlivé části adresy, se kterými můžeme pracovat jednoduše pomocí podmínek nebo příkazů isset apod.

Příklad

Dejme tomu že na web www.examples.tld přijde následující požadavek:
www.examples.tld/dir1/dir2/dir3/
Nejprve dojde k přesměrování na variantu bez lomítka:
www.examples.tld/dir1/dir2/dir3
a v PHP kódu pak získáme v proměnné patch následující části:

$patch[0] == "dir1";
$patch[1] == "dir2";
$patch[2] == "dir3";

S těmi pak je možné snadno pracovat pomocí podmínek a větvit kód dle potřeby. Pokud bychom si chtěli ověřit, jaká část adresy existuje, uděláme to jednoduše takto:

if(isset($patch[2])){
// část adresy existuje
}else{
// část neexituje
}

Závěrem

Vytváření COOL url není žádná věda a není to ani nijak složité. Stačí se zamyslet nad problémem a vyřešit jej tou nejjednodušší a nejefektivnější cestou. Doufám, že tento návod Vám pomůže ve Vašem projektu.

 

2 Comments

  1. Haunter napsal:

    Thanx, man!!! ;-)

  2. numero napsal:

    Jednoduchý návod! Díky:-)

Napsat komentář