Na této stránce ukáži několik příkladů, které Vám umožní zajímavé hrátky se subdoménami.
Subdoménami myslíme část adresy před Vaší doménou, tzn jedná se o domény třetího a vyššího řádu.
Vypadá to takto: subdomena.domena.tld, přičemž řád se počítá zprava doleva: tld=1, domena=2, subdomena=3...
Stojí za zmínku, že i v www.domena.tld je www vlastně subdoména.
První příklad demonstruje, jak přesměrovat celou subdoménu na jinou. V našem konkrétním případě přesměrovávám stara-subdomena na nova-subdomena. Jedná se o stejný htaccess jako u přesměrování celé domény, jen je třeba tento htaccess umístit do složky původní subdomény.
RewriteEngine on
RewriteRule (.*) http://nova-subdomena.example.cz/$1 [R=301,QSA]
Pokud bychom chtěli původní složku smazat (aby se nepletla apod.), je to možné,
jen je potřeba informaci o přesměrování umístit do nadřazené složky.
V případě přesměrování klasické subdomény to znamená umístit přesměrovávací
skript do rootu domény (tam kde bývá složka www a případné další subdomény).
V nadřazené složce ale nelze použít htaccess soubor se stejným obsahem jako výše zmíněný,
jelikož ten by přesměroval úplně celou doménu a ne jen chtěnou subdoménu.
Přesměrování lze pak vyřešit takto:
RewriteEngine on
RewriteCond %{http_host} ^stara-subdomena\.example\.cz
RewriteRule stara-subdomena/(.*) http://nova-subdomena.example.cz/$1 [R=301,QSA]
Daná podmínka zaručí, že se bude přesměrovávat jen subdoména stara-subdomena. Pokud byste chtěli povolit možnost přesměrovávat i subdoménu www.stara-subdomena, napsali byste například takovýto regulární výraz:
RewriteEngine on
RewriteCond %{http_host} ^(www\.)?stara-subdomena\.hezky\.net
RewriteRule stara-subdomena/(.*) http://nova-subdomena.hezky.net/$1 [R=301,QSA]
Otazník za závorkou v regulárním výrazu značí počet opakovaní - opakuje se buď 1x nebo 0x.
Další typy opakování jsou plus + (1x a vícekrát) a hvězdička * (0x a vícekrát).
Z toho vyplývá, že výraz v jednoduché závorce (www\.) je volitelný -> bude se přesměrovávat jen správná subdoména a to jak s www tak bez www.
Pokud byste chtěli přesměrovávat naprosto všechny sub-subdomény (subdomény vyšších řádů),
vložili byste místo otazníku hvězdičku a místo (www\.) výraz pro libovolnou subdoménu (.+\.):
RewriteEngine on
RewriteCond %{http_host} ^(.+\.)*stara-subdomena\.example\.cz
RewriteRule (.*) http://nova-subdomena.example.cz?$1 [R=301,QSA]
Tento kód všechny subdomény pod stara-subdomena přesměruje na novou subdoménu
a informaci o sub-subdoméně a požadovaném souboru vkládá za otazník.
Informace za tímto otazníkem se u různých poskytovatelů hostingu asi mohou lišit.
Například na mém hostingu při zadání http://neco.subdomena.example.cz/index.php
za otazníkem objeví neco/index.php, což mi nepřijde jako správná hodnota, ale budiž...
Jakmile zjistíte, jak to na Vašem hostingu funguje, můžete si upravit RewriteRule tak,
aby se příslušné subdomény vyššího řádu přesměrovávaly na stejné místo pod novou subdoménu.
V mém případě takto:
RewriteEngine on
RewriteCond %{http_host} ^(.+\.)*stara-subdomena\.example\.cz
RewriteRule (.*)/(.*) http://$1.nova-subdomena.example.cz/$2 [R=301,QSA]
Podstrkávání skriptu místo všech subdomén se občas používá pro vytvoření struktury webu ve stylu:
profil.example.cz
uzivatel.example.cz
kategorie.example.cz
apod.
Přičemž těchto subdomén může být značná spousta, mohou být dynamicky generované a je tedy zbytečné je fyzicky vytvářet, či do nich dokonce rozkopírovavat mnohdy stejný obsah.
Nejprve ukážu, jak lze tyto subdomény přesměrovat na nějaký existující skript:
RewriteCond %{http_host} !^(www\.)?example\.cz [NC] # vse krome www.example.cz a example.cz
RewriteCond %{http_host} ^(www\.)?([^.]+)\.example\.cz # jen pro subdomeny (s nebo bez www)
RewriteRule (.*) http://www.example.cz/kategorie.php?subdomena=%2&cesta=$1 [L]
Tento skript funguje bez problému a přesměrování dojde, jelikož jsme zadali absolutní cestu. Bohužel se mi však nepodařilo upravit cestu na relativní tak, aby došlo k podstrkávání. Představoval jsem si to asi takto:
RewriteCond %{http_host} !^(www\.)?example\.cz [NC]
RewriteCond %{http_host} ^(www\.)?([^.]+)\.example\.cz
RewriteRule (.*) kategorie.php?subdomena=%2&cesta=$1 [L]
Ale to bohužel vrací chybu 500. Vidí někdo kde dělam chybu? :)
[1] hm (hm.hm) dne 18.11.2009:
hm :-) přesně to co člověk potřebuje vědět, neví :-)