různé možnosti, jak se to dělá
Možnosti přesměrování stránky - Jenom odkaz - Přesměrování meta tagem - Přesměrování javascriptem - Přesměrování na straně serveru - Proč stránky přesměrovávat - Přesměrování na jiný typ souboru - Co na to vyhledávače - Beznadějný dotaz - Přesun domény
Pokud se mluví o přesměrování, obvykle se myslí přesměrování serverovou hlavičkou.
Možná se divíte, proč zmiňuji přesměrování odkazem, na který si uživatel musí kliknout. Je to ale nejméně riskantní a uživatel má dobrý pocit, že má prohlížeč plně pod kontrolou. Prostě tam napište "stránka je na nové adrese té a té + odkaz". Není co zkazit.
Nejoblíbenější způsob, protože se nemusí skriptovat a dá se vložit rovnou do staré stránky:
<meta http-equiv="refresh" content="4;url=http://jina_adresa.cz/cokoliv">
Číslo 4 vyjadřuje počet sekund, po kolika se udělá přesměrování. Adresa url na přesměrování může být i relativní:
<meta http-equiv="refresh" content="3;url=ondra.html">
Zkuste příklad. Trocha teorie: meta tag s http-equiv by prohlížeč měl chápat jako ekvivalentní http hlavičce. Http hlavička refresh vyvolá aktualizaci dokumentu, ale dá se přitom podstrčit jiné url (pokud tam url není, obnoví se tatáž stránka).
Stará stránka s meta tagem by neměla být prázdná. Kromě textu, který ujistí čtenáře, že je na správné cestě, by měla obsahovat odkaz na novou url. Může se totiž stát, že uživatel bude mít možnost meta refresh zakázanou (v Internet Exploreru je to na kartě Zabezpečení > Vlastní úroveň), třebaže to je řídký jev. Odkaz se bude také výborně hodit vyhledávačům a uživatelům alternativních browserů.
Příklad jednoduchého přesměrování javascriptem:
<script>
window.location.href="http://jina_adresa.cz/cokoliv";
</script>
nebo přesměrování na Seznam s tím rozdílem, že současná stránka nebude vůbec zařazena do historie:
<script>
window.location.replace("http://www.seznam.cz");
</script>
Javascriptové přesměrování je nejméně jistý způsob přesměrování. Kromě toho, že javascript může být (teoreticky) vypnutý nebo nepodporovaný, to může házet různé netušené chyby. Javascriptové přesměrování se používá zejména tehdy, když není předem jasné, kam se bude přesměrovávat (když se to napřed podle něčeho počítá, tak to meta tagem nejde). Dost často se to používá např. na velkých chatech. Nebo se javascriptem napřed zjišťuje, zda vůbec se bude přesměrovávat (např. reklamní interstitial podle cookies).
Zase je potřeba dát tam navíc odkaz na novou url.
Vhodné zejména pro stěhování více stránek, protože se to dá nastavit celému serveru najednou. Nastavuje se to v Apachi, IIS nebo v jiném softwarovém http serveru.
Server IIS od Microsoftu na to má v nastavení složky zaškrtávací políčko (nevím, jak se jmenuje), kam se potom dá nastavit nová složka, kam se obsah bude přesměrovávat.
Na serveru Apache se přesměrování dá nastavit více způsoby. Oblíbené je použití modulu mod_rewrite, který se ovládá třeba souborem .htaccess, jenž si může psát sám autor webu (správce serveru musí mod_rewrite a .htaccess povolit, není to samozřejmost).
Podstatné je, aby server při požadavku na starou adresu odpovídal 301 Moved Permanently (kód č. 301 znamená přesunuto nafurt), nebo alespoň 302 Moved termorarily. Pak totiž přesměrování správně pochopí i Google, Seznam a jiné vyhledávače.
Sepsal jsem pro vás návod na začátky s mod_rewrite. Můžete také mrknout na pokročilé příklady na mod_rewrite od Kajmana.
Pro jednoduché přesměrování stačí mod_alias, ten bývá na serveru Apache dostupný skoro vždy. Do souboru .htaccess se napíše řádek:
Redirect /pokus.html http://celaadresa.cz/pokus2.html
čímž dojde k přesměrování (http odpověď 302 dočasně přemístěno) souboru pokus.html na novou adresu. Uživatel sice do prohlížeče vyťuká starou (nebo klikne na starý odkaz), ale v řádku adresy už se mu objeví nová adresa. Přesměrovaný zdroj musí začínat lomítkem (odvozuje se od rootu webu), nová adresa musí být absolutní. Druhá varianta zápisu:
Redirect 301 /pokus.html http://celaadresa.cz/pokus2.html
Server by pak měl posílat http odpověď "301 moved permanently" s informací o nové URL. V praxi není mezi odpověďmi 301 a 302 žádný větší rozdíl. Prohlížeč by si měl sáhnout na nové URL (v http odpovědi řádek Location). Teoreticky vzato je to jediné zcela bezpečné a správné přesměrování.
Mod_alias umí i regulární výrazy, symbolický zápis potom je
RedirectMatch regular-puvodniho-url nova-adresa
Pokud není použití souboru .htaccess ¨na serveru povoleno, dá se to napsat rovnou do konfiguráku serveru (httpd.conf). Jestliže vám to přijde složité, tak většina správců serveru to umí nastavit (vyjma správců freewebů, ti to nedělají).
Na staré stránky se v případě serverového přesměrování nedává žádný speciální obsah, protože server ty staré stránky vůbec nebude odesílat. I při dotazu na starou adresu se v prohlížeči automaticky objeví nová. Zkuste si například vyťukat https://bulharsko.evropou.cz/ a uvidíte, že jste stránce https://www.bulharsko.net . To je kvůli tomu, že jsem všechno ze své domény bulharsko.evropou.cz přesměroval na jinou svou doménu bulharsko.net pomocí serverového přesměrování.
Pokud potřebujete přesměrovávat nějaké šílenosti podle složitých pravidel, nastudujte si něco o mod_rewrite. Je to šílená alchymie a při testování uvidíte spoustu veselých chybových hlášení. Na druhou stranu je nutno říct, že kdo mod_rewrite ovládá, dokáže přesměrovat velblouda do ucha jehly.
Ne na každém linuxovém serveru je mod_rewrite nainstalován. Na windowsím IIS prý něco jako mod_rewrite existuje, jmenuje se to tuším ISAPI rewrite. Nic o tom nevím.
Příklad přesměrování celého webu z protokolu http na https s použitím mod_rewrite uvádím v návodu o přechodu na https.
V jazyce PHP je funkce Header(), do které se dá napsat parametr Location s novou adresou. Pokud je funkce header() na serveru povolena, dojde k přesměrování na novou stránku. Následující kód se vloží do staré stránky:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.celaadresa.cz");
header("Connection: close");
?>
Postupem času jsem dospěl k názoru, že 301 a 302 se skoro vůbec neliší. Rozdíly jsou pouze 2:
Tip: kvůli kešování 301 prohlížečů je dobré při ladění a pokusech používat přesměrování 302. Jakmile to začne fungovat, změňte to definitivně na 301.
Když stránka byla na jednom místě a teď je jinde, tak je jasné, že je potřeba přesměrovat. Ve všech jiných případech je použití přesměrování sporné. Rozhodně by nemělo jít o standardní součást navigace webu. Kdo nepřesměrovává, vyhrál předem. Nepřesouvejte soubory a adresy zbytečně.
Aby se čtenář / uživatel nepolekal a nezdrhnul. Máte rádi, když vám prohlížeč z ničeho nic problikne a začne se načítat jiná stránka? Já ne.
Hezký trik využívá přesměrování při stahování souborů nebo hudby. Meta refresh se nenamíří na jinou html stránku, ale třeba na soubor typu zip.
<meta http-equiv="refresh" content="1;url=http://www.sweb.cz/yuhu/jak_psat_web.zip">
Prohlížeč takový soubor neumí otevřít, a tak zavolá externí aplikaci (nebo se zeptá, jestli se to má stáhnout). Původní stránka přitom zůstává v prohlížeči. Dělá se to tehdy, když je potřeba počet stažení zipu nějak přibližně počítat (a nejde to z logu).
Stejnou konstrukcí se dá dosáhnout jiného efektu -- přehrávání hudby. Návod jsem na to četl už před šesti lety (psáno 2003) v Satrapově Web Designu. Refresh se namíří na hudební soubor, který by si v ideálním případě měla převzít hudební aplikace (třeba Winamp). Podmiňovací způsob je ale na místě, protože dost často to vyhazuje nějaké divné hlášky, takže to doporučuji nepoužívat.
Názory a přístupy se různí. Každý vyhledávač se s přesměrováním potýká jinak. Obecně se dá říci, že klientsky přesměrované stránky (meta tag, javascript) chápou vyhledávače jako méněcenné.
Jako nejjistější pro Google se uvádí serverové přesměrování (hlavička 301 nebo 302) a já s tím mám dobré zkušenosti. Podle mých pozorování Google po dvou měsících převede 301 přesměrovaný záznam na nové url a zachová mu pozici ve výsledcích (pouze na dva dny [během Google-dance] to z výsledků vypadává).
Také Bing hlavičku 301 respektuje. Hlavička 302 se chová hodně podobně, ne-li stejně.
Fulltext Seznamu kromě hlaviček 301 a 302 respektuje i přesměrování meta tagem s libovolnou nastavenou dobou. Ačkoli tedy Seznam meta tagy bere, přesměrování přes meta tagy a přesměrování javascriptem jsou pro vyhledávače obecně nevhodné. To už je lepší obyčejný odkaz.
Vyhněte se masivnímu přesměrování mnoha stránek na jednu. V Googlu se tomu říká Faulty Redirect. Pro dobré vyhledávače není těžké rozpoznat situaci, kdy se ho web snaží ošálit, například tím, že celou starou doménu přesměruje na hlavní stránku nové domény, nebo když všechny neexistující stránky přesměrovává na nějakou vybranou (typicky hlavní). Při změně domény je jedině správné přesměrovávat minulou URL na novou URL se stejným obsahem. Neexistující nebo zaniklé stránky je správné označit chybou 404 nebo 410. Faulty Redirects vyhledávače zahazují.
Občas dostávám prosby o radu typu: "Ten a ten server mi zrušil stránky nebo odepřel přístup, takže se na ně nedostanu. Potřebuji je přesměrovat."
To nejde nijak. Pokud je správce serveru nedostupný nebo nechce komunikovat a na stránky se nedá uploadovat, není šance. To klasicky nastává na freewebech při porušení podmínek (ať už domnělém nebo skutečném). Pak je potřeba prostě všem nějak sdělit, že mám novou adresu a přesměrovat případné odkazy.
Pokud máte doménu druhé úrovně něco.cz hostovanou u nějakého nesolidního správce serveru (providera), můžete přestěhovat celou doménu. Nejlépe tak, že se dohodnete s nějakým jiným hostingem a ten to zařídí. V zásadě to udělá tak, že registrátorovi domény (dříve to byl NIC, úřad spravující doménu cz, nyní jeden z registrátorů) sdělí novou adresu primárního DNS serveru. Někdy se dá s providery domluvit, že DNS zůstane na starém místě a A záznam bude ukazovat na nový server. Neznáte-li seriózní servery, napište mi, můžu jich pár doporučit.
Jak psát web píše Yuhů, Dušan Janovský. Kontakt.