Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przyjazne adresy w php bez htaccess
Forum PHP.pl > Forum > Przedszkole
marek71_33
Witam.
W bazie danych mam kolumny, z których pobieram przez zapytanie gotowe (z parametrami oraz skrócone) adresy do swoich stron, np:
adresowi artykuly.php?id_artykulu=10 odpowiada skrocony adres artykuly/tytul-artykulu.
Wszystkie adresy w htacces mam przekierowane do skryptu w pliku seo.php
CODE
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) seo.php/$1 [L]

I teraz mam problem jak zrobić przekierowanie. Pomysły mam dwa:
  1. <?php
  2. $baseUrl = 'http://domena';
  3. $pathInfo = $_SERVER['PATH_INFO'];
  4. if($pathInfo == '/artykuly/tytul-artykulu'){
  5. $_GET['id_tekst'] = 10;
  6. require_once 'tekst.php'; // lub include_once
  7. }
  8. else echo 'Nie ma takiego adresu';
  9.  
  10. ?>

lub
  1. <?php
  2. $baseUrl = 'http://domena';
  3. $pathInfo = $_SERVER['PATH_INFO'];
  4. if($pathInfo == '/artykuly/tytul-artykulu'){
  5. $str = file_get_contents('http://domena/artykuly.php?id_artykulu=10');
  6. print $str;
  7. }
  8. else echo 'Nie ma takiego adresu';
  9.  
  10. ?>

Oczywiście to podstawowa forma tych skryptów bez zabezpieczeń itp.
Moje pytanie jest, które rozwiązanie będzie lepsze wydajnościowo i ze względu na bezpieczeństwo strony? A może ktoś podsunie inne rozwiązanie?
kreatiff
Możesz szukać po slugach w bazie, ale jednak szukanie po liczbach całkowitych jest szybsze. Chociaż dla strony z małą ilościa rekordów (kilkaset) nie będzie to miało znaczenia, bo różnice będą pomijalne.

Ogólnie zrobiłbym to tak. Każdy artykuł miałby nadanego w bazie sluga i id.
Link składałby się z np.: artykuly/10-tytul-artykulu
10 to nasz id artykułu, tytul-artykulu to slug.
I po tej 10 szukałbym w bazie artykułu, przy okazji poprawiając tytuł (slug) jak się nie zgadza by uniknąc duplikatów.

I zapominasz całkiem o GET i przepisywaniu URLi ze zmiennymi na "przyjazne linki".

Wystarczy jakiś prościutki ruterek (nawet preg_match), który będzie rozpracowywał całe REQUEST_URI. Jak pasuje do wzoru -> szukamy w bazie, jak nie -> 404.
Albo skorzystaj z czegoś gotowego, np.: http://upshots.org/php/php-regexrouter

Acha, i jeszcze kierujemy w .htaccess cały ruch na index.php.
marek71_33
kreatiff Twój pomysł jest fajny, ale zależy mi na tym, żeby pozbyć się cyfr z adresu. A to co ja napisałem jest możliwe do użycia?
kreatiff
Możesz i owszem pozbyć się cyfr. Wówczas od razu w bazie szukasz całego "tytul-artykulu" i jak jest, to wyświetlasz artykuł z nim związany. Wówczas nawet id tego artykułu jest Ci niepotrzebne. Ale to jest właśnie rozwiązanie, dla małej ilości artykułów w bazie. Bo gdy jest ich więcej, to wydajność wyszukiwania artykułu zacznie wyraźnie spadać w porównaniu do rozwiązania liczbowego.

W Twoim rozwiązaniu nie rozumiem w ogóle po co są GETy w kodzie. Ich już nie używasz wcale, bo nikt nigdy nie wejdzie w link domena/artykuly.php?id_artykulu=10 (bo go nigdzie nie znajdzie).
Ktoś wchodzi na stronę: domena.pl/tytul-artykulu, czy to z wyszukiwarki, czy innego miejsca, i skoro nie ma w tym URLu żadnego ID, to nie ma sensu go szukać. Tylko od razu po całym tytule (czyli ten nasz tzw. slug) szukamy artykułu w bazie, czy też includujemy plik tekstowy odpowiadający temu artykułowi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.