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


Komentáře

  1. To je šílený
    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
  2. re : To je šílený
    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
  3. $request_uri
    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
  4. $request_uri
    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
  5. Nahrada za $REQUEST_URI
    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
  6. RE: Nahrada za $REQUEST_URI
    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
  7. RE: Nahrada za $REQUEST_URI
    Dobry den,
    podobny problem sem resil na localhoste a pomohlo mi pouzit $_SERVER["REQUEST_URI"].
    9.5.2005 18:07:18 - Segeda - mail
  8. RE: Nahrada za $REQUEST_URI
    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
  9. FsQMdJkItHzKOAMcyWO
    cUJEWp Hi Rabzebuddy! Google.
    28.1.2008 03:55:06 - Kakerbuff - mail
  10. FsQMdJkItHzKOAMcyWO
    cUJEWp Hi Rabzebuddy! Google.
    28.1.2008 03:56:06 - Kakerbuff - mail
  11. FsQMdJkItHzKOAMcyWO
    cUJEWp Hi Rabzebuddy! Google.
    28.1.2008 03:56:29 - Kakerbuff - mail
  12. FsQMdJkItHzKOAMcyWO
    cUJEWp Hi Rabzebuddy! Google.
    28.1.2008 03:57:23 - Kakerbuff - mail
  13. oXrChbFloFweXpI
    tb4i8Q Hi Rabzebuddy! Google.
    28.1.2008 04:00:11 - Kakerbuff - mail
  14. oXrChbFloFweXpI
    tb4i8Q Hi Rabzebuddy! Google.
    28.1.2008 04:00:50 - Kakerbuff - mail
  15. oXrChbFloFweXpI
    tb4i8Q Hi Rabzebuddy! Google.
    28.1.2008 04:01:34 - Kakerbuff - mail
  16. FUEeolsOvApo
    XDMaSe Hi Rabzebuddy! Google.
    28.1.2008 04:01:58 - Kakerbuff - mail
  17. FUEeolsOvApo
    XDMaSe Hi Rabzebuddy! Google.
    28.1.2008 04:02:47 - Kakerbuff - mail
  18. FUEeolsOvApo
    XDMaSe Hi Rabzebuddy! Google.
    28.1.2008 04:03:49 - Kakerbuff - mail


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

Dovolená VI

12.7.2007

Dovolená V

12.7.2007

Dovolená IV

archiv

Vyhledávání

Na tomto serveru hledá Google.


Počasí v Brně

16°C
žádná oblačnost