ugrás a tartalomhoz

rewrite és // összeolvadásának elkerülése

razielanarki · 2007. Okt. 6. (Szo), 01.41
van nekem egy url-rew rite sémám:

www.valami.com/mappa/blog/tags/ - ez kilistázza az összes bejegyzést

valamint

www.valami.com/mappa/blog/tags/php - ez a "php" témájú bejegyzéseket
www.valami.com/mappa/blog/tags/php/2 - ezeknek a második oldala

ezek mind rewriteolódnak a következő formában:

www.valami.com/mappa/* -ról
www.valami.com/mappa/?q=* -ra

szeretném hogy a www.valami.com/mappa/blog/tags//2
az összes bejegyzés második oldalára mutasson, de átírt url-ben ?q=blog/tags/2 -lesz és a "2" témájú bejegyzéseket listázná...
(ilyenkor phpinfo-val a QUERY_STRING-ben url=blog/tags/2/ van, a REQUEST_URI-ban meg mappa/blog/tags//2)

de ha www.valami.com/mappa/?q=blog/tags//2 -vel hívom meg, akkor nem olvadnak össze a //-k, és megkapom a második oldalt

van-e erre valami trükk, vagy inkább érdemes másképp megoldani a lapozás urljét?
(van még egy plusz csavar is: a valami.com/mappa/blog url a "hírek" témájú bejegyzésket listázza)

a .htaccess:
<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteBase /mappa/

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteRule ^(.*)$ ?q=$1 [QSA,L]
</IfModule>
 
1

Másképp...

janoszen · 2007. Okt. 6. (Szo), 12.35
Semmiképp nem érdemes ilyesmire építeni, hiszen nem tudod mikor dönt egy böngésző úgy, hogy egy elgépeltnek vélt URLt kikorrigál.

Ilyenkor vagy gondolkozz el azon hogy kell-e lapozás vagy találj megoldást rá. Két lehetséges megoldás:

- Megnézed, van-e trailing slash (/ a végén) és annak függvényében oldal vagy bejegyzés
- Közös címtér-kezelést vezetsz be, ami el tudja dönteni hogy egy URL mihez tartozik (nyilván nem lehetnek ütközések)

Az utóbbit egyébként is erősen javaslom, a bedrótozott URL-ek sose jók.
2

egyenlőre" megoldottam"

razielanarki · 2007. Okt. 6. (Szo), 14.39
most rewrite esetén a REQUEST_URI-t parseolom, a GET['q'] helyett...
if (MOD_REWRITE)
{
    $segs = explode ('/', $_SERVER['REQUEST_URI']);
    while (end($segs) == '') array_pop ($segs);
    $segs = array_slice ($segs, substr_count($_SERVER['PHP_SELF'], '/'));
}
else
    $segs = explode ('/', $_GET['q']);
így mindkét esetben ugyanaz lesz a $segs tömb tartalma.

trailing slash mindig van (generálom az urleket is) csak elfelejtettem odaírni.

közös címtéren mit értesz, valami példát tudsz mondani/mutatni?
3

Egyszerű példa

janoszen · 2007. Okt. 6. (Szo), 14.43
Nagyon egyszerű példa a közös címkezelésre az lenne, hogy van egy tábla, amibe bevágod az URL-eket és a hozzájuk rendelt megjelenést. Így egyszerű egy cím azonosítása és nem is lehet ütközés. Egy baj van vele, ha valami változik, mondjuk átnevezel valamit, akkor lehet orrba-szájba frissíteni.

A kicsit bonyolultabb megoldás a hierarchikus adatkezelés c. cikksorozatban közöltekre egy URL kezelő rendszert építeni (ez a gyakorlatban nagyon bevállt nálunk).