mod_rewrite - základy

Téma nie priamo z kategórie php-mysql, no keďže súvis s peknými url je nepopierateľný, bola zaradená práve sem. Častým problémom nielen začínajúcich tvorcov webov je práve použitie a nastavenie mod_rewrite. Na co vlastne slúži a ako s nim pracovať?

Mod_rewrite sa v súčasnosti výrazne dostáva do popredia. Skoro každý ho chce používať, aj keď mu často nie je jasné načo. Najčastejšie možnosti využitia sú presmerovania a podstrkávania obsahu.

Presmerovanie

Zadaním url adresy do prehliadača budete následne presmerovní na inú adresu. Tá sa zobrazí aj v poli adresa. Napríklad po zadaní pmacko.sk budete presmerovaní na adresu www.pmacko.sk. Týmto spôsobom je možné zabezpečiť aby rovnaký obsah nebol zobrazovaný na stránkach s rôznymi url adresami, prípadne presmerovávať na iné adresy po zmene štruktúry uloženia údajov na serveri.

Podstrčenie

Po zadaní adresy do prehliadača server podstrčí iný obsah (definovaný v pravidlách), ale url adresa stránky v prehliadači sa nemení. Táto funkčnosť sa využíva pri tvorbe pekných url Ďalšou šikovnou možnosťou využitia je napríklad dynamické generovanie obrázkov (s príponou .jpg), namiesto ktorých sa podstrčením zavolá php skript, ktorý obrázok vygeneruje.

Základné požiadavky

Pre využívanie mod_rewrite je potrebné splniť

  • na serveri musí bežať apache
  • musí byť nainštalovaný a povolený mod_rewrite
  • server musí umožňovať konfiguráciu. Najčastejšie prostredníctvom httpd.conf alebo .htaccess

(Povolenie .htaccess sa nastaví najčastejšie v httpd.conf použitím AllowOverride all)

Pre bežné účely je najjednoduchším riešením konfigurácia prostredníctvom .htaccess, pretože po zmene nie je nutný reštart servera ako je tomu pri zmenách v httpd.conf, a samozrejme v prípade chybného zadania dochádza k Error 500 - internal server error iba pri volaní konkrétneho adresára (resp. domény)

Najjednoduchší .htaccess

RewriteEngine on
RewriteRule (.*) index.php?url=$1 [L]

takýto zápis zabezpečí po zavolaní akéhokoľvek súboru (prípadne adresára) podstrčenie suboru index.php, ktorému sa predá parameter url obsahujúci aktuálne zadanú požiadavku. Zápis má teda tvar RewriteRule [pozadovany subor] [vysledny subor] [dalsie znacky] Značka L hovorí o tom, že ak bude táto podmienka splnená, žiadne ďalšie nasledujúce v .htaccess sa už vykonávať nebudú.

Ďalšie príklady

Ak by sme chceli presmerovanie, zápis bude vyzerať nasledovne

RewriteRule (.*) index.php [R=301,L]

čiže všetky súbory sa presmerujú na index.php s kódom 301 (Moved permanently)

Často sa stáva, že potrebujeme podstrčiť obsah iba pre jeden typ súborov (napriklad .html)

RewriteRule (.*.html) index.php?file=$1

Prípadne rozložiť adresu článku v blogu

RewriteRule ^clanky/([a-zA-Z0-9]+/)/([a-zA-Z0-9]+/)
clanky.php?kategoria=$1&clanok=$2

Pre zložitejšie štruktúry je možné využiť podmienky RewriteCond

RewriteCond %{SCRIPT_FILENAME} !(^img/.*)
RewriteCond %{SCRIPT_FILENAME} !(^servis/.*)
RewriteRule (.*) index.php?m_url=$1&%{QUERY_STRING}

Zápis spôsobí podstrčenie index.php pre všetky adresy, okrem adresárov /img a /servis a s´borov v nich uložených. Podobne je možné vyňať aj konkrétne súbory

RewriteCond %{SCRIPT_FILENAME} !(.*.css)
RewriteCond %{SCRIPT_FILENAME} !(.*.png)
RewriteRule (.*) index.php?m_url=$1&%{QUERY_STRING}

Možností využitia a nastavenia je veľké množstvo. Cieľom článku nebolo podrobne vymenovať čo najviac využití, ale len načrtnúť spôsoby, ako je možné s mod_rewrite pracovať. Pre lepšie pochopenie je nutné naštudovať si prácu s regulárnymi výrazmi.