Co je to .htaccess?
.htaccess je soubor, který je beze jména a pouze s příponou .htaccess. Tento soubor se používá k nastavení webového serveru. Může být na stránkách užitečný a nejčastěji se používá k vytvoření stránek, které zobrazují chybu 404. Pro ty, kteří nevědí co je chyba 404, tak si zkuste zadat nesprávnou (jakoukoli) internetovou adresu - chyba 404 je tedy - Stránka nenalezena!
Příklady použití
- ochrana složek heslem
- vlastní chybová hlášení (nejčastěji 404)
- povolení nebo blokování IP adres
- použití jiného souboru místo index.html
- blokování zobrazení seznamu souborů ve složce
- vytvoření neexistující URL stránek
Nejčastější (které využíváme i my - hlavně z důvodu optimalizace - SEO) jsou chybová hlášení, a vytvoření neexistujících URL stránek a pak také ochrana složek heslem.
Vytvoření souboru
Vytvoření .htaccess souboru není nic mimořádného. Je to obyčejný textový souboru, který lze vytvořit a editovat textovým editorem, jako např. poznámkový blok. Potíž může vzniknout při uložení souboru, protože je to ve skutečnosti soubor bez jména a s příponou dlouho 8 znaků. Obvykle ale lze soubor uložit přímo jako „.htaccess” včetně uvozovek. Když to nepůjde, budete muset soubor uložit pod jiným názvem (např. htaccess.txt), odeslat na server a až potom jej na serveru přejmenovat.
Skryté soubory
Soubory, které nemají jméno a mají jenom tečku a příponu, jsou skryté a není je vidět v normálním seznamu souborů ve složce. FTP klient jako např. Total Commander umí tyto soubory zobrazit, zaškrtnutím položky v menu
Síť → FTP - ukázat skryté soubory (show hidden files).
Htaccess - chybová hlášení
Soubor .htaccess umožní zobrazení vlastního chybového hlášení, např. když jse soubor nenalezen. Takže nemusíte zobrazovat hlášení, která poskytuje server. Tohle dělá na stránkách dobrý a profesionální dojem, i když dojde k chybě. Lze například i automaticky odeslat webmasterovi email s upozorněním o chybě.
Pokud znáte číslo chyby, můžete si vytvořit vlastní hlášení. Do souboru .htaccess přidejte příkaz této syntaxe.
ErrorDocument čísloChyby /soubor.html
Například kdybychom měli dokument stranka_nenalezena.html v kořenové složce stránek a chtěli tento dokument použít při chybě 404, zadali bychom:
ErrorDocument 404 /stranka_nenalezena.html
Kdyby dokument nebyl v kořenové složce, ale byl v podsložce chybove_hlasky, potřebovali bychom zadat cestu:
ErrorDocument 404 /chybove_hlasky/stranka_nenalezena.html
Obvyklé chyby jsou:
- 401 - Authorization Required (Požadována autorizace)
- 400 - Bad request (Chybné zadání požadavku)
- 403 - Forbidden (Nepovoleno)
- 404 - Wrong page (Neplatná stránka = Stránka nenalezena)
- 500 - Internal Server Error (Interní chyba serveru)
Potom je zapotřebí jenom vytvořit dokument, který zobrazí chybové hlášení a přidat patřičný příkaz do souboru .htaccess.
.htaccess - Co je to mod_rewrite?
V konfiguraci serveru musí být povoleno použtií modulu mod_rewrite. Module mod_rewrite je velmi obsažný a má spoustu možností. Zde uvedeme jen pár nejzákladnějších a také nejpoužívanějších (právě v SEO).
Mod_rewrite je module serveru Apache, kterým lze manipulovat s URL požadavky. URL lze různě testovat a měnit, čili „přeložit”. Překlad může být podmíněný nebo pozměněný (upřesněný) vypínači. Výsledkem může být např. přesměrování nebo blokování přístupu.
Přesměrování se používá k různým účelům:
- přesměrování po přesunu stránek nebo změně domény
- vytvoření snadno zapamatovatelných URL
- zjednodušení URL, které mají komplikované querystringy, jak tomu může být např. v e-shopech, redakčních systémech apod. Většina vyhledávačů (ne-li všechny) nedokážou komplikované querystringy zpracovat, a tak je lepší jim poskytnout zjednodušené URL bez nich
- zdánlivá změna přípony souborů, aby návštěvníci nevěděli, v jakém jazyku jsou stránky vytvořeny
- skrytí skutečného URL
K využití těchto možností je nutno ovládat regulární výrazy v syntaxi Perlu.
Aktivování
Nejprve je nutno RewriteEngine zapnout direktivou:
RewriteEngine on.
Podmínky
Potom mohou následovat podmínky RewriteCond, za kterých se provede překlad URL požadavku. Podmínek může být několik nebo nemusí být žádná.
RewriteCond řetězec regulární_výraz vypínače
Direktiva RewriteCond se skládá ze 4 částí:
- identifikátor direktivy RewriteCond
- řetězec - smí (mezi jinými) obsahovat název některých systémových proměnných
- zápis systémových proměnných vypadá takto: %{název proměnné}
- některé systémové proměnné:
- HTTP_USER_AGENT
- HTTP_REFERER
- HTTP_COOKIE
- HTTP_HOST
- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_USER
- REQUEST_METHOD
- SCRIPT_FILENAME
- QUERY_STRING
- DOCUMENT_ROOT
- regulární výraz
- vypínače - tyto jsou nepovinné a jsou uzavřeny v hranatých závorkách
Když řetězec vyhovuje regulárnímu výrazu, je podmínka splněna.
RewriteCond % {HTTP_REFERER} !^$
Není-li referer prázdný, podmínka je splněna.
RewriteCond % {HTTP_REFERER} !^$
RewriteCond % {HTTP_REFERER} !^http://(www.)?kao.cz/.*$ NC
RewriteCond % {HTTP_REFERER} !^http://(www.)?kdno.cz/.*$ NC
Není-li referer prázdný a zároveň (AND) není kao.cz a zároveň není kdno.cz, můžeme pokračovat s překladem URL. Vypínač NC v hranatých závorkách znamená, že porovnání není case sensitive (nezáleží na velikosti písmen).
Překlad
RewriteRule je direktiva samotného překladu. Skládá se ze 4 částí:
- identifikátor direktivy RewriteRule
- regulární výraz
- substituce - řětězec, který nahradí URL. Může obsahovat nejenom text cílové URL, ale i další elementy, jako např. zpětné odkazy na regulární výraz.
- vypínače - tyto jsou nepovinné a jsou uzavřeny v hranatých závorkách
Regulární výraz se porovnává s aktuálním URL. Aktuální URL je URL požadavku, které ale mohlo být již pozměněno předešlými direktivami. Když URL regulárnímu výrazu vyhovuje, bude na něj aplikován řetězec substituce.
Zde je ukázka jak bude přesměrována stará stránka na novou:
RewriteEngine on RewriteRule ^stara_stranka.html$ nova_stranka.html
V direktivě RewriteRule musí mít staré URL podobu regulárního výrazu, proto vypadá trochu jinak než obvykle. Když URL požadavku vyhovuje regulárnímu výrazu, bude provedena substituce novým URL a dojde k přesměrování. V adrese prohlížeče zůstane původní „staré” URL. Toto URL nemusí vůbec existovat, takže lze tímto skutečné URL skrýt.
Kdybychom chtěli v adreser prohlížeče ukázat cílové URL „nova_stranka.html”, mohli bychom zadat v cílové URL adresu absolutně.
RewriteRule ^stara_stranka.html$ http://kao.cz/sluzby/nova_stranka.html
Protože podmínky a pravidla překladu lze různě kombinovat a dokonce lze vytvořit cyklus, je dobře při konečném překladu naznačit vypínačem L, že další překlad není požadován:
RewriteRule ^stara_stranka.html$ nova_stranka.html L
Htaccess - Odstranění querystringu
PHP skripty často používají URL s argumenty (querystring). Tyto nejsou některými vyhledávači snadno zpracovány nebo nemají tak dobré umístění ve výsledcích vyhledávačů (page rank), jako jednoduché URL HTML stránky bez argumentů. Hodilo by se tedy mít jednodušší URL, které by vyhledávačům (a také návštěvníkům) lépe vyhovovalo. Z hlediska page ranku a optimalizace pro vyhledávače (SEO) se sice přesměrování URL nedoporučuje, ale tento typ přesměrování je v pořádku.
Příklad 1
RewriteEngine on RewriteRule ^expo/(0-90-9)/$ expoinfo.php?expoID=$1
Tento regulární výraz bude shodný se všemi URL, které začínají na „expo/”, za kterým budou následovat 2 číslice ukončené lomítkem. Např. „expo/45/” bude přesměrováno na „expoinfo.php?expoID=45” a „expo/96/” bude přesměrováno na „expoinfo.php?expoID=96”.
Čísla v hranatých závorkách představují seznamy povolených znaků, t.j. číslic od 0 do 9. Jiné možnosti by byly velká písmena A-Z nebo malá písmena a-z nebo kombinace velkých a malých písmen A-Za-z.
Část regulárního výrazu je uzavřena v kulatých závorkách. Toto je část URL, kterou chceme uložit, abychom ji později mohli nahradit něčím jiným. V tomto případě chceme uloženou hodnotu odeslat do PHP stránky jako argument v querystringu. Uložené hodnoty ze závorek budou mít index podle pozice výskytu v regulárním výrazu, počitaje od 1. Je to zpětný odkaz v podobě dolarového znaku a indexu. Zde máme pouze 1 hodnotu ze závorek, takže na tuto se můžeme odkazovat $1. Kdybychom měli takových hodnot více, odkazovali bychom se na první $1, na druhou $2, na třetí $3 atd.
Po přesměrování bude v prohlížeči stránka jako např. „expoinfo.php?expoID=45”, ale uživatel tuto adresu neuvidí. Bude nadále vidět URL, které zadal.
Příklad 2
Zde máme PHP skript s hlavní stránkou „index.php”. Na ostatní stránky se jde přes proměnnou „exe”, které obsahuje číslo stránky. S následujícím přesměrováním se dostaneme např. s pomyslným URL „index/21/” na skutečné URL „index.php?exe=21”.
RewriteEngine on RewriteRule ^index/(0-90-9)/$ index.php?exe=$1
Příklad 3
Přidáním vypínače QSA se zajistí, že případné argumenty querystringu budou při přesměrování také připojeny k URL. V tomto příkladu přesměrujeme cokoli obsahující řetězec „index” na URL na jiném serveru „http://rosalynda.php5.cz/index.php”. Případný querystring bude připojen k URL. (Vypínač L znamená poslední direktivu RewriteRule.)
RewriteEngine on RewriteRule index http://rosalynda.php5.cz/index.php L,QSA
Příklad 4
Zde vytvoříme z PHP zdánlivé HTML stránky. Např. z „http://www.mujserver/6.html” přesměrujeme na index ve hlavní složce „http://www.mujserver/index.php?exe=6”
RewriteEngine on RewriteRule ^(0-9+).html /index.php?exe=$1 QSA,L
(0-9+) bude shodný s libovolným počtem číslic kromě nulového. Znaménko „+” znamená, že se musí vyskytnout aspoň 1 číslice.
Příklad 5
Podobné předešlému příkladu, ale názvy pomyslných HTML stránek, mohou obsahovat i písmena nebo pomlčku nebo být docela prázdné. (Hvězdička je shodná i s nulovým počtem výskytů.) Přesměrování bude působit pouze ve stejné složce. Z "http://www.mujserver/podslozka/str.html" přesměrujeme na index.php ve stejné složce "http://www.mujserver/podslozka/index.php?exe=str".
RewriteEngine on RewriteRule ^(0-9a-zA-Z-*).html$ index.php?exe=$1 QSA,L
Příklad 6
Tento příklad obsahuje wildcard, což zastupuje libovolný znak. Přesměruje např. z „index_21.html” na „podslozka/index.php?id=21”
RewriteEngine on RewriteRule ^index_(.*).html /slozka/index.php?id=$1 QSA,L
Příklad 7
Zde máme v querystringu 2 argumenty. Přesměrujeme např. z "index-21-boty.html" na "index.php?id=21∏=boty".
RewriteEngine on RewriteRule ^index-(.*)-(.*).html index.php?id=$1∏=$2 QSA,L