ďťż

[php] Ukrywanie zmiennych w adresie modyfikacja/przeróbka skryptu

       

Podstrony


telcocafe

Mam kod, który jest odpowiedzialny za działanie tak zwanych "przyjaznych url", mam jednak pytanie dotyczące jego działania, a mianowicie czy można zrobić coś takiego, aby ukryć nazwy zmiennych w adresie? Chodzi mi o to żeby zamiast http://localhost/art.../id/455/name/30 (gdzie id i name to zmienne) było coś takiego - http://localhost/articles/fggfdg/iii. Jeśli, ktoś potrafi to niech pokaże jak to zrobić, co zmodyfikować, dopisać, z góry wielkie dzięki :D

Poniżej przykładowy kod skryptu, którego używam:
<?php define('BASE_URL', 'http://localhost/url/'); // this you must use as an absolute path to the application root, ex: /folder1/folder2/ if (isset($_SERVER['PATH_INFO'])) { $url = substr($_SERVER['PATH_INFO'], 1); $urlParts = explode('/', $url); if ($urlParts[count($urlParts) - 1] == '') array_pop($urlParts); $urlPartsCount = count($urlParts); if ($urlPartsCount % 2 != 0) { $urlPartsCount++; } for ($i = 0; $i < $urlPartsCount; $i += 2) { $_GET[$urlParts[$i]] = $urlParts[$i + 1]; } } $urlPatterns = array( '~'.preg_quote(BASE_URL).'([^\.]+).php(\?([ 0-9a-zA-Z]+[^#"\']*))?~i', ); ob_start(); echo "This is an article page<br>"; echo "article id:".$_GET["id"]; echo "<br>"; echo "article id:".$_GET["name"]; echo "<br>"; echo "article body: blah blah..."; ?> <? function urlRewriteCallback($match) { $extra = ''; if ($match[3]) { $params = explode('&', $match[3]); if ($params[0] == '') array_shift($params); foreach ($params as $param) { $paramEx = explode('=', $param); $extra .= $paramEx[0].'/'.$paramEx[1].'/'; } } return BASE_URL.$match[1].'/'.$extra; } $pageContents = ob_get_contents(); ob_end_clean(); echo preg_replace_callback($urlPatterns, 'urlRewriteCallback', $pageContents); ?>



Owszem, można. Jednak jest to autorski skrypt (nie spod twoich palców) i będzie trudno. No! chyba że jest to skrypt, który za adres przyjmuje tylko taki, jak podałeś, czyli id i nazwa artykułu. Wtedy nie byłoby problemu.
Twój skrypt przepisuje każdy URL przed wysłaniem do przeglądarki. Przykład: strona.pl/?id=1&name=5 zapisze jako strona.pl/id/1/name/5, a już strona.pl/?cos=x&id=1&name=5 da strona.pl/cos/x/id/1/name/5 i w tym przypadku nie przejdzie to, jak chcesz zrobić. Jeszcze raz. Gdyby skrypt był Twój, to co innego. Bo tak trzeba by siedzieć i się głowić gdzie co umieścić (wiadomo, że można by przeglądać też na przykład kategorie artykułów etc., a to już zmienia wygląd linków).

Skrypt nie jest mój to prawda, jest on zrobiony na podstawie tego co znalazłem na tej stronie może to coś pomoże, jeśli nie to proszę o linka do jakiegoś tutoriala gdzie jest opisane w jaki sposób wykonać podobny skrypt.

No to może krótka analiza
Nie chcesz linku http://localhost/art.../id/455/name/30 poniewaz pokazuje nazwy zmiennych. Ok da się zrobić ale pomyśl skąd teraz skrypt ma wiedzieć ze ta a nie inna zmienna jest ID a kolejna jest NAME? Załóżmy, że rozbijmy podany przez ciebie url http://localhost/articles/fggfdg/iii na tablice. Otrzymamy coś takiej
0:articles
1:fggfdg
2:iii

Pierwszy element nazwijmy sobie "moduł". Ponieważ nie wiemy ile bedziesz mial podstron i jak każda będzie działała to zakładam ze wartosc o indeksie 0 mówi nam jaki "moduł ma być wyświetlony.
Wiec robisz
$urlArray; // tablica z parametrami urla switch(strtolower($urlArray[0])) { case 'articles': $_GET["id"]=$urlArray[1]; $_GET["name"]=$urlArray[2]; break; // tam obsługa dalszych "modułów" }
I parametry masz dostępne w tablicy $_GET.

Nie napisze ci wszystkie co i jak bo:
1) Nie wiem jak tam wszystko dalej jest poukładane
2) Nie wiem jak wyglądają wszystkie linki u ciebie bo przeciez jak np nie bedzie ID tylko podany odrazu name to co wtedy?
3) Włóż własną inicjatywę w dalszą realizację

// EDIT Pominąłem zabezpieczenia typu sprawdzanie istnienia indeksu gdyż jasne jest ze trzeba samemu o to zadbać. Podałem tylko ideę mojej propozycji rozwiązania.
Użytkownik polasek edytował ten post 08 kwiecień 2008, 21:33


Thx Polasek chyba łapię o co biega ;) (zabezpieczenia i inne tego typu rzeczy rozumie się samo przez się, chodziło mi tylko o mechanizm działania).

Mam jeszcze jedno pytanie co do rozwiązania mojego problemu, czy może lepiej jest to zrobić(nie wiem tylko czy to możliwe :D) z poziomu .htacces? (zaznaczam że mam pełny dostęp do plików serwera, także modyfikacje plików konfiguracyjnych nie są problemem)

Mod rewrite http://home.pl/pomoc/kursy/rewrite

Polasek naaprawdę bardzo WIELKIE dzięki! Teraz mam seo-friendly URLs (testowałem na prostym przykładzie, ale myślę że na mojej stronie też zadziała) Kolejne piwo dla Ciebie! :cheers:

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.