Poslední dobou se na internetu hodně zmiňuje optimalizace pro vyhledávače neboli „SEO”. Její součástí je též optimalizace URL adres, jejímž cílem je zjednodušení adres dokumentů tak aby byly srozumitelné jak pro uživatele, tak pro vyhledávací roboty.
K tomuto účelu existuje velmi silný nástroj pro server apache, kterým je mod_rewrite. Je to modul, který se stará o přepis URL adresy dokumentu na základě jednoduchých pravidel ve formě regulárních výrazů. Více o mod_rewrite najdete na serveru Marka Prokopa sovavsiti.cz konkrétně v článku Mod_rewrite pro lepší odkazy.
Nyní se však vraťme k podstatě problematiky. Pokud jsou vaše stránky umístěny na webhostingu, je více než pravděpodobné, že mod_rewrite nebo alespoň jeho konfiguraci nebudete mít plně k dispozici. Je tu ale cesta jak dosáhnout stejného výsledku za pomoci jednoduchého PHP skriptu.
Předpokladem úspěšné implementace tohoto řešení je přesměrování ErrorDocument pro chybový kód 404 na vlastní PHP skript, který použijeme jako jednoduchý redirector. Zde je zásadní problém, pokud tuto možnost na svém hostingu nemáte, nic z toho co je uvedeno dále Vám nebude fungovat. Pro ty, kteří si mají možnost nakonfigurovat apache doplňuji, že nastavení přesměrování ErrorDocument se provádí v httpd.conf pomocí ErrorDocument 404 jmeno_stranky/skriptu. Více najdete v dokumentaci apache ,ale v tomto případě doporučuji použít mod_rewrite.
Předpokládejme tedy, že jako ErrorDocument máme nastaven skript 404.php a nyní se podíváme na jeho obsah.
Dejme tomu, že máme skript clanek.php jehož parametrem je id, jenž identifikuje článek, který chceme zobrazit. Tudíž kompletní cesta k dokumentu vypadá třeba takto : http://www.domena.tld/clanek.php?id=20. Pokud chceme zařídit aby se nám dokument zobrazil i po zadání této adresy : http://www.domena.tld/clanek20.html, uděláme to následovně :
<?
// obsah souboru 404.php
$url=$REQUEST_URI;
if (preg_match('/clanek([0-9]+).html/', $url,$id)>0) {
header('HTTP/1.1 200 OK');
$id=$id[1];
include('clanek.php');
}
?>
Jak jste si již možná všimli, předpokládám v tomto skriptu použítí nastavení PHP RegisterGlobals=On. To znamená, že proměnou $id nastavím ve skriptu 404.php a následně vložím skript clanek.php. Pokud tedy ve skriptu clanek.php budu přistupovat k parametru id přes pole $HTTP_GET_VARS, tak zde jeho hodnotu nenajdu.
Druhou věcí je odeslání hlavičky HTTP/1.1 200 OK. Vzhledem k tomu, že využíváme přesměrování pomocí dokumentu volaném při chybě 404 Not found, odešle server apache hlavičku HTTP/1.1 404 Not Found. My však tuto hlavičku potřebujeme přepsat, aby klient (nemusí to být pouze browser) nepoznal jakou na něj šijeme boudu.
Doufám, že jsem tento princip nastínil dostatečně srozumitelně, pokud budete mít někdo problém s případou implementací tak napište a já článek doplním o další příklady a zdrojové texty. Závěrem snad ještě podotknu, že ve spojení s databází lze tento princip použít k vytváření virtualních cest dokumentů, kde jménem dokumentu bude například jeho nadpis zbavený diakritiky a mezer.
UPDATE - 26.8.2005
Zkoušel jsem stránky používající tento princip v prohlížeči lynx a kupodivu nefungovaly. Nakonec, jak jsem se dočetl v komentáři pana Viléma Málka k článku na weblogu Mraveniště, je správná hlavička HTTP/1.1 302 Found a ne HTTP/1.1 200 OK. Po této úpravě už to jede i v lynxu.
UPDATE - 29.8.2005
Tak s HTTP/1.1 302 Found to zase kupodivu nesežere MSIE. Jenom nevím jestli je spravedlivé preferovat uživatele MSIE proti uživatelům lynxu. :-D
Novinky
17.7.2008
Doplněny fotogalerie :
Dovolená I
Dovolená II
Dovolená III
Dovolená IV
Dovolená V
28.2.2008
Doplněny fotogalerie :
09.02.2008 - Čtvrté narozeniny
26.12.2007 - Vánoční procházka
15.12.2007 - Předčasné vánoce
05.12.2007 - Mikuláš
25.11.2007 - Fotografka
16.09.2007 - Na pouti a bezva převlek
15.09.2007 - Na pouti
03.09.2007 - Poprvé ve školce
19.08.2007 - V Olomouci na Flóře
11.08.2007 - Liberecký dětský koutek
29.07.2007 - V Luhačovicích
12.7.2007
12.7.2007
12.7.2007
archivPočasí v Brně
1°C
žádná oblačnost
Komentáře
To je šílený. Mod_rewrite se mimo jiné používá proto, aby byly URL lépe stravitelné pro vyhledávače. Když to bude směrováno přes kód 404 (nebo 4**), tak se to bude sice pěkně přesměrovávat bez mod_rewrite, ale vyhledávače to indexovat vůbec nebudou!
6.10.2004 14:24:31 - Vojtěch Semecký - mail
Nevím na základě jakých informací jste došel k závěru, že to vyhledavače nebudou indexovat. Stránka tohoto článku jasným důkazem, že to vyhledavače v pohodě indexují a nemají s tím žádný problém.
Kdyby jste si článek přečetl pozorně, zjistil by jste, že důležitým faktorem tohoto principu je zaslání hlavičky HTTP/1.1 200 OK, díky čemuž browser nebo jiný klient (např. robot) vůbec nepozná, že došlo k nějaké 404. Nevěříte-li, připojte se k serveru pomocí telnetu a podívejte se co taková stránka vrací.
Pokud si i nadále myslíte, že to nemůže fungovat, uveďte nějaké argumenty. Prosté konstatování nefunkčnosti trochu pokulhává za realitou.
S pozdravem,
Petr Kodytek
7.10.2004 06:57:58 - Petr Kodytek - mail
Tak jsem to chtěl vyzkoušet a selhal jsem hned na začátku. Nevíte proč mně $request_uri vrací tu chybovou stránku místo původního požadavku?
Za případnou odpověď velice děkuji
David
18.11.2004 09:36:53 - David - mail
Už jsem to vyřešil. Na error page jsem se odkazoval pomocí http.
Pěkný a ničím nerušený den přeje
David
18.11.2004 12:14:25 - David - mail
Dobry den, hosting, ktery musim pouzit je na Windows, tudiz tento zpusob nahrady za mod_rewrite je vybornou alternativou. ISS bohuzel nevraci $REQUEST_URI. Napada Vas nejaky jiny zpusob?
3.5.2005 12:37:49 - Michal Pelikan - mail
Dobrý den,
bohužel nemám osobní zkušenosti s provozem PHP na IIS, ale určitě by stálo za prozkoumání globální pole $_SERVER, ve kterém se snad najde jiná proměnná, ze které by se URL dala získat.
S pozdravem,
Petr Kodytek
9.5.2005 18:05:26 - Petr Kodytek - mail
Dobry den,
podobny problem sem resil na localhoste a pomohlo mi pouzit $_SERVER["REQUEST_URI"].
9.5.2005 18:07:18 - Segeda - mail
2 Segeda: IIS prave $REQUEST_URI nevraci, proto jsem se zde polozil dotaz. Nakonec jsem problem vyresil, castecne i tak, jak pise Petr Kodytek. Je to dost nestandardni ale funguje to:
$url = substr ($_SERVER['QUERY_STRING'],4);
IIS sice nevraci REQUEST_URI ale nastesti vraci QUERY_STRING, jenz ovsem krome URI obsahuje i HTTP hlavicku (resp. vystupni kod napr. 200, 403, 404...). Ten proto pro tento ucel orezavam pomoci fce substr.
9.5.2005 19:02:59 - Michal Pelikan - mail
cUJEWp Hi Rabzebuddy! Google.
28.1.2008 03:55:06 - Kakerbuff - mail
cUJEWp Hi Rabzebuddy! Google.
28.1.2008 03:56:06 - Kakerbuff - mail
cUJEWp Hi Rabzebuddy! Google.
28.1.2008 03:56:29 - Kakerbuff - mail
cUJEWp Hi Rabzebuddy! Google.
28.1.2008 03:57:23 - Kakerbuff - mail
tb4i8Q Hi Rabzebuddy! Google.
28.1.2008 04:00:11 - Kakerbuff - mail
tb4i8Q Hi Rabzebuddy! Google.
28.1.2008 04:00:50 - Kakerbuff - mail
tb4i8Q Hi Rabzebuddy! Google.
28.1.2008 04:01:34 - Kakerbuff - mail
XDMaSe Hi Rabzebuddy! Google.
28.1.2008 04:01:58 - Kakerbuff - mail
XDMaSe Hi Rabzebuddy! Google.
28.1.2008 04:02:47 - Kakerbuff - mail
XDMaSe Hi Rabzebuddy! Google.
28.1.2008 04:03:49 - Kakerbuff - mail