PHP čriepky - Užívateľsky prívetivé URL

07.11.2007 17:09 | blackhole

V drevených dobách Internetu urobila nasledujúca URL adresa na človeka veľký dojem:
www.something.com/category/php/date-types

Návštevník tak ľahko odvodil, že obsah webu je rozdelený do kategógii, navyše tí skúsenejší sa takto môžu po webe pohybovať priamo manipulovaním s URL.

V súčasnej dobe takáto forma už nie je zvláštnosťou, ale ešte aj dnes sa možete stretnúť so stránkami, kde jednotlivé odkazy majú formu ako je tá nasledujúca
www.something.com/category.php?category=17&id=5

Dĺžka takejto URL môže pri zložitejších aplikáciách narásť na omnoho dlhší výraz, takže nie je možné si takúto adresu zapamätať. Oproti tomu, pri prvej forme je možné zapamätaním niekoľkých slov navštíviť svoju obľúbenú stránku priamo, bez zdĺhavého preklikávania sa k cieľu. Okrem toho je pekná forma URL značným prvkom SEO a takýto web sa umestňuje vo výsledkoch vyhľadávačov na výrazne lepších pozíciách. Zdá sa teda, že užívateľsky prívetívé URL sú jedným z prvkov úspešného webu.

Ako však dosiahnúť takúto funkcionalitu a pritom predať skriptu požadované premenné? A okrem toho, ako bude vedieť server Apache, ktorý skript má obslúžiť, keď vezmeme do úvahy, že umiestnenie category/php/date-types sa v štruktúre dokumentov serveru vôbec nenachádza? Pravda je taká, že server Apache si ľahko poradí s oboma problémami. Málo známou vlastnosťou Apache je schopnosť pozerať sa späť (lockback), ktorá sa pokúsi nájsť vhodný cieľ, ktorý požiavku obslúži. Poďme sa spolu pozrieť ako to funguje na konktétnom príklade.

Predpokladajme teda, že Apache obdrží požiadavku vo forme užívateľsky prívetivej URL, o ktorej vieme že sa v štruktúre dokumentov nenachádza. Ak je pozeranie späť zapnuté, tak server po tom čo zistí, že v danej lokalite nie je žiadny indexový súbor, sa skutočne začne "pozerať späť" a hľadať príhodný cieľ. Pokúsi sa teda najskôr nájsť súbor date-types. Keďže ten nenájde, postupuje po adrese späť a pokúsi sa nájsť súbor php.
www.something.com/category/php/

A pretože ani teraz nenájde vhodný cieľ celý proces zopakuje s adresou
www.something.com/category/

Server sa pokúsi nájsť súbor category a tentokrát bude úspešný a nájde súbor category.php a tomu predá požiadavku na spracovanie. Zvyšná časť URL sa priradí do superglobálnej premennej
$_SERVER['PATH_INFO']

V našom príklade jej obsah teda bude
/php/date-types

Dostali sme sa tak ku potrebným parametrom a môžeme návštevnikovi zobraziť požadovaný obsah. Aby sme boli schopní tieto vlastnosti Apache využívať, budeme pravdepodobne musieť upraviť konfiguráciu servera. Schopnosť pozerať sa späť je ovládaná troma konfiguračnými direktívami: AcceptPathInfo, Files a ForceType.

Files
Direktíva files je kontajnerom, ktorý združuje ostatné direktívy a ovplyvňuje správanie servera ku konkrétnemu súboru/súborom.

<Files file_name>
  ...
  ... ostatne direktivy
  ...
</Files>

O využití tejto direktívy sa dočítate ďalej.

ForceType
Táto direktíva sa zvyčajne používa v súčinnosti s Files. Serveru tak vravíme s akým MIME typom má servnúť súbor, ktorý vyhovuje nadradenej direktíve Files. Napr. môžeme server donútiť poslať súbor nejaky_obr.jpg s MIME typom text/plain. Takto sa obrázok v prehliadači nezobrazí ako bežné JPGčko, ale browser zobrazí jeho textovú interpretáciu

<Files nejaky_obr.jpg>
  ForceType text/plain
<Files>

Direktíva prichádza ku slovu v momente, keď sa chceme zbaviť jednej nepríjemnosti v naších URL. Bez jej pomoci by všetky užívateľsky prívetivé URL museli mať formu
www.something.com/category.php/php/data-types

Abu sme obmedzili prítomnosť (a nutnosť používať) prípony .php, vytvoríme súbor category (bez prípony), do ktorého umiestnime PHP príkazy a server Apache nastavíme pomocou direktívy ForceType tak, aby tento súbor obslúžil ako skript PHP.

<Files category>
  ForceType application/x-httpd-php
</Files>

AcceptPathInfo
Direktíva AcceptPathInfo je kľúčovou komponentou schopnosti Apache pozerať sa späť. Ak je zapnutá, Apaché vie že nemusí požiadavku mapovať na konkrétny cieľ, ale začne prehľadávať požiadavku späť po URL a po nájdení vhodného cieľa mu zvyšnú časť URL zprístupní v premennej PATH_INFO. Direktívu je vhodné nastaviť pre konkrétne umiestnenie, kde bude pozeranie späť fungovať. Napr. ak chceme zapnúť funkciu lookback v celom DocumentRoot, nastavíme ju takto

<Directory />
  AcceptPathInfo On
<Directory>

Mnohí z vás však nemajú prístup ku konfiguračným súborom webového servera. Môžete tak napr. požiadať administrátora servera aby vám požadované direktívy pre váš DocumentRoot nastavil. Direktíva AcceptPathInfo je však na väčšine hostingov už defaultne zapnutá a pozeranie späť by malo fungovať bez zásahu do konfigurácie servera. Direktívy Files a Forcetype je však vhodné nastavovať (a zapísať) do súboru .htaccess, ktorý umiestnite do vašej koreňovej zložky na serveri. Nemusíte tak kontaktovať administrátora, vždy keď si zmyslíte zmeniť meno skriptu, ktorý bude obsluhovať požiadavky napr. na blog. Používanie .htaccess však musí byť serverom povolené (jedná sa o prepisovanie nastavení direktiv v hlavnom konfiguračnom súbore), musí byť teda zapnutá direktíva (opäť pre danú lokalitu, kde má mať direktíva účinnosť) AllowOverride. Aj tu je dobrou správou, že väčšina komerčných a aj niektoré free hostingy majú použitie súboru .htaccess povolené.

Zlepenie skladačky
Predpokladajme teda, že pozeranie späť je zapnuté v hlavnom konfiguračnom súbore servera. V lokalite, kde chceme umiestniť našu aplikáciu (najpravdepodobnejšie to bude priamo koreňová zložka, ktorú nám hosting pridelil) si vytvorte súbor .htaccess s nasledujúcim obsahom

<Files blog>
  ForceType application/x-httpd-php
</Files>
<Files category>
  ForceType application/x-httpd-php
</Files>
<Files news>
  ForceType application/x-httpd-php
</Files>

PHP kód ktorý sa postará o obsluhu požiadavky umiestnite do súborov blog, category a news (opäť pripomínam, že sú bez prípony .php). Napr. do súboru category umiestnite tento kód
<?php
  echo $_SERVER['PATH_INFO'];
?>

Po zadaní URL adresy (platí pre lokálny web server)
127.0.0.1/category/programovanie/php

tak browser zobrazi výsledok
/programovanie/php

Informáciou v premennej PATH_INFO musíme ďalej spracovať aby sme sa dostali ku potrebným parametrom. Využijeme štandardné funkcie PHP list() a explode(). Pridajte kód

<?php
  list($category, $id) = explode("/", $_SERVER['PATH_INFO'];
?>

V premenných $category a $id nájdete potrebné parametre, ktoré môžete použiť napr. na vydolovanie článku z databázy.

    • Re: PHP čriepky - Užívateľsky prívetivé URL 07.11.2007 | 21:49
      Avatar y   Používateľ

      zaujimave, avsak v com je to lepsie oproti mod_rewrite, ktory riesi vsetko na jednom mieste?
      ==
      program je nastroj na dosiahnutie ciela, nie ciel samotny.

      == Don't buy drugs...Become a pop star and get them for free!
      • Re: PHP čriepky - Užívateľsky prívetivé URL 07.11.2007 | 22:32
        Avatar blackhole   Návštevník

        Tiez si myslim, ze mod_rewrite je vhodnejsi, ale tento sposob sa mi zda byt viac handy na mensie stranky.

        ==
        Ved to zakomentuj, uvidime co sa zrube.

        • Re: PHP čriepky - Užívateľsky prívetivé URL 07.11.2007 | 22:50
          Avatar blackhole   Návštevník

          Tak tak, je to idealne ako zacat s kodenim aplikacii s takymito URL. Orem toho mi islo o poskytnutie infozz, co Apache2 dokaze a ani sa o tom nevie.

          BTW, mod_rewrite je obcas zakazany (nie je loadnuty modul) a jeho syntax/pouzitie nie je take priamociare ako pri lookback.

          ----------------------
          Ja len v dobrom.

          • Re: PHP čriepky - Užívateľsky prívetivé URL 07.11.2007 | 23:16
            Avatar y   Používateľ

            to hej, ale kto sa boji (a nevie regexp) nech nejde do lesa ;-) inac, ak je povolena uprava .htaccess, tak je skoro vzdy povolena zmena mod_rewritu (popravde to ani na ine veci okrem error dokumentov nepouzivam...)
            ==
            program je nastroj na dosiahnutie ciela, nie ciel samotny.

            == Don't buy drugs...Become a pop star and get them for free!