Posts Tagged ‘htaccess’

Na hostingu Wedos je možné používat více domén v jednom hotingovém programu a je také možné vytvářet libovolné množství subdomén jen vytvořením dalšího adresáře ve výchozí struktuře kořene webu. Směrování do jednotlivých adresářů je zde řešeno pomocí .htaccess, který po vytvoření hostingu obsahuje toto:

RewriteEngine On

# cele domeny (aliasy)
RewriteCond %{REQUEST_URI} !^domains/
RewriteCond %{REQUEST_URI} !^/domains/
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteCond %{DOCUMENT_ROOT}/domains/%2 -d
RewriteRule (.*) domains/%2/$1 [DPI]

# subdomeny (s nebo bez www na zacatku)
RewriteCond %{REQUEST_URI} !^subdom/
RewriteCond %{REQUEST_URI} !^/subdom/
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)\.([^\.]*)\.([^\.]*)$
RewriteCond %{DOCUMENT_ROOT}/subdom/%2 -d
RewriteRule (.*) subdom/%2/$1 [DPI]

# aliasy - spravne presmerovani pri chybejicim /
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^domains/[^/]+/(.+[^/])$ /$1/ [R]

# subdomeny - spravne presmerovani pri chybejicim /
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^subdom/[^/]+/(.+[^/])$ /$1/ [R]

Adresářová struktura na hostingu, pak může vypadat třeba takto:

domains -> web1.cz
        -> web2.cz
        -> web3.cz
subdom -> subdomena1
subdom -> subdomena2

Vytvoření nového adresáře ve složce domains vytvoří prostor pro doménu, která bude do tohoto adresáře směrována. Vytvoření nového adresáře v subdom vytvoří nový prostor pro subdoménu.

Veškeré subdomény ze všech domén jsou směrovány do adresáře subdom. Problém nastává, pokud chci mít na adrese subdomena1.web1.cz jeden web a na doméně subdomena1.web2.cz druhý, pak nelze toto nastavení použít, protože obojí si šáhne do adresáře subdom/subdomena1, kde najde jeden a ten samý obsah.

Proto je vhodné použít tuto strukturu, která mi také mnohem víc vyhovuje:

domains -> web1.cz -> www
                   -> subdomena1
        -> web2.cz -> www
                   -> subdomena1
                   -> subdomena2
        -> web3.cz -> www

Pro tuto strukturu používám tento soubor .htaccess:

RewriteEngine On
RewriteBase /

# presmerovani na variantu s www
RewriteCond %{HTTP_HOST} ^([^\.]*)\.([^\.]*)$
RewriteRule (.*) http://www.%1.%2 [L,R=301]

# cele domeny (aliasy)
RewriteCond %{REQUEST_URI} !^/domains/
RewriteCond %{HTTP_HOST} ^([^\.]*)\.([^\.]*\.[^\.]*)$
RewriteCond %{DOCUMENT_ROOT}/domains/%2 -d
RewriteCond %{DOCUMENT_ROOT}/domains/%2/%1 -d
RewriteRule (.*) /domains/%2/%1/$1 [L]

# neexistuje subdomena, pak jdi na www
RewriteCond %{REQUEST_URI} !^/domains/
RewriteCond %{HTTP_HOST} ^([^\.]*)\.([^\.]*\.[^\.]*)$
RewriteCond %{DOCUMENT_ROOT}/domains/%2 -d
RewriteRule (.*) /domains/%2/www/$1 [L]

V první části je vyřešena situace kdy někdo zadá adresu jako http://domena1.cz, pak bude přesměrován na http://www.domena1.cz.

V druhé části je pak řešeno směrování na jednotlivé adresáře. Adresa http://subdomena1.domena1.cz bude směrováno do /domains/domena1.cz/subdomena1/. Z tohoto chování je zřejmé, že adresa http://www.domena1.cz bude nasměrována na /domains/domena1.cz/www/. Adresář www tedy musí vždy existovat.

Ve třetí části je řešen případ, kdy je zadaná adresa http://subdomena1.domena1.cz a adresář /domains/domena1.cz/subdomena1/ neexistuje. V tom případě je vše směrováno do adresáře /domains/domena1.cz/www/, což je taky další důvod proč musí vždy existovat jinak dojde k chybě.

Toto chování také využívám například na webu aclanky.cz, kdy je vše směrováno do /domains/aclanky.cz/www/ a když chci vytvořit nový web na subdoméně, tak aby jej nezachtával hlavní web, pak stačí jen vytvořit patřičný adresář a vše bude směrováno do něj.