Použití souboru .htaccess

Pátek, 5. Září 2008 · 40 comments

V dnešním článku si řekneme něco o .htaccess. Nejprve si řekneme jak takový soubor .htaccess vytvořit. Poté si ukážeme příklady nastavení a řekneme si jejich využití. Všechno pěkně stručně a jasně.

Pár slov úvodem…

Co je to .htaccess?

Soubor .htaccess je konfigurační soubor serveru. Nejčastěji se využívá pro vytvoření vlastní chybové stránky nebo pro zablokování výpisu složky. Jde s ním, ale nastavovat mnohem více věcí.

K čemu .htaccess slouží?

Soubor .htaccess slouží k mnoho nastavení našeho webu. Jedinou podmínkou je jeho podpora na straně serveru. Pomocí tohoto souboru můžeme například vytvářet vlastní chybové stránky, přesměrování, ochranu webu heslem, blokování přístupu na naše WWW podle IP adres nebo k nastavení výchozího souboru (index.html).

Jak vytvořit soubor .htaccess?

Nevíte jak vytvořit takový soubor .htaccess? Je to jednoduché. Soubor .htaccess je normální textový dokument. Vytvořte jej (například pomocí Poznámkové bloku) a uložte ho pod názvem „.htaccess“ (včetně tečky).

Postup uložení přes Poznámkový blok:
1) Otevřete si Poznámkový blok.
2) Klikněte na: Soubor – Uložit jako…
3) Do pole „Název souboru“ napište: „.htaccess“ (bez uvozovek).
4) Do pole „Uložit jako typ“ vyberte „Všechny soubory“.

Typy pro Váš .htaccess soubor:

  • Jestli chcete soubor vidět ve svém FTP klientu, musíte si zapnout možnost zobrazení skrytých souborů (Pokud používáte Total Commander: Síť – FTP – zobrazit skryté soubory).
  • .htaccess nemá žádnou příponu. Soubor s názvem .htaccess.txt je špatně. Pokud Vám soubor .htaccess nejde vytvořit uložte jej jako htaccess.txt a ve vašem FTP klientu jej přejmenujte na .htaccess.
  • Pro komentáře se používá znak # na začátku řádku.
  • Soubor .htaccess se vkládá do kořenového adresáře (bude platit pro celý web).
  • Chcete, aby Váš soubor .htaccess platil pouze pro určitý adresář? Vložte jej do něj.

Nejčastější příklady použití .htaccess

# Blokování přístupu podle IP adres

deny from 123.123.123.123
- Číslo je IP adresa, kterou chcete zablokovat přístup na Vaše stránky.
deny from 111.123
- Zablokujete přístup ze všech adres, které začínají 111.123
deny from all
- Zablokujete přístup celého adresáře.
allow from 123.123.123.123
- Povolíte této IP adrese vstup na Vaše stránky.

# Chybové stránky

ErrorDocument 403 "http://example.cz/chyba-403.html"
ErrorDocument 404 "http://example.cz/chyba-404.html"

- Zobrazí vlastní chybové stránky.
- Co znamenají čísla chybových hlášek najdete zde.

# Index stranka

DirectoryIndex index.php index.html
- Určujete na jaký soubor bude uživatel přesměrován pokud navštíví Vaší stránku (přednastaveno je index.php nebo index.html).

# Ochrana proti SPAM botům

RewriteCond %{HTTP_USER_AGENT} Wget [OR]
RewriteCond %{HTTP_USER_AGENT} CherryPickerSE [OR]
RewriteCond %{HTTP_USER_AGENT} CherryPickerElite [OR]
RewriteCond %{HTTP_USER_AGENT} EmailCollector [OR]
RewriteCond %{HTTP_USER_AGENT} EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ExtractorPro
RewriteRule ^.*$ http://www.spampoison.com/ [L]

- Tento kód odhalí většinu SPAM botů, které přesměruje pryč.
- Tento kód přesměruje SPAM bota na adresu spampoison.com.

# Přepis z /něco.php na /něco

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule .* - [L]
RewriteRule ^([\w-]+)$ /$1.php [L,QSA]

- Tento kód pomocí .htaccess upravuje všechny adresy.
- Všechny adresy budou nyní zobrazovány na webu bez přípony .php
(na části Vašeho webu odkazujte bez .php).

# Přepíše něco-někde.php na /něco/někde

RewriteRule ^něco/někde$ /něco-někde.php

# Přepis z /index.php?stranka=novinky na /novinky.html

RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_URI} ^(.*).html
RewriteRule ^(.*).html index.php?stranka=$1 [nc,L,QSA]

# Přesměrování webu bez WWW na verzi s WWW

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.cz [nc]
RewriteRule (.*) http://www.example.cz/$1 [R=301,L]

# Přesměrování webu s WWW na verzi bez WWW

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.vase-domena\.cz [nc]
RewriteRule (.*) http://vase-domena.cz/$1 [R=301,L]

# Přesměrování z 1.php na 2.php

RewriteEngine On
RewriteRule 1\.php /2.php [R=301]

# Povolení výpisu adresáře

Options +Indexes
- Uživatel uvidí soubory vložené na Vašem webu.
- Zápisem Options -Indexes se výpis složky zakáže.

# Zakázání hotlinkování obrázků a videí

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?neco\.cz [NC]
RewriteRule \.(jpg|png|gif|mp3|mpg|avi|mov)$ - [F]

- Zakáže hotlinkování obrázků a videí z jiných stránek (i vyhledávačů).
- Výrazně sníží vytížení serveru a zamezí zobrazování fotek na jiném než Vašem webu.

# Zakázání výpisu adresáře

Options -Indexes
- Uživatel se při snaze dostat se do některého adresáře bude přesměrován na chybovou stránku 403.

# Zaheslování stránky pomocí .htaccess

AuthUserFile /data/www/www_example_cz/.htpasswd
AuthName "Restricted Area"
AuthType Basic
require valid-user

- Tento kód zašifruje celý web www.example.cz.
- Více najdete v článku Zaheslování stránek pomocí .htpasswd zde na blogu.
- Zašifrování svého hesla a jména můžete provést na této stránce.

# Zapnutí Rewrite Modu

RewriteEngine On
- RewriteEngine On se zadává do .htaccess jen jednou!

{ 40 comments… read them below or add one }

1 Patrik Humpolec Únor 9, 2009 v 17:02

Užitečné, tvoje články se mi líběj, jen tak dál ;)

Odpovědět

2 Tomáš Erlich Únor 9, 2009 v 19:18

Nemám to teď zrovna jednoduchý a právě tohle mi dodává sílu.
Díky za tvůj čas. Drž se kámo!

Odpovědět

3 LubosP Květen 7, 2009 v 12:42

Zajímavý stránky máš, zrovínka informace o zaheslování se mi hodí, neměl bys ještě nějakej návod na odchod ze zaheslovaný sekce webovek tak, aby si prohlížeč heslo nepamatoval a bylo vynucený další přihlášení? = Ve Firefoxu musím vždycky ručně vymazat Relace s Autentizací, aby to příště požadovalo heslo, takhle by se mi mohlo stát, že si osobní sekci otevřu někde na veřejným, nebo cizím místě a zapomenu to vymazat a tím jsem zpřístupnil tuhle sekci pro kohokoliv … každá rada bude dobrá :-)

Odpovědět

4 Tomáš Erlich Květen 7, 2009 v 13:31

Podle mého názoru je nejbezpečnější způsob zaheslování stránky pomocí .htaccess, jak popisuji v tomto článku. Zašifrované jméno a heslo si můžeš vygenerovat na této adrese, nebo si tento skript můžeš vytvořit sám pomocí článku zašifrování hesla pro .htpasswd. Pokud ti tento způsob nevyhovuje, doporučuji si přečíst článek od Dušana Janovského zaheslování stránek, který ti určitě pomůže. Hodně štěstí!!

Odpovědět

5 LubosP Květen 7, 2009 v 14:24

Rozumím, nepřu se o bezpečnost :-) … jen jsem byl zvědavej na možnost nějakýho logoutu. Jak jsem tak procházel různý fóra, zdá se, že jednoduchej logout pro htaccess neexistuje, tak mě zajímá nějaký dobrý vtip, jak na to, jinak je tu podle mýho velký nebezpečí lidskýho faktoru a že blbost je mocná …

Odpovědět

6 Tomáš Erlich Květen 9, 2009 v 10:05

Standardně se uživatel odhlásí zavřením okna prohlížeče. Pak už jen záleží na tom, jak dlouho si heslo má prohlížeč pamatovat. To si musíš nastavit sám. Pokud ovšem trváš na svém .htaccess log-outu, našel jsem pro tebe nějaké návody.

Jeden zajímavý návod se objevuje na interval.cz. Odhlášení z HTTP autentizace, ale to jsi si asi již přečetl. Jestli ti tenhle způsob nevyhovuje, navrhuji hledat někde v zahraničí. Já osobně našel jeden funkční .htaccess LogOut. Najdeš ho na adrese http://www.webmasterworld.com/forum13/3147.htm.

Odpovědět

7 Charlie Květen 12, 2009 v 15:37

Jde také pomoci .htaccess sledovat IP adresy lidí, kteří přistupují na dané stránky (příp. do daných složek) ?

Odpovědět

8 Tomáš Erlich Květen 13, 2009 v 15:47

Zablokovat IP adresu určitě, ale sledovat? To asi ne. Nevím o tom a připadá mi to zbytečné. K tomu ti přece stačí jakékoliv počítadlo.

Odpovědět

9 :) Říjen 31, 2009 v 9:56

No jo, ale co když postnu link třeba na nějakej soubor na serveru a chci logovat ty, který k souboru přistoupí.

Odpovědět

10 Tomáš Erlich Říjen 31, 2009 v 12:31

Do .htaccess bych zapsal:
RewriteCond ! ^raw/.*$
RewriteRule ^.*$ log/log.php?page=$0 [L,P]

a do log.php:
echo file_get_contents('http://' . $_SERVER['HTTP_HOST'] . '/raw' . $_GET['page']);

Odpovědět

11 Jakub Hejda Červenec 15, 2009 v 21:23

Šikovnej článek. Může dobře posloužit jako takový tahák pro nás líné si něco pamatovat ve vlastní hlavě.

Ochrana proti SPAM botům mi přijde možná trochu neúčinná páč by těch řádků mohlo být za chvíli tisíc a pořád by jich nebylo dost, ale je to dobrý modelový příklad.

Odpovědět

12 Tomáš Erlich Červenec 16, 2009 v 10:34

Díky. Jsem rád, že článek dobře slouží. Ono všechno si pamatovat je otrava. Lepší je, když je to někde napsané a můžeš si to kdykoliv přečíst :-)

PS: Ohledně toho spamu je to těžký. Jak jsi řekl – je to spíš příklad. Spam je prostě sv*ně xD

Odpovědět

13 Masterbill Srpen 2, 2009 v 9:56

Jaká je funkčnost té antispamové ochrany?

Odpovědět

14 Tomáš Erlich Srpen 3, 2009 v 11:53

No. Měla by odhalit většinu SPAM botů a přesměrovat je pryč z webu. Takže pak můžeš klidně na stránky psát svůj mail a žádných spamů se bát nemusíš (mě chodí maximálně 2-3 za týden).

Odpovědět

15 Jackm Září 19, 2009 v 12:13

Dobrej článek… ;-)

Odpovědět

16 Tomáš Erlich Září 24, 2009 v 12:08

Díky! Snažil jsem se ohledně použití souboru .htaccess napsat maximum. Sám jsem před lety něco podobného hledal a nic. Nikde nebyl takovýto článek, který by všechno jasně a stručně popisoval a tak jsem ho napsal :)

Odpovědět

17 Nouma Říjen 20, 2009 v 0:18

Filtrovat Wget jako ochranu před spam botem je IMHO kravina. Spousta lidi Wget (program) používá pro normální stahování (ať jeho grafické nástavby nebo Wget samotny). Navíc bych tipoval, že každý normálně uvažující tvůrce spambota si USER AGENT string změní na Gecko, nebo MSIE. Takže o zázračné funkčnosti zmíněného řešení mám vážně pochybnosti.

Ale jinak hezky článek – hodil se mi, jen by si to snad zasloužilo zmínit nejen „co“ to dělá, ale občas naznačit i „jak“ (například zmínka o regulárních výrazech).

Odpovědět

18 Tomáš Erlich Říjen 21, 2009 v 19:01

Nemám co bych k tomu dodal. Snad jen díky za pochvalu a rady. Vědět, co určitá věc dělá je užitečné, ale nevědět proč. To je dost trapné – takže ještě jednou díky za komentář. U dalších článků to vezmu na zřetel :)

Odpovědět

19 Rusttaf Listopad 17, 2009 v 19:10

Ahoj, moc pěkně sepsaný příklady jak použít .htaccess. Měl bych jeden problémek, kterej bych rád konzultoval. Pro můj portál mám udělaný nastavení, který mám normálně přístupný na adrese: http://www.moje-domena.cz/sprava-portalu. Chtěl bych do něj ale přistupovat z jiný adresy, řekněme: nastaveni.moje-domena.cz a tu původní adresu prohlížeči jenom podstrčit. Zkoušel jsem:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^nastaveni\.moje-domena\.cz
RewriteRule (.*) http://www.moje-domena.cz/sprava-portalu/$1 [nc, L, QSA]

Nefunguje to podle mých představ. Adresa se plně přesměruje. Jak to prosím nastavit, aby to fungovalo jenom jako podstrčení?

Odpovědět

20 Tomáš Erlich Listopad 22, 2009 v 14:23

Ahoj.
To, co tu píšeš je obyčejné přesměrování pomocí souboru .htaccess. Tedy přesun – ne podstrčení. Ty ovšem chceš stránku jen podstrčit. Provedeš to jednoduchým zápisem:
RewriteEngine on
RewriteRule 1\.html /2.html

Kdy 1.html je stránka falešná a 2.html je stránka podstrčená (která se zobrazuje).

Odpovědět

21 Rusttaf Březen 25, 2010 v 12:23

Díky za odpověď, ale tohle pro mě asi nebude úplně ideální.
Asi jsem to nenavrhnul úplně správně, ale mám přibližně takovouhle strukturu:
[moje-domena.cz] – kde jsou stránky a sdílený věci jako CSS a další a mimo to tam kvůli sdílení dat je taky adresář /nastaveni, kde je vlastně samostatná součást webu, kde řeším administraci
[nastaveni.moje-domena.cz] – je subdomena, kde kde jsem doufal, že bych administraci řešil (kvůli https), ale protože nechci udržovat sdílěný data na 2 místech, tak je celá ta část zatím právě v adresáři /nastaveni

Idealni stav je teda dakovej, ze nekdo zada napr.:
nastaveni.moje-domena.cz/uzivatele.html
a ono ho mu to podstrci
http://www.moje-domena.cz/nastaveni/uzivatele.html (i vcetne GET dat za ?)

Pokud to takhle nejak pujde udelat pomoci .htaccess, tak parada, pokud ne, tak to musim celkem dost predelat…
V kazdym pripade diky za pomoc

Odpovědět

22 Tomáš Erlich Březen 25, 2010 v 19:37

Promiň, ale jsem teď trošku vedle. Píšu seminární práci a mám plnou hlavu jiných věcí. Zkus napsat na nějaké fórum (a oni ti doufejme poradí). S tímhle si nevím rady – možná to bude jednoduché, ale v tenhle moment opravdu netuším.

Odpovědět

23 Rusttaf Březen 25, 2010 v 20:57

I tak děkuju.
Zkusím to ještě jinak.

Odpovědět

24 spoon Prosinec 29, 2009 v 0:38

Ať čtu jak čtu pořád tomu nerozumím. Achjo. To bude zase pokus / experiment. Lol.

Odpovědět

25 Moretti Leden 19, 2010 v 17:59

Dobrý den.
Nebo Ahoj, to podle toho co je vám milejší. Prosím o radu. Potřebuji udělat přesměrování pomocí htaccess. A sice například aby se http://****.eu přesměrovalo na http://****/phpBB3.

Přesměrování z non www na s www už je řešený aliasem u poskytovatele domény (forpsi). Moc děkuji.

Odpovědět

26 Tomáš Erlich Únor 10, 2010 v 13:13

Ahoj je milejší. Tohle přesměrování je popsáno v článku. Stačí číst a trochu si ho poupravit. Ještě o tom chci napsat článek. Takže teď k problému – jestli chceš trvalé přesměrování tak použij tohle:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^****\.eu
RewriteRule ^(.*)$ http://****/phpBB3/$1 [R=301,QSA]

Odpovědět

27 Moretti Únor 10, 2010 v 23:27

Děkuji. Skusím. Ono je možný, že to poskytovatel hostingu zakázal :).

Odpovědět

28 Moretti Únor 11, 2010 v 5:12

Ahoj. Tak první verze, tzn vw-life.eu místo hvězdiček nefungoval. Druhá verze, která byla i s www taky neuspěla. V tu chvíli zas IE8 hlásil, že nemůže zobrazit tuhle stránku. Tohle:
RewriteEngine On
RewriteCond ^www\.vw-life\.eu
RewriteRule ^(.*)$ http://www.vw-life.eu/phpBB3/$ [R=301,QSA]

zas hodí chybu 500.

Odpovědět

29 Tomáš Erlich Únor 11, 2010 v 13:28

Tento způsob by měl být funkční. Kontaktuj technickou podporu tvého hostingu a všechno jim tam popiš. Měli by ti poradit. Hodně štěstí!

Odpovědět

30 Petr Novák Březen 18, 2010 v 17:14

Moc pěkný článek, který mi osvětlil věci, které jsem nevěděl.
Měl bych jednu otázku: Jak by šlo udělat, aby htaccess chránil nějaký adresář heslem jak je popsáno výše, ale z některých IP adres by byl přístup bez omezení (bez nutnosti zadávat heslo)?
Děkuji za radu

Odpovědět

31 Tomáš Erlich Březen 21, 2010 v 16:26

Díky :). Jak udělat výjimku, která nebude muset zadávat heslo u zaheslované stránky nevím. Nic mne nenapadá. Zkus se zeptat na fóru Jak psát web.

Odpovědět

32 Kryštof Březen 29, 2010 v 11:37

# Přesměrování z 1.php na 2.php
RewriteEngine On
RewriteRule 1\.php /2.html [R=301]

Je tam chyba. Má tam být 2.php (Máš tam 2.html.) :)

Odpovědět

33 Tomáš Erlich Březen 31, 2010 v 19:47

Sakra! Díky za upozornění. Už to běžím dát do pořádku.

Odpovědět

34 Rusttaf Duben 1, 2010 v 11:51

Ahoj,
měl bych ještě jeden, míň záludnej dotaz:
potřeboval bych přesměrovávat odkazy na obrázky asi tímhle způsobem:
zobrazena adresa: data.domena.cz/obrazky/obrazek.jpg
skutečná adresa: xyz.domena.cz/obrazky/obrazek.jpg
zkoušel jsem tohle:
RewriteRule ^data.domena.cz/(.*).png http://xyz.domena.cz/$1.png
ale nefunguje to ani v různých variacích.

Odpovědět

35 Tomáš Erlich Duben 4, 2010 v 11:58

Promiň, ale tohle mi přijde vážně hloupé. Proč to prostě nenecháš jak to je? Pamatuj, že htaccess se načítá při každém (!) načtení stránky. Pokud tam budeš mít hromady kravin, stránky budou pomalejší. Opravdu něco takového potřebuješ?

Odpovědět

36 Rusttaf Duben 4, 2010 v 16:48

Subdomenu xyz jsem chtěl mít schovanou jenom pro administrátory. Je ale fakt, že by to asi hodně zatížilo server…

Odpovědět

37 Tomáš Erlich Duben 10, 2010 v 14:01

Zas tolik ne, je to maličkost, ale právě i málo se počítá. Mě to přijde zbytečné, prostě nic neskrývej. Pokud chceš, aby se do adresáře nikdo nedostal – udělej to přes htaccess.

Odpovědět

38 Mara Duben 28, 2010 v 8:46

Super,díky moc, konečně mi to funguje, ode dneška tě mám v oblíbených a svoje návštěvy k tobe na web zintenzivním, opravdu díky moc:)

Odpovědět

39 Jan (P_S) Květen 4, 2010 v 20:58

Potřeboval bych se zeptat jestli přes tyto nastavení jde i nastavit ikona která je vedle adresy-,

Odpovědět

40 Tomáš Erlich Květen 9, 2010 v 17:17

Chvilku jsem přemýšlel, co to vůbec po mě žádáš a už asi vím. Máš na mysli Favicon? Takový ten obrázek před adresou. Pokud ano, Dušan Janovský na svém webu už dávno napsal hezký návod, který by ti mohl pomoci.

Odpovědět

Leave a Comment

Previous post:

Next post: