Přepisování adres a přesměrování

K čemu se URL rewrite může hodit?

  • přepisování adres na hezčí a zapamatovatelnější podobu
  • optimalizace adres pro vyhledávače (SEO)
  • přesměrování stránek.
  • zabezpečení stránek (maskování přípon skriptů, blokování uživatelů podle IP adres, zákaz hotlinkování obrázků z cizích stránek atd.)

Pokud chceme využívat mod_rewrite, je třeba mít vytvořen soubor .htaccess.

Použití

Zobrazení stránky podle prohlížeče uživatele

Často se hodí udělat jednu stránku ve verzích pro různé prohlížeče, například Internet Explorer, kde stránka bude používat speciální aktivní prvky a též bude kompatibilní pro textový prohlížeč Lynx. Následující ukázka vychází z řetězce User-Agent v HTTP hlavičce. Při požadavku na stránku pokus.htm zobrazí s Internet Explorerem stránku pokusIE.htm, zatímco v případě prohlížeče Lynx či Mozila verze 1-2 zobrazí stránku pokus2.htm. V případě neznámého prohlížeče se zobrazí stránka pokus3.htm.

RewriteCond  User-Agent:  .*MSIE.*
RewriteRule  /pokus\.htm  /pokusIE.htm  [L]
RewriteCond  User-Agent:  (?:Lynx|Mozilla/[12]).*
RewriteRule  /pokus\.htm  /pokus2.htm  [L]
RewriteRule  /pokus\.htm  /pokus3.htm  [L]

Přesměrování uživatelů s jiným prohlížečem než Internet Explorer na jinou stránku pomocí NOT

RewriteCond  User-Agent: (?!.*MSIE).*
RewriteRule  (.*) /nemasIE.htm

Zákaz linkování obrázků z cizích stránek

Podle HTTP Refereru ověříme, zda se má obrázek zobrazit na naší doméně, nebo na cizí. V případě cizí domény pošle obrázek /blokovano.gif. Některé prohlížeče nebo firewally však nemusejí HTTP referer v požadavku posílat, takže tato metoda není stoprocentní, její účinnost je však velmi vysoká.

RewriteCond Host: (.+)
RewriteCond Referer: (?!\1.*).*
RewriteRule .*\.(?:gif|jpg|png) /blokovano.gif [I,O]

Zákaz přímého stahování z cizích stránek

Podobně jako předchozí příklad vrací chybovou stránku, je-li na ZIP soubor odkazováno z jiné domény, než je ukázková mojedomena.cz.

RewriteCond Host: (.+)
RewriteCond  Referer: (?!(www\.)?mojedomena\.cz).*
RewriteRule  .*\.(zip)  /chyba.htm [I,L,O]

Blokování přístupu na stránky pro určité IP adresy

Návštěvníkům z IP adresy v rozsahu 66.201.201.0-66.201.201.255 pošle místo původní stránky chybu 404 (soubor nenalezen).

RewriteCond %REMOTE_ADDR 66\.201\.201\..*
RewriteRule .* [F]

Přesměrování stránek

Hodí se při stěhování stránek na jinou doménu.

RewriteRule /index.htm http://www.ufouni.cz [R]

Syntaxe

RewriteCond TestVerb CondPattern určuje, za jakých podmínek se má pravidlo (definované na následujícím řádku v RewriteRule) aplikovat.

RewriteRule Pattern FormatString [Flags] Příkaz RewriteRule představuje pravidlo s přepisem adresy. První část (Pattern) obsahuje původní vstupní stránku a druhá část (FormatString) cílovou podobu adresy. Pro zápis obou částí lze používat regulární výrazy. Na konci příkazu se uvádějí Flagy, což jsou parametry pravidla. Flagy se zadávají do hranatých závorek a oddělují se čárkami. K dispozici jsou tyto flagy:

  • I (ignorování velkých a malých písmen)

Platí pro RewriteRule i k nadřízené RewriteCond podmínce.

  • F (Forbidden - zakázáno)

Zastaví další přepisovací procesy a skončí s chybou 404 - soubor nenalezen (Pozor, nikoliv s chybou 403.)

  • L (Poslední pravidlo)

Skončí a neprovede již další přepisovací procesy (pokud jsou).

  • N (Zopakování)

Znovu začne zpracovávat pravidla, avšak s uloženými změnami v již hotových přepisech. Pozor, počet maximálního počtu opakování je limitován na straně serveru.

  • NS (Zopakování stejného pravidla)

Znovu opakuje stejné pravidlo s uloženými provedenými změnami. I zde platí limit maximálního počtu opakování.

  • R (přesměrování)

Server vrací klientovi požadavek s přesměrováním na novou lokaci. Přesměrování se chová také jako poslední pravidlo [L].

  • RP (permanentní přesměrování)

Obdoba [R], avšak výsledek je vrácen s HTTP kódem 301 (moved permanently).

  • O (normalizace)

Normalizuje řetězec před zpracováním (odstraní kódování URL, neplatné znaky atd.) Pozor, normalizace smaže query-string (parametry zasílané skriptu), proto nepoužívejte normalizaci v případě, kde je query-string potřeba.

  • CL (Case Lower)

Změní všechny znaky na malá písmena.

  • CU (Case Upper)

Změní všechny znaky na velká písmena.

Syntaxe regulárních výrazů

Regulární výraz (zkracováno na regexp, regex či jen RE podle anglického regular expression) je řetězec popisující celou množinu řetězců, konkrétně regulární jazyk. Regulární výrazy se používají pro vyhledávání v textu. V případě, že uživatel chce v textu vyhledat nebo definovat nějaký řetězec, který nezná přesně, může zadat regulární výraz, kterému má text vyhovovat. Program pak nalezne všechny části textu, které danému výrazu odpovídají. V našem případě používáme regulární výrazy jazyka Perl.