Zajisté se setkáváte s adresami působícími srozumitelně. Na druhé straně jsou takové, ze kterých nevyčtete, co skrývají. Vysvětlíme si, jak se vytváří a pracuje se „srozumitelnými“ adresami za pomocí mod_rewrite.
Jedním z mnoha důvodů pro použití srozumitelných adres jsou vyhledávače (SEO). Často je také zmiňována výhoda pro uživatele, kteří v případě ručního zadání adresy nejsou nuceni zadávat „spleť“ znaků.
Jak to funguje
Abyste mohli vytvářet tyto sympatické adresy, je nutné mít aktivován modul mod_rewrite spolu s nějakou formou podpory souboru .htaccess. Uživatel zadá webovou adresu, po zpracování dorazí požadavek na server. Server uvidí soubor .htaccess, který zpracuje dle, v něm uvedených, pravidel. Právě ve zmíněném zpracování podstrčíme jinou adresu, aniž by uživatel něco poznal.
Tabulka s články
Chceme tento styl adres využít např. pro články, které budeme mít uložené v databázi. Musíme vymyslet způsob, jak propojit články se srozumitelnými adresami. Asi nejjednodušší je mít tabulku, která bude uchovávat názvy článků s texty, a url odkazy k jednotlivým článkům. Před uložením článku do databáze vytvoříme z názvu článku srozumitelný odkaz, který bude identifikovat daný článek. Jediným požadavkem je mít jedinečné názvy článků, aby nenastala situace, kdy bude stejný odkaz pro dva různé články, avšak se stejným názvem. Toto je otázka ošetření před uložením a nebudeme se tím nyní zabývat.
Postup činností
Zadaná adresa se zpracuje na serveru. My si z ní vytáhneme adresu článku. Další zpracování ponecháme na podstrčeném scriptu, kterému navíc předáme jako parametr v adrese právě získanou adresu článku. Ve scriptu již bude klasická režie, která zajistí vyhledání článku a jeho následné vypsání.
Začínáme vytvářet
Nejprve si vytvořte databázi nazvanou test, následně v ní vytvořte tabulku pojmenovanou clanky, která bude mít 4 sloupce. Tabulka bude následujícího formátu, který je čitelný z SQL dotazu:
CREATE TABLE `clanky` (
`id` INT NOT NULL AUTO_INCREMENT ,
`nazev` TEXT NOT NULL ,
`url` TEXT NOT NULL ,
`text` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = innodb;
Nyní vložte do tabulky následující údaje:
id | nazev | url | text |
1 | První článek | prvni-clanek | Toto je tělo prvního článku. |
2 | Druhý článek | druhy-clanek | Toto je tělo druhého článku. |
3 | Třetí článek | treti-clanek | Toto je tělo třetího článku. |
Ze zadaných údajů je patrné, že tabulka bude obsahovat tři články. První sloupec je jedinečné id (v našem případě by to mohl být i sloupec url), druhý sloupec zastupuje název článku, ve třetím sloupci máme adresy, které zastupují jednotlivé články a poslední čtvrtý sloupec obsahuje samotný text článku.
Tímto máme databázi připravenou.
Nyní si vytvořte v rootu (kořenovém adresáři) serveru složku nazvanou „clanky“. V ní vytvořte dva prázdné soubory, jeden nazvěte .htaccess a druhý index.php.
Úprava .htaccess
Upravte soubor .htaccess následovně:
RewriteEngine on
RewriteRule ^([a-zA-Z0-9\\-]*)$ /clanky/index\.php?url_clanku=$1 [L,NC]
Na prvním řádku se nachází RewriteEngine on, kterým zajistíme nastartování rewrite režimu. Na dalším řádku již máme pravidlo. Každé pravidlo začíná RewriteRule, za kterým následuje, v našem případě, regulární výraz ^([a-zA-Z0-9\\-]*)$, který vymezuje platné znaky pro adresu článku. Jsou povolena velká a malá písmena, číslice a pomlčka. Za regulárním výrazem následuje script, kam přesměrujeme další zpracování, platí-li regulární výraz. Script se jmenuje index.php a je uložen v adresáři /clanky.
V přesměrování navíc předáváme parametr nazvaný url_clanku (pro nás velice důležitý parametr), kterému přiřadíme obsah proměnné $1. Tato proměnná právě obsahuje část adresy, kterou je zadaný url odkaz názvu článku. Pokud tedy uživatel zadal http://www.nejakadomena.cz/clanky/prvni-clanek, tak proměnná $1 bude obsahovat řetězec „prvni-clanek“.
Dále jsme zde použili nepovinné modifikátory L a NC. L způsobí, že toto pravidlo je poslední, které bude provedeno, pokud mu požadavek vyhoví (regulární výraz). NC stanoví, že nebude brán zřetel na rozlišování velkých a malých písmen. Můžete tedy zadat http://www.nejakadomena.cz/clanky/prvni-clanek nebo http://www.nejakadomena.cz/CLANKY/PRVNI-CLANEK. Dále by mohl být přítomen modifikátor QSA, který by zajistil, že by se do nové adresy přenesly i parametry z původní adresy, které následovaly za otazníkem (http://localhost/clanky/prvni-clanek?neco=xyz).
Úprava index.php
Poslední částí je soubor index.php, který má následující obsah:
<php
// připojení k databázi
//
$dbLink = @mysql_connect("localhost", "[UŽIVATEL]", "[HESLO]") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
mysql_query("SET CHARACTER SET latin2");
// dotaz pro získání článku
$sql = "SELECT * FROM `clanky` WHERE `url`='" . mysql_real_escape_string($_GET['url_clanku']) . "'";
$sql_query = mysql_query($sql) or die (mysql_error());
// zjišťujeme počet článků
$num_rows = mysql_num_rows($sql_query);
// pokud existuje právě jeden článek
if( $num_rows == 1 ){
// ...tak jej vytáhneme
$data = mysql_fetch_array($sql_query);
// ...a vypíšeme
echo 'Název: ' . $data['nazev'] .
'url: ' . $data['url'] .
'text: ' . $data['telo'];
// pokud článek neexistuje
}else{
// ...vypíšeme chybovou hlášku
echo 'Článek neexistuje';
}
// odpojení od databáze
mysql_close($dbLink);
?>
Ukázkový script je zcela primitivní, vezmeme parametr z adresy a porovnáme ho s údaji v databázi ve sloupci url. V případě, že je adresa nalezena, tak vrácený záznam (řádek) je článek, o který má uživatel zájem. Stačí tedy článek vypsat.
Nezbývá než to vyzkoušet. Do adresního řádku prohlížeče napište adresu (na localhostu) http://localhost/clanky/blbost. Zobrazí se vám, zcela správně, že článek neexistuje. Nyní zadejte http://localhost/clanky/druhy-clanek a tentokrát již článek existuje a taky je vypsán.
Oba soubory si můžete stáhnout.