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é.

Jakub Vrána, Dobře míněné rady, 23.6.2008, diskuse: 17 (nové: 0)

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?

ikona 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

ikona 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 :-)

ikona 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.

ikona Jakub Vrána OpenID:

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

ikona 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").

ikona Jakub Vrána OpenID:

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

Petr '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).

ikona 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

ikona spaze:

Celkem pěkně se dá taky použít mod_alias:

    Alias /store    "/home/htdocs/example.com/store/index.php"

ikona Jakub Vrána OpenID:

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

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.