Pěkná URL bez mod_rewrite
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?
Věroš:
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).

Petr 'PePa' Pavel:
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
Jakub Hejda:
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 :-)

Jakub Hejda:
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.

Jakub Vrána
:
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


Pavel:
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").

Jakub Vrána
:
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_rewritePetr 'PePa' Pavel:
No, to funguje právě tehdy, když máš povoleno AcceptPathInfo. To není všude, protože to zpomaluje (asi tak jako povolený .htaccess).
Techi:
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

Srigi:
Na tuto temu so napisal mensi tutorial. Neviem ci je to presne ono, ale $_SERVER['PATH_INFO'] vyuzivam.
http://blackhole.sk/topicphp-criepky-uzivatelsky-privetive-url
spaze:
Celkem pěkně se dá taky použít mod_alias:
Alias /store "/home/htdocs/example.com/store/index.php"

Jakub Vrána
:
Nebo rovnou DocumentRoot.


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.

