Jak wyglądają adresy skryptów PHP wie każdy. Jest to ciąg mało zrozumiałych znaczków, które nie dość, że brzydko wyglądają, to jeszcze nie są poprawnie indeksowane przez większość wyszukiwarek. Istnieją na szczęście sposoby, aby pozbyć się owych niedogodności, stosując techniki tzw. NiceURL. Techniki te wymagają, co prawda pewnych specyficznych ustawień serwera WWW, jednak ustawienia te powinno się dać uzyskać nawet na darmowych serwerach.
Standardowy adres internetowy skryptu PHP wygląda dość nieciekawie.
http://localhost/index.php?zmienna1=wartosc1& zmienna2=wartosc2&zmienna3=wartosc3
Zlepek pytajników, ampersantów (&) i jakiś wyrazów. Całość przypomina bardziej efekt przejścia kota po klawiaturze niż coś, co zwykły śmiertelnik może zapamiętać i powtórzyć koledze w tramwaju. Nie pozostaje nam zatem nic innego, jak tylko poszukanie sposobu, na uczłowieczenie naszych linków. Jednym ze sposobów, jakie widziałem jest tworzenie dość skomplikowanego drzewa katalogów, w stylu:
W każdym z katalogów jest plik index.php, który includuje odpowiednie pakiety z "lokalizacji głównej". Efektem tego rozwiązania jest url w stylu:
http://localhost/firma/kontakt
I byłoby to rozwiązanie idealne, gdyby nie... Niewygoda w tworzeniu takiej aplikacji, polegająca na tym, że w każdym katalogu musimy includować "główny engine" a dodatkowo próba przekazania jakiejkolwiek wartości poprzez URL ($_GET) znowu doprowadza nas do punktu wyjścia. A skoro tego właśnie chcemy uniknąć, więc nie pozostaje nam nic innego, jak rozważenie kolejnych metod.
Najprostrzym i niewymagającym żadnych modyfikacji sposobem na uzyskanie przyjaznych adresów jest użycie zmiennej globalnej PATH_INFO. Załóżmy, że wpiszemy w pasek adresowy przeglądarki adres w takiej formie:
http://localhost/index.php/wartosc1/wartosc2/wartosc3
oraz stworzymy plik index.php o treści:
<?php echo $_SERVER['PATH_INFO']; ?>
Efektem połączenia linka i pliku będzie napis w przeglądarce:
/wartosc1/wartosc2/wartosc3
Mamy więc ładnie podane parametry działania skryptu. Uważni czytelnicy zauważyli, że pozbywamy się w tej sytuacji jawnego określenia nazw zmiennych, do których powyższe wartości powinny trafić, nie ma także nic w zmiennej $_GET. Zatem już widać, że ważna jest kolejność wartości, jakie podajemy w URLu. Nie wiemy jeszcze, co zrobić z tymi wartościami. Zmodyfikujmy zatem nasz plik:
<?php $arrParams = array(); $strDefaultPath = '/newsy/pokaz/strona/1'; $_SERVER['PATH_INFO'] = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : $strDefaultPath; $arrParams = explode( '/', substr( $_SERVER['PATH_INFO'], 1) ); echo '<pre>'; var_export( $arrParams ); echo '<pre>'; ?>
Zasada działania skryptu jest prosta. Sprawdza on, czy ustawiona jest zmienna PATH_INFO. Jeśli nie, przypisywana jest do niej wartość domyślna. Następnie dzielimy PATH_INFO na elementy tablicy pomijając pierwszy ukośnik. Efektem jest ładna tablica parametrów, którą możemy wykorzystać w dowolny sposób, pamiętając tylko o tym, który indeks tablicy do czego służy. Zaletą tego rozwiązania jest to, że linki, które widać na początku są poprawnie indeksowane w wyszukiwarkach. Wadą natomiast jest konieczność zachowania porządku w parametrach skryptu. Wada ta jednak dla dobrego programisty jest praktycznie niewidoczna.
W powyższym rozwiązaniu jest jedna mała niedogodność. Widać rozszerzenie pliku zawierającego skrypt. Możemy to zlikwidować, jeśli tylko mamy możliwość zmiany właściwości plików wykorzystując plik .htaccess. Odpowiedzialna za to jest dyrektywa AllowOverride konfiguracji serwera WWW. Jeśli jest ona ustawiona (w sekcji <Directory> serwera lub Twojego VHosta) na wartość FileInfo, pozwala to nam na modyfikację sposobu traktowania niektórych plików przez serwer.
Stwórzmy plik, o nazwie .htaccess, który poinformuje serwer WWW, iż plik o nazwie sklep nie posiadający rozszerzenia należy traktować tak, jak każdy inny plik php. (Dokładny opis pliku .htaccess wykracza poza ramy niniejszej porady). Plik ten powinien się znaleźć tam, gdzie zapisaliśmy wcześniej powyższy index.php.
Zmieńmy nazwę naszego wcześniej napisanego index.php na sklep bez rozszerzenia, i wpiszmy w przeglądarkę adres:
http://localhost/sklep/promocja/pokaz/123
I jak się wam podoba takie podejście do sprawy? Czytelniejszych URLi w tak prosty i osiągalny chyba na większości serwerów sposób nie uzyskacie. Oczywiście istnieją inne metody, jednak mogą one wymagać ingerencji w instalację serwera WWW.
Jako ciekawostkę podam, że ukośniki (poza pierwszym) można zamienić na inny znak, uzyskując URLe o postaciach takich jak poniżej. Pamiętać tylko należy o tym, że takie adresy ponownie mogą być żle indeksowane przez wyszukiwarki.
U mnie ForceTyp wyświetla dosłownie wszystko co chce, aby parser PHP zamienił na jakiś wynik. W skrócie, tam gdzie miało być coś, nie ma nic ... Nawet "include" nie działa ...
Najlepiej problem rozwiązać przez użycie moda Rewrite, z uwzględnieniem w skrypcie tego, że może on być niewłączony, a linki należy generować dynamicznie...
Np. jeśli mamy modRewrite włączony, to generujemy link typu http://localhost/newsy, a jesli wyłączony - http://localhost/index.php/newsy i po sprawie.... A jak taki link wygenerować? Najlepiej stworzyć skrypt testowy, w którym wyświetlimy całą zawartość tablicy $_SERVER, następnie przekazywać wymyślone linki (rządania) w przeglądarce do skryptu w obu przypadkach, wtedy zadecydować, co przyda nam się z tablicy $_SERVER
Warto jednak wspomnieć o sytuacji, w której może się okazać, że - z różnych względów - administrator serwera ustawił zmienną AcceptPathInfo (w przypadku Apache2) na off, co spowoduje niemożliwość zastosowania tego rozwiązania (użytkownik otrzyma 404). Warto więc pamiętać o tym i sprawdzić czy taka sytuacja ma miejsce - jeżeli ma, jednym z rozwiązań jest użycie $_SERVER['QUERY_STRING'] i zmiana w linkach pierwszego separatora z ,,/'' na ,,?'':
http://localhost/index.php?wartosc1/wartosc2/wartosc3
Rozwiązanie stosuję w swoich projektach już stosunkowo długo... Dla pewnych osób zapewne jest problemem ustawiać nowe reguły w .htaccess
Jak to rozwiązać? Ja mam treść .htaccessa w bazie danych MySQl, i w razie każdej aktualizacji, zawartość pliku jest podmieniana. Bez logowania sie na ftp, z poziomu CP... Wygoda ;)
"Najprostrzym i niewymagającym żadnych modyfikacji sposobem na uzyskanie przyjaznych adresów jest użycie zmiennej globalnej PATH_INFO."
Ale jednak trzeba modyfikować URLe, trzeba je napisać "pod" PATH_INFO, mam rację?
innym sposobem wg mnie jeszcze prostrzym i chyba nawet bardziej efektownym jest zrobienie regół moda rewrite w apachu
Ale jak ja mogę te zmienne wykorzystać? Nie rozumiem tego.
Ostatnio szukałem coś na ten temat, mój Vhost nie lubi .htaccess, a tu wydaje sie dobre rozwiazanie do SEO, nie sprawdzałem w praktyce ale czy nie jest najgorszym pomysłem ; aby nie przejmowac sie kolejnoscia ; umieszczanie jako nieparzystych nazwy parametrów a jako po nich następujących wartości ? można je później użlożyc w ładdego arraya asocjacyjnego.