Osobní stránky

Tipy a triky při konfiguraci mod_rewrite na serveru Apache

Nedávno jsem potřeboval nastavit přesměrování pro webový server Apache pomocí mod_rewrite. Narazil jsem ale na několik záludností, které bylo potřeba vyřešit a o které bych se chtěl podělit zda na blogu.

mod_rewrite

Pokud narazíte na problém s konfigurací mod_rewrite zkuste zkontrolovat:

Soubory .htaccess v ostatních adresářích

Pokud používáte pro konfiguraci soubor .htaccess, zkontrolujte si, co je nastaveno v těchto souborech v nadřazených složkách a podadresářích. Může se stát, že některé konfigurace se budou navzájem ovlivňovat a způsobovat problémy, které se složitě hledají.

Pro mod_rewrite existuje speciální konfigurační pravidlo RewriteOptions, pomocí kterého lze nastavovat, jak se mají aplikovat pravidla z ostatních .htaccess souborů.

Je potřeba si ale dát pozor na to, že některé volby jsou dostupné až od verze Apache 2.4.

Nastavení DirectorySlash off a .htaccess v podadresáři

Nastavení DirectorySlash off určuje, že se k adresářům automaticky nepřidává na konec lomítko v url adrese (např. /adresar se nezmění na /adresar/).

Pokud máte toto nastavení povolené a chcete používat soubory .htaccess v adresářích, je potřeba nastavit:

RewriteOptions AllowNoSlash

 

RewriteRule [L] nezabrání dalšímu přesměrování

Příznak [L] (last) neukončí provádění  dalších přesměrování, jak by se podle názvu mohlo na první pohled zdát. Příznak[L] ukonči pouze aktuální cyklus prohledávání a začne znovu od začátku souboru.

Pokud potřebujete zabránit jakýmkoli dalším přesměrováním pomocí mod_rewrite, musíte použít příznak [END]. Například:

RewriteRule ^test(/.*)?$ example$1 [END]

Příznak [END] je dostupný pouze v novějších verzích serveru Apache, pokud používáte starší verzi existuje řešení.

Nastavení logování mod_rewrite

V případě, že budete mít problém zjistit kde přesně je chyba. Nejrychlejším řešením bude nastavit logování pro mod_rewrite. Slouží k tomu volba LogLevel a nastavuje se s parametrem trace1trace8 podle množství logovaných informací. Možné nastavení je například následující:

LogLevel alert rewrite:trace6

Informace o přesměrování se pak zapisují do souborů definovaných pomocí nastavení ErrorLog stejně jako ostatní logované informace.

Povolení předávání parametrů z url

Ve výchozím nastavení mod_rewrite nepředává dále parametry z url (query string).

Pro předávání během přesměrování je potřeba nastavit k pravidlu RewriteRule příznak [QSA] (query string append). Url parametry pak budou přidány na konec a budou dostupné i po přesměrování.

Závěr

Nabízím vám pár svých tipů a triků při práci s nastavením přesměrování pomocí mod_rewrite. Doufám, že vám zmíněné rady pomohou a co nejvíce usnadní konfiguraci.

Jakub Škvára


Jakub je cestovatel, blogger a webový vývojář. Zajímá se především o technické novinky a rád navštěvuje konference. Používá: Symfony2 Framework, AngularJS, NodeJS, MongoDB a další moderní technologie. Aktuálně žije v Londýně.