Jde o velmi užitečný modul, který běží na serveru Apache a slouží k velmi efektivní práci s URL adresou. Dají se s ní provádět neuvěřitelné věci. Bohužel má jednu velkou vadu, je rozsáhlý a né tak úplně jednoduchý.
Rewrite mód běží všude tam, kde jsou splněny následující podmínky:
Jde o soubor, který je umístěn například v root složce serveru. Sem budeme zapisovat všechny konfigurace, které budeme chtít po rewrite módu.
Rewrite mód se musí zapnout v .htaccess.
| RewriteEngine on |
Uživatel si zažádá o požadovanou stránku, ale bude přesměrován na jinou. Dodržujte zápis lomítek, jde totiž o špatně hledatelnou chybu. Přesměrovaná stránka začíná lomítkem, jde se tedy z rootu a jde o absolutní adresu! Zde se změní i adresa URL v prohlížeči.
|
# přesměrování RewriteEngine on RewriteRule požadovaná-stránka\.html /přesměrovaná-stránka.html [R] |
Místo zadané stránky se uživateli objeví stránka podstrčená bez toho, aby se změnila URL adresa, ta tedy bude požadovaná-stránka.html. Podstrčená adresa nezačíná lomítkem a tak adresa stránky je závislá na adresáři, ve kterém se nachází. Rozdíl v deklaraci je ten, že se oproti přesměrování vypustí [R].
|
# přesměrování RewriteEngine on RewriteRule požadovaná-stránka\.html /podstrčená-stránka.html |
Asi na nejednodušším příkladu se pokusím vysvětlit, jakpak to asi funguje. Z aktuálního adresáře, kde se nachází .htaccess, budu chtít přesměrovat na stránku s problematikou html.
|
RewriteEngine on RewriteRule (.*) http://vytvorweb.czweb.org/html/ [R] |
Nic těžkého, ale co znamená (.*)?
Je to libovolný počet libovolných znaků. (.(libovolný počet)*(libovolných znaků)).
Asi nejvíce užitečnou věcí je převod z regulárního výrazu na proměnnou. Kde to využijete? Například všude tam, kde chcete nehezké dlouhé neforemné URL převést na hezkou adresu.
| ošklivá adresa: | http://vytvorweb.czweb.org/index.php?page=seo&page2=rewrite |
| hezká adresa: | http://vytvorweb.czweb.org/seo/rewrite.html |
A teď jak se to provede v praxi.
| RewriteRule ^(.*)/(.*)\.html$ %{DOCUMENT_ROOT}/index.php?page=$1&page2=$2 |
První ze závorek (.*) se uloží do proměnné page, koukneme-li na náš příklad, tak do proměnné page se uloží seo. Druhá ze závorek (.*) se uloží do proměnné page2. Page2 bude tedy obsahovat rewrite.
Takže to byl jeden z příkladů, jak efektivně předělat URL adresu. Níže pak uvidíte celý obsah .htaccessu, který se bude starat o celkové předělání URL adres. Nachází se v něm přesměrování stránky s www (www.xxx.cz) na adresu bez www.
Zde nejprve musí projít podmínka RewriteCond, aby se mohlo přistoupit k práci s RewriteRule. V tomto případě je testována proměnná %{HTTP_HOST}, která ukrývá hostname požadované URL adresy. Pokud začíná na www, je pravidlo aktivováno a adresa se přesměruje na adresu bez www. Příznak R=301, přesměruje stránku, QSA zařídí to, že co bylo za otazníkem v původním dotazu, bude i v přesměrovaném dotazu. Příznak L říká, že se jedná o poslední pravidlo.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.vytvorweb\.czweb\.org
RewriteRule ^(.*)$ http://vytvorweb.czweb.org/$1 [R=301,QSA, L]
Následující příklad nastavení rewrite módu funguje, ale nedoporučuji ho použít bez znalostí toho, co každý řádek dělá.
RewriteEngine On #zapnutí rewrite módu Options +FollowSymlinks #nepatří k rewrite módu
RewriteCond %{HTTP_HOST} ^www\.vytvorweb\.czweb\.org
RewriteRule ^(.*)$ http://vytvorweb.czweb.org/$1 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^vytvorweb\.czweb\.org
RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/index.php?page=$1 [nc,L,QSA]
RewriteRule ^(.*)/(.*)\.html$ %{DOCUMENT_ROOT}/index.php?page=$1&page2=$2 [nc,L,QSA]
RewriteRule index\.html / [R]
| [L] | Poslední pravidlo, nic už dál nepřepisuj |
| [QSA] | Do přepsané / přesměrované adresy přidej za otazník vše, co je za otazníkem v původním požadavku. Jestliže chcete původní požadavek oseknout, ukončete druhý parametr otazníkem. |
| [R] | bude se přesměrovávat s kódem 302 |
| [R=301] | přesměrování půjde s http kódem 301 |
| [F] | nastavuje kód 403 - zakázáno. S RewriteCond umožňuje podmíněně zakázat některá URL. |
| [T=mime-typ] | umožňuje výsledek poslat s jiným mime-typem. |
| [NC] | nezáleží na velikosti písmen, velmi vhodné zejména k RewriteCond. |
| %{REQUEST_FILENAME} |
| %{REQUEST_URI} |
| %{REQUEST_METHOD} |
| %{REMOTE_ADDR} |
| %{REMOTE_HOST} |
| %{PATH_INFO} |
| %{QUERY_STRING} |
| %{SERVER_PORT} |
| %{SERVER_NAME} |
| %{HTTPS} |
| %{HTTP_USER_AGENT} |
| %{HTTP_COOKIE} |
| %{HTTP_ACCEPT_LANGUAGE} |
| %{HTTP_HOST} |
| %{HTTP_REFERER} |
| %{ENV:REDIRECT_STATUS} |
| %{DOCUMENT_ROOT} |