ugrás a tartalomhoz

(egy újabb) URL Rewrite

whiskey · 2010. Dec. 27. (H), 08.31
Sziasztok!

URL rewrite problémával fordulok hozzátok, látom van egy rakással fórumon is, de valahogy mégsem találok megoldást a saját problémámra benne.
Olvasgattam jó pár oldalt, meg apache dokumentációt (átugorva néhány részt, DNS-sel stb.-vel kapcsolatosan), de sehol sincs hasonló.

A helyzet a következő:
xxxx.xx/index.php?n=alma&o=szilva&p=körte URL-ből próbálkoznék xxxx.xx/index/alma/o-szilva/p-körte URL-t csinálni egy kis csavarral:
a paraméterek elhagyhatóak, és felcserélhetőek (kivéve az első, ami a file-t adja meg, értelemszerűen).
Tehát így is mennie kéne:
xxxx.xx/index/alma/p-körte
xxxx.xx/index/p-körte/o-szilva
xxxx.xx/index/alma/
stb...

Kérdeztem máshol (ahonnan valójában ide irányítottak :)), azt a tanácsot kaptam, hogy csináljak több feltételt.

A kérdés/kérés, hogy tudnátok-e nekem valami irányadó példát mutatni, vagy linket ahol találok megoldást.
Ereg mindig elkerülte a mancsaimat, nem értek hozzá különösebben, illetve rewrite_mod-hoz is csak annyit, amennyit felfogtam az oldalakból amiket olvastam. A hangsúly valójában a paraméterek felcserélhetőségén, és elhagyhatóságán lenne.

Üdvözlettel,
Whiskey
 
1

Konkrét

whiskey · 2010. Dec. 27. (H), 08.38
Természetesen konkrét megoldásnak is örülök ;)
2

rewrite máskép

olomhuszar · 2010. Dec. 27. (H), 11.59
Én olyan rewritot használok, hogy .htacessel imndent az indexre irányítok, és ott a request uri-t explode-olgatom.
PHP-ban ugye annyi, olyan feltételt csinálok, amilyet akarok.
Persze csak arra kell figyelni, hogyha nem létező oldalt akar lekérni, akkor beállítsuk a 404-es headert.
3

Akkor most mi legyen? :(

whiskey · 2010. Dec. 27. (H), 12.50
Jelenleg így van (rewrite nélkül, sima GET-tel: ?p=ABC&....), de azt tanácsolták, hogy mindent külön fileba írjak. Igaz, gondoltam rá, hogy így lenne a legegyszerűbb.
Mindenki összezavar :<

(Többek között) SEO miatt kellene/kellett volna eltérő fileokba írnom (igaz, ezt indexszel is meg tudnám oldani...)
Akkor azt mondod, értelmetlen ott hagynom az index.php-s megoldást?
4

index.php-ra mindent, szerintem ja

olomhuszar · 2010. Dec. 27. (H), 13.55
No akkor kicsit konkrétabban, szerintem:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php
így minden az index.php-n dolgozódik fel.
Javaslok valami mást adatpárok össszekötésére, mint -.
xxxx.xx/alma/o=szilva/p=körte

$link = explode("/",$_SERVER['REQUEST_URI']);
foreach($link as $elem)
{
$elem=explode("=",$elem);
$myGet[$elem[0]]=$elem[1];
}
így a myget ugyanaz mintha getterelnél.
A probléma ugye annyi, hogy mivel index.php-d van, így automatikusasn 200as headered van.
Így hogyha feldolgozoásnál látod, hogy nincs az adatbáziban, vagy a megfelelő helyen a tartalom, akkor:

header("HTTP/1.0 404 Not Found");
Igazából kérdés számomra, hogy ez szemantikailag jó megoldás-e, de a webmastertools szerint minden jó.
5

Hibakezelés

whiskey · 2010. Dec. 27. (H), 17.33
Tehát ebben az esetben figyelni kell mindig a kettőskeresztes részeket az url-ben?

A Te megoldásod (REQUEST_URI) miért jobb, mintha ez GET változóba pakolná az adatpárokaat?
6

Mert

Poetro · 2010. Dec. 27. (H), 18.13
Mert a mod_rewrite modul nem túl intelligens, azaz nem igazán programozható. Viszont PHP-ben már úgy kezeled a kapott paramétereket, ahogy te szeretnéd. Azaz szétdobálod a / jelek mentén, majd akár a $_GET tömb elemeit is feltöltheted, ha az számodra szimpatikus.
7

félreértettél

whiskey · 2010. Dec. 28. (K), 13.03
Úgy értettem, hogy ez: index.php/abc/a-bc/b-ac miért jobb ennél: index.php?x=abc/a-bc... ?
8

nem egyértelmű

Poetro · 2010. Dec. 28. (K), 15.25
Nem igazán egyértelmű, hogy miért lenne jobb az egyik a másiknál, ugyanis amit te eredetileg szeretnél azt a mod_rewrite nem tudja, de van kerülőút.
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>
Ezek után az index.php-ban:
<?php
if (isset($_GET['q']) && is_string($_GET['q'])) {
  foreach (explode('/', $_GET['q']) as $index => $frag) {
    $item = explode('-', 2);
    if (count($item) == 2) {
      $_GET[$item[0]] == $item[1];
    }
    else if (index == 0){
      $_GET['n'] == $item[0];
    }
    else {
      header('HTTP/1.0 400 Bad request');
      die('Helytelen argumentum');
    }
  }
}
?>
És innentől kezdve használhatod azokat, amiket leírtál a kérdés feltevésben, azaz a $_GET['n'], $_GET['o'], $_GET['p'].
9

ok

whiskey · 2010. Dec. 28. (K), 16.45
Értem, de fölöslegesen ne fáradozz. Ha mindegy, akkor nekem jó az első is.
Munkára fel :)
10

köszönöm

whiskey · 2010. Dec. 29. (Sze), 18.19
Köszönöm a segítséged, kis javítgatással sikerült elérnem amit szerettem volna :) ♥
11

relatív

Poetro · 2010. Dec. 29. (Sze), 18.22
Hivatkozni mindig relatív kell, azaz /a/b/c stb., de mindig / jellel kell, hogy kezdődjön. A domain-t illetve a protokollt nem kell megadni. Attól lenne az URL abszolút. Amit még szintén megtehetsz, hogy használsz <base> elemet, de nem hiszem, hogy ez könnyebbé tenné az életed.
12

gyors

whiskey · 2010. Dec. 29. (Sze), 21.13
Amint elküldtem, nekem is leesett. De azért köszi :) Én voltam hülye