Pěkná URL bez mod_rewrite
Školení, která pořádám
Především kvůli vyhledávačům ale i kvůli lidem se ujalo vytváření URL bez zbytečných číselných identifikátorů, otazníků, teček a dalších speciálních znaků. Pod webovým serverem Apache se k tomu nejčastěji používá mod_rewrite, se kterým to je hračka. Co však v případě, kdy tento modul k dispozici nemáme? Pěkná URL jsou k dispozici i „pro chudé“.
Stačí k tomu v Apache nastavit direktivy Options MultiViews, MultiviewsMatch Handlers a AcceptPathInfo Default. Potom dotaz na /clanky/prvni
spustí skript clanky.php
a k hodnotě /prvni
se dostaneme v proměnné $_SERVER["PATH_INFO"]
. Volba AcceptPathInfo Default je výchozí, takže i bez změny konfigurace bude fungovat adresa /clanky.php/prvni
. Využívá toho např. MediaWiki stojící za Wikipedií.
Osobně se kloním spíše k tomu přepisovat všechny adresy na jeden skript, který se postará o zavolání patřičného kódu, snadno se potom řeší např. vícejazyčné stránky. V některých případech to ale nemusí být možné.
Diskuse
tark:
Měl jsem za to, že v dnešní době už je mod_rewrite naprosto všude.
kozotoč:
A počítáš do toho i free hostingy?
Kromě toho ještě poměrně elegantní cesta, jak obejít nemožnost nastavit pravidla pro mod_rewrite je použít ErrorDocument 404 :-)
Příjemné pro webhostera (nemusí dávat zákazníkům přístup k .htaccess) a rozumně použitelné pro zákazníka. Jako bonus odpadnou problémy s "proč mi nefunguje moje skvělé pravidlo" (následuje změť znaků, který vypadá, jako když vybuchne továrna na speciální znaky).
Takhle to jde taky, ale:
a) web server vrací 404, takže vyhledávací servery to nebudou indexovat a budou považovat tvůj web za zastaralé smetiště. I některé prohlížeče (co zobrazují svou 404) by ti mohly dělat problémy.
b) statistiky návštěvnosti z logu webserveru budou na prd
na Apache 2.0 stačí v PHP použít funkci header a vrací to hlavičku jakou chci. Věř mi, mně google vidí velice dobře :-)
URL pomocí 404 je fajn metoda, jednoduchá.
Ale Apache 2.2 ignoruje při použití chybové stránky 404 hlavičky header(), takže Vám bude automaticky vracet 404, not found a google vás nepřečte.
Apache 2.0 tohle nedělá, ten vrátí hlavičku přesně takovou jako mu stanovím funkcí header().
Např. na http://www.cesky-hosting.cz/technicke-informace.html by Vaše aplikace patrně běžěla pouze pod variantou PHP4, Apache 2.0.
Jestli se pletu, tak mi to prosím někdo vyvraťte a poraďte čím to je když né Apachem, tento problém jsem objevil cca. před rokem a nevím si moc rady.
Mě to funguje: <?php header("HTTP/1.1 200 OK"); ?>:
HTTP/1.1 200 OK
Date: Mon, 23 Jun 2008 18:32:49 GMT
Server: Apache/2.2.2 (Win32) PHP/5.2.3
X-Powered-By: PHP/5.2.3
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8
Problem patrne nezavisi na verzi apache, ale na provozovani PHP jako modulu nebo CGI. Podle http://cz.php.net/header je v pripade CGI nutne misto header("HTTP/1.0 200 OK") pouzit header("Status: 200 OK").
Ano, to je také možné řešení. Kromě nutnosti poslat stav 200 je nepříjemné taky plnění chybového logu Apache.
lukas ;):
Ja myslím, že tenhle problém je spíš na serverech, kde je něco jiného než apache, u hostingu se mi zatím nepovedlo narazit v poslední době na takový, kde by mod_rewrite nebyl .. co se týká složitých rewrite pravidel, mě (a nejen mě, tohle routování používá i třeba ZF) se osvědčil routing přes jeden soubor s vynecháním existujících souborů, což jsou 3 jednoduché řádky v htaccess...
miro:
ja som zistil, že keď použijete URL v tvare www.mojastranka.sk/index.php/controller/method/param-1/param-2 tak dostanete pekne URL bez mod_rewrite
No, to funguje právě tehdy, když máš povoleno AcceptPathInfo. To není všude, protože to zpomaluje (asi tak jako povolený .htaccess).
Zdá se mi to jako dost proprietární řešení. Tam kde neni mod_rewrite zas nebude admin takhle konfigurovat apache :)
To bych radši zůstal u varianty pro nejchudší ve tvaru
www.example.com/index.php/hezke/url
IMHO Apache bez mod_rewrite je jak auto bez volantu
spaze:
Celkem pěkně se dá taky použít mod_alias:
Alias /store "/home/htdocs/example.com/store/index.php"
Vojta:
Řešení přes 404 mi přijde jako dobrý nápad, ale osobně se mi tento přístup moc nelíbí - sice to funguje, ale takhle by se to prostě dělat "nemělo" :). Je to takové hackování, obcházení. To už je lepší sepsat nějakou petici a poslat ji webhosterovi :).
Diskuse je zrušena z důvodu spamu.