Doménové aliasy – ušetřete za webhosting tentokrát s PHP

20. září 2003

Netradičním využitím takzvaných aliasů na webhostingu můžeme ušetřit nemalé peníze. V tomto článku si ukážeme, jak nastavit vše potřebné, a projdeme i případná omezení takového šetření.

Alias domény znamená, že více domén (dle záznamů v DNS) směřuje na tentýž webhosting, tedy na tentýž server, případně virtuální server. Doménový alias můžeme využít jednak pro jeho původní účel (například máme obchod s potravinami a chceme být na síti dostupní pod doménou potraviny.cz ale i jidlo.cz, vecere.cz a podobně), jednak, pokud se smíříme s menšími nevýhodami, můžeme s jeho pomocí ušetřit za webhosting. Nebo si můžeme naopak pořídit nejdražší variantu webhostingu a tuto sdílet, čímž se nám výrazně sníží náklady. Nejdražší varianta hostingu může stát skoro tisíc korun měsíčně, ovšem k dispozici jsou kvalitní služby, 500MB prostor, MySQL či jiné databáze, a případně za jednorázový poplatek zřízení dalších FTP účtů k adresářům. Na takový hosting se už vejde několik menších webů a ještě se tam mohou schovat nějaké ty osobní stránky.

Jedním z nedostatků popisovaného řešení je fakt, že díky doménovému aliasu jsou i maily (mailbox je obvykle také součástí webhostingu) doručovány do téhož mailboxu a že existuje pouze jeden koš, do kterého se sbírají maily ze všech aliasů. Pokud použiji příklad z úvodu, pak mail zaslaný na info@potraviny.cz bude doručen do stejného mailboxu jako mail poslaný na info@jidlo.cz. V tomto případě je řešením si předem „rozlosovat“ adresy mailboxů tak, aby každý z klientů měl alespoň jednu „slušně“ vypadající adresu. Druhým řešením by bylo nastavení přesměrování příchozích mailů na skript na straně serveru, který by je přesměroval do patřičného boxu (například na Linuxu umístěním souboru .forward s nastavením přesměrování do domovského adresáře). Přesměrování mailů však překračuje rozsah tohoto článku. Viděl jsem také řešení, kde byly všechny maily z doménového koše přijímány na počítač do Outlook Expressu a z něj následně pomocí nastavených pravidel přeposílány do mailboxů jednotlivých klientů.

Dalším nedostatkem je to, že všechny webové aliasy ve skutečnosti směřují na jednu stránku. Možným řešením je udávat adresu přímo na soubor nebo adresář vlastní prezentace. To může postačit v případě, že chceme využít výhod drahého hostingového programu a na adrese prezentace nám až tak nezáleží. Právě tuto nevýhodu je ale možné vcelku elegantně napravit. Stačí prezentaci pro každý alias uložit do zvláštního adresáře a do kořene, na který směřují všechny aliasy, uložit skript, který podle doménového jména zajistí přesměrování do správného adresáře. Příklad je napsán v PHP, použitelná je však většina skriptovacích jazyků, například ASP a dokonce i JavaScript.

Vytvoříme si tedy adresáře jednotlivých prezentací. Není špatné volit třeba jen dvoupísmenné zkratky nebo jiné důmyslné názvy, ty se totiž po přesměrování objeví v adresním řádku prohlížeče. Do kořene našeho webhostingu uložíme tento jediný soubor „index.php“:

<?php
switch (StrToLower($_SERVER[‚HTTP_HOST‘])) // převést požadovanou doménu na malé znaky a předat do rozhodnutí switch
{
   case ‚frantisek.cz‘: $path = ‚frantisek.cz/fn/‘; break;
   case ‚www.frantisek.cz‘: $path = ‚frantisek.cz/fn/‘; break;
   case ‚jirka.cz‘: $path = ‚www.jirka.cz/jx/‘; break;
   case ‚www.jirka.cz‘: $path = ‚www.jjirka.cz/jx/‘; break;
   case ‚jirka.sk‘: $path = ‚www.jirka.sk/jx/‘; break;
   case ‚www.jirka.sk‘: $path = ‚www.jirka.sk/jx/‘; break;
   default: $path = ‚frantisek.cz/fn/‘; // výchozí stránka
}
if (!empty($_SERVER[‚QUERY_STRING‘])) // pokud jsou zadány nějaké parametry, předat je dále i po přesměrování
   $path.=‘?‘.$_SERVER[‚QUERY_STRING‘];
Header(‚Location: http://‘.$path);
Exit;
?>

Ve skriptu se v závislosti na zadaném doménovém jménu nastaví cesta k adresáři a nakonec se provede přesměrování. Zadaný název se převádí na malá písmena, protože některé servery konverzi neprovádějí, a tak by se v případě zadání adresy velkými písmeny stal skript nefunkčním. Ve skriptu je také řešení varianty s www i bez www, jak je vidět, uživatel „františek“ v každém případě směruje vždy na adresu bez www, naopak jirka chce, aby se i při zadání adresy jeho stránek bez www nakonec pro přesměrování www v adresním řádku prohlížeče objevilo (viz Třikrát W v internetové adrese – past na laiky?).

Jirka má navíc zaregistrován ještě jeden alias pro doménu na Slovensku, která však směřuje do stejného adresáře. Nakonec je ještě ošetřen případ, kdy návštěvník zadá stránku přímo s parametry – někteří uživatelé i řadu parametrů píší zpaměti. Toto řešení je užitečné také v případě, že jsme původně měli stránky přímo v kořeni, tedy bez adresáře, a někdo si některou stránku uložil do oblíbených položek i s parametry. Pokud později přejdeme na sdílení hostingu pomocí aliasů, zůstanou i původní uložené odkazy funkční. Uživatel bude přesměrován na novou adresu včetně zadaných parametrů a pokud jsme nezměnili funkci skriptů, možná ani nezaregistruje, že URL je jiné.

Je zřejmé, že na serveru jsou prezentace v adresářích „fn“ a „jx“. Adresář „fn“ je určen pro prezentaci frantisek.cz, ovšem pokud by někdo zadal frantisek.cz/jx/, zobrazí se mu stránky patřící prezentaci jirka.cz. I tomu však lze zabránit a dále si ukážeme jak. Nejprve se ale podíváme, jak je možné zabránit zobrazení adresáře, do kterého se provedlo přesměrování, v adresním řádku prohlížeče. Princip je jednoduchý a využívá vnoření stránky do neviditelného rámce (takzvaný cloaking – bohužel se všemi nevýhodami rámců), stejný princip je využit v článku Vlastní přesměrovací služba. Pokud se tedy někomu nelíbí, že jeho stránky mají v adresním řádku prohlížeče i nějaký adresář, může použít tento skript:

<?php
switch (StrToLower($_SERVER[‚HTTP_HOST‘])) // převést požadovanou doménu na malé znaky a předat do rozhodnutí switch
{
    case ‚frantisek.cz‘: $path = ‚frantisek.cz/fn/‘; $title=’Františkovy stránky‘; break; // nastavit cestu a titulek stránek
    case ‚www.frantisek.cz‘: $path = ‚frantisek.cz/fn/‘; $title=’Františkovy stránky‘; break;
    case ‚jirka.cz‘: $path = ‚www.jirka.cz/jx/‘; $title=’Jirka Superman‘; break;
    case ‚www.jirka.cz‘: $path = ‚www.jjirka.cz/jx/‘; $title=’Jirka Superman‘; break;
    case ‚jirka.sk‘: $path = ‚www.jirka.sk/jx/‘; $title=’Jirka Superman‘; break;
    case ‚www.jirka.sk‘: $path = ‚www.jirka.sk/jx/‘; $title=’Jirka Superman‘; break;
    default: $path = ‚frantisek.cz/fn/‘; $title=’Františkovi stránky‘; // výchozí stránka
}
if (!Empty($_SERVER[‚QUERY_STRING‘])) // pokud jsou zadány nějaké parametry, předat je dále
    $path.= ‚?‘.$_SERVER[‚QUERY_STRING‘];
?>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.01 Frameset//EN“ „http://www.w3.org/TR/html4/frameset.dtd“>
<html>
  <head><title><?php echo($title); ?></title></head>
  <frameset rows=“*,0″ border=“0″ framespacing=“0″ framecolor=“#00000″> // definice „neviditelného“ rámce
    <frame src=“http://<?php echo ($path); ?>“ frameborder=“0″ marginwidth=“0″ marginheight=“0″> // nastavení url stránky rámce
  </frameset>
  <noframes>
    <body>
      <div style=“font-size:2em;“>
        <a href=“http://<?php echo($path); ?>“><?php echo($title); ?></a> // odkaz na adresu stránek v části, která se objeví, pokud browser klienta nepodporuje rámce
      </div>
    </body>
  </noframes>
</html>

Ve skriptu je navíc doplněna proměnná, do které se zadává titulek stránky, který se bude zobrazovat jako titulek rámce, v němž bude cílová stránka zobrazena.

S ohledem na možnosti ukládání odkazů do oblíbených položek a vůbec přístupnost stránek preferuji spíše první způsob, ovšem je pochopitelné, že někteří klienti raději vidí jen to WWW.COSI.CZ a další funkčnost je jim lhostejná.

Nakonec můžeme ještě přímo v každé aplikaci ošetřit případ, kdy by do ní někdo chtěl jít z cizí domény. Jednoduše na začátek skriptu (nebo každého skriptu pomocí include, v závislosti na tom, jak je naše aplikace stavěná) přidáme test, zda je přistupováno ze správné domény. Pokud není, přesměrujeme přímo na adresu zadávané domény – aplikace tedy odepře přístup. Pokud dojde k přesměrování na hlavní adresu domény, dojde následně, díky již dříve popsanému skriptu, k dalšímu přesměrování na prezentaci, která patří k zadané doméně.

Příklad testovací části, kterou vložíme do stránek prezentace frantisek.cz:

<?php
if (!EregI(‚frantisek‘,$_SERVER[‚HTTP_HOST‘]))
{// test zda jde o volani z domeny frantisek
  Header(‚Location: http://‘.$_SERVER[‚HTTP_HOST‘].’/?‘.$_SERVER[‚QUERY_STRING‘]);
  Exit;
}
?>

Pro hromadné používání tohoto testu by bylo dobré si název testované domény vložit do proměnné a tuto nastavovat v nějakém globální souboru prezentace (já používám obvykle config.php), pak nemusí být v této části „natvrdo“ nastaveno jméno „frantisek“ a celá aplikace bude lehce přenositelná.

Pozn. red.: Tento článek vyšel poprvé 8. 2. 2002. Původní verze článku a k němu vedené diskuse jsou vám k dispozici v ZIP archivech.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek ximo.sk
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *