Když uživatel zadá do prohlížeče určitou adresu URL a stiskne klávesu Enter, webový server, který požadavek přijme, se pokusí najít soubor na serveru v cestě zadané v adrese URL. Pokud se na cestě nic nenajde, otevře se indexový soubor, například index.html nebo index.php. pokud se nic nenajde, vrátí se chyba 404. Neměli bychom krásné a snadno pochopitelné adresy URL, kdyby věci nefungovaly tak, jak fungují nyní. Tyto adresy URL se používají na mnoha webech. Modul apache mod rewrite je určen k řešení tohoto problému V tomto návodu se podíváme, jak jej zapnout.
Pokud vše fungovalo podle popisu, pak by při otevření libovolného odkazu tohoto webu v kořenovém adresáři měl existovat soubor nebo skript se stejným názvem z adresního řádku. Ale není tomu tak. Při požadavku na tuto adresu URL se webový server pokusí takový soubor najít, ale pokud ho nenajde, místo aby vrátil chybu 404, předá řízení modulu mod_rewrite, který pro všechny takové adresy URL spustí skript index.php a předá mu řetězec dotazu za doménou. PHP pak použije tyto údaje k nalezení a vrácení stránky, kterou uživatel potřebuje.
Chcete-li povolit mod rewrite, spusťte jednoduchý příkaz:
$ sudo a2enmod rewrite
Po restartování webového serveru:
$ sudo systemctl restart apache
To, že je modul povolen na úrovni webového serveru Apache, ještě neznamená, že bude fungovat pro webové stránky. Pro tento účel je třeba jej nakonfigurovat v souboru .htaccess, určit, na který skript se mají předávat požadavky na neexistující stránky. Aby soubor .htaccess fungoval, musí být do sekce Adresář virtuálního hostitele přidána direktiva AllowOwerride: All
Jako příklad lze uvést následující příklad:
Dále například ve WordPressu je třeba do souboru .htaccess přidat řádky, jako je tento:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Všechny kódy jsou umístěny v direktivě IfModule, která umožňuje, aby se kód uvnitř ní spustil pouze tehdy, když je povolen modul mod_rewrite, jinak jsou tyto řádky jednoduše ignorovány. Direktiva RewriteEngine On povoluje modul pro aktuální adresář. RewriteBase pak určuje, že se má skriptu předat celý řetězec za doménou. Následují pravidla RwriteRule s podmínkami pro ně RewriteCond, která se provádějí striktně postupně.
Jedno z pravidel RewriteRule ^index .php$ - [L]
říká, že pokud adresa URL obsahuje index.php, měla by být adresa URL přepsána na /. V tomto regulárním výrazu je uveden celý řetězec a tečka je escapována zpětným lomítkem. Příznak [L]
znamená, že pokud URL odpovídá tomuto pravidlu, pak by následující pravidla neměla být kontrolována. Po provedení tohoto pravidla se adresa URL přepíše a webový server bude předpokládat, že obdržel požadavek /, analýza pravidel začne znovu a tentokrát bude odpovídat poslednímu pravidlu.
Podmínky RewriteCond se vztahují na všechna následující pravidla. Máme tedy RewriteCond %{REQUEST_FILENAME} !-f
a RewriteCond %{REQUEST_FILENAME} !-d
umožňují provedení posledního pravidla pouze v případě, že URL není soubor nebo složka. Poslední pravidlo přesměruje vše na skript ./index.php.
Pokud nastavení mod_rewrite nerozumíte, vyplatí se podívat se, co se děje uvnitř webového serveru při přesměrování. K tomu je třeba v konfiguraci virtuálního hostitele webu přidat tento řádek.
Například:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Pak v souboru protokolu, který je uveden v direktivě ErrorLog, uvidíte všechny pokusy webového serveru o převod URL podle vašich pravidel a budete moci pochopit, co děláte špatně. V tomto návodu jsme se zabývali tím, jak zapnout mod rewrite u Apache, a také tím, jak to celé funguje a jak hledat chyby.