Použití souboru .htaccess

Pátek, 5. Září 2008

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 stránka

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.

# Zakáže přístup (stažení) ke všem souborům .txt

<filesmatch "\.(txt)$">
order allow,deny
deny from all
</filesmatch>

- Soubory s touto koncovkou nepůjde zobrazit ani jakkoli stáhnout
- Při pokusu o stažení se zobrazí chyba 403 – přístup odepřen

# 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 (podstrkávání)

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

- Známé také jako podstrčení stránky (to je ta druhá)

# 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!

{ Komentáře k článku }

Patrik Humpolec

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

Tomáš Erlich

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

LubosP

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á :-).

Tomáš Erlich

Podle mého názoru je nejbezpečnější způsob zaheslování stránky pomocí .htaccess, jak popisuji v tomto článku.

Pokud ti tento způsob nevyhovuje, doporučuji si přečíst článek Dušana Janovského zaheslování stránek, který ti určitě pomůže.

Hodně štěstí!

LubosP

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á.

Tomáš Erlich

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, 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 této adrese.

Charlie

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

Tomáš Erlich

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.

:)

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

Tomáš Erlich

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']);
Jakub Hejda

Š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.

Tomáš Erlich

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.

Masterbill

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

Tomáš Erlich

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).

Jackm

Dobrej článek… ;-)

Tomáš Erlich

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 :).

Nouma

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).

Tomáš Erlich

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 :).

Rusttaf

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 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 (.*) 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í?

Tomáš Erlich

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).

Rusttaf

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
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

Tomáš Erlich

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.

Rusttaf

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

spoon

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

Moretti

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 ****.eu přesměrovalo na ****/phpBB3.

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

Tomáš Erlich

Ahoj. 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 ^(.*)$ ****/phpBB3/$1 [R=301,QSA]
Moretti

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

Moretti

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 ^(.*)$ vw-life.eu/phpBB3/$ [R=301,QSA]

zas hodí chybu 500.

Tomáš Erlich

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í!

Petr Novák

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

Tomáš Erlich

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.

Rusttaf

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 xyz.domena.cz/$1.png
ale nefunguje to ani v různých variacích.

Tomáš Erlich

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š?

Rusttaf

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

Tomáš Erlich

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.

Mara

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 :).

Jan (P_S)

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

Tomáš Erlich

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.

Daneel

Lze takto i přesměrovat na subdoménu na jiném serveru, který má jen veřejnou IP? Ale tak, aby byla serveru poslána doména, ne IP?

Např. toto – subdoména má být pobocka.firma.cz a ta je na jiném server s vlastní IP, jde to vůbec aby po přesměrování bylo v adrese pobocka.firma.cz a ne IP na které to běží? Díky.

Zdeněk Truněček
Options -Indexes
ErrorDocument 404 /err_found.htm
RedirectMatch /dealer.* /index.php?load=dealer
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{QUERY_STRING} .*access=1.*
RewriteRule .* - [L]
RewriteCond %{QUERY_STRING} .*load=.*
RewriteRule .* - [L]
#RewriteCond %{REQUEST_FILENAME} -F
RewriteCond %{REQUEST_URI} .*/(U.*|O.*|S.*|archiv.*)
RewriteCond %{REQUEST_FILENAME} .*(\.exe|\.zip|\.pdf)
RewriteRule ^(.*)$ /index.php?access=1&load=downexe&addr=$1 [NC,R,L]

Prosím o pomoc s hledáním chyby. Tohle mi podle posledního RewriteRule přesměrovává i URL, které mají v zápisu „load=“ nebo „access=1″ a nevím proč. „Dealera“ to přesměrovává v pohodě.

Uvítám i případná zjednodušení.

otoman

Ahoj, hezký článek. Měl bych taky jeden dotaz. Mám zaheslovanou stránku pomocí .htaccess a .htapasswd je možné aby když se přihlásí například uživatel karel přesměrovalo ho to na karel.php a když se přihlásí pepík na stránku pepil.php. Díky moc…

Lukas

caute, hej pls potreboval bych poradit jak zablokuju pristup jedne IP pres htaccess! nevim co tam mam napsat do toho souboru .htaccess, ktery mam nahrany na webe. pls poradte jak to bloknu tu ip…

Jan Stolařík

Třeba takhle: deny from ip_adresa.

Simeon
# Prístup majú všetci
Allow from all
# Prístup majú iba určité IP
Allow from 127.0.0.1
Allow from 457.5.5.4
# Prístup nemá nikto
Deny from all
# Prístup má zakázaný (napríklad Ban)
Deny from 127.0.0.1
Deny from 457.5.5.4
Rudla

Úžasné stránky, přesto mi cosi nejde. Když vše nachystám jak je tu popsané, tak při prvním přihlašování do „zaheslovaného“ podadresáře se dotazovací okno otevře, ale po vyplnění mi vyskočí chyba 500 – vnitřní chyba serveru. Je to asi tím, že neumím spustit soubor s phpinfo(), abych měl jasnou informaci o cestě k adresáři. Předpokládám, že PHP scripty musí být na serveru povoleny a to netuším jak zajistit. Moc děkuji za navedení…

Kiwi17

Dobrý den,
jsem trošku v háji. Zápis od zápisu se to zde snažím pochopit, ale nedaří se :-/ Přitom potřebuji jen takový zápis, který mi uděla z mých poněkud odstrašujících URL takové, které se sluší a patří. Prosím o pomoc, zda-li si někdo víte s touto „prkotinou“ rady, tak se prosím ozvěte. Díky moc :-).

Jindra

Dobrý den. Potřeboval bych radu… 2 weby na stejném hostingu… jeden primární a jeden jako alias. Ten primární běží standardně ze složky /www/, ale ten druhý (alias) běží z /www/domains/adresa.webu. Ve složce /www/ mám htaccess, který mi standartně ovlivňuje i podsložky (právě že i druhý web). V www/domains/adresa.webu mám druhý htaccess, ale jeho funkčnost je stejně přepsaná tim prvnim htaccessem. Jak do prvního htaccess zapsat, aby určitý zápis neplatil pro www/domains/? Nebo naopak jak zapsat, aby příkaz platil jen v určitých adresářích? Moc by mi to pomohlo, děkuji. Jindra.

Tomáš Erlich

Nejlepší bude přesunou web jinam. Prostě udělat složky jinak. Teď máte hlavní web naházený v hlavní složce www – tak udělejte novou, znovu „www“ a tam web přesuňte. Takže hlavní web poběží v /www/www/ a druhý web v /www/druhy.web/ – chápete? Každá doména tedy běží ve své složce a nebudou se nijak ovlivňovat. Jiný řešení neznám a nedokážu víc poradit. Soubor HTA zkrátka ovlivňuje vše pod ním kde je vložen, o deaktivaci nic nevím.

Jindra

Vyřešeno, moc děkuji za rady :). Nakonec mě vaše řešení napadlo ještě dříve než jsem si ho přečetl a funguje :).

Přeju hezký den.

Nicole

Prosím o radu, kde najdu svou IP adresu, dala jsem si do htaccess svoji abych se nemusela logovat do zaheslovaneho webu i ja sama, ale nefunguje to.

Zapsala jsem allow from a IPv4 adresu z vypisu pripojeni, ale jsem pres router, prosim o radu jak najdu tu spravnou tuto mi to nebere a nepovoli mi pristup bez zaheslovani, nebo sem to pochopila spatne, a je to blokovani IP adres vztazeno jen na situaci az po nalogovani?

Dekuji za rady.

Tomáš Erlich

Nemám tušení, ale svou IP adresu najdete tady :). Takovýhle věci jsem nikdy opravdu nezkoušel a už dělám úplně něco jiného. Nejlepší bude zkoušet. Každopádně myslím, že heslo bude třeba pořád.

Komentáře jsou pro tento článek již uzavřeny.

Předchozí příspěvek:

Následující příspěvek:

Tato stránka již není udržována. Děkuji za pochopení.