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

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: Reakce na: Petr 'PePa' Pavel

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 :).
avatar © 2005-2022 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.