Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!
Spis treści

Spis treści

O autorze

O autorze

Grzegorz (scanner) Tlołka
Reklama

Reklama

Podobne Artykuły

Poniżej znajduje się lista podobnych artykułów:
Brak powiązanych artykułów

Przyjazne URLe

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.

Wstęp

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.

PATH_INFO

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.

ForceType

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.

ForceType application/x-httpd-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.

Rada:

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.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (10)
ForceType
Piątek 09 Styczeń 2009 4:52:25 pm - dreemus

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 ModRewrite
Środa 26 Wrzesień 2007 3:51:04 pm - likemandrake <likemandrake_at_o2.pl>

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

AcceptPathInfo off
Niedziela 25 Marzec 2007 12:23:22 pm - drg <pawel_at_intersim.pl>

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

Mod_rewrite i MySQL
Piątek 12 Styczeń 2007 1:04:12 am - mokry <mokrus_at_gmail.com>

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 ;)

Czy aby napewno bez modyfikacji?
Poniedziałek 11 Wrzesień 2006 11:02:22 am - djonik <dominnik.jonik_at_gmail.com>

"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ę?

inna metoda
Wtorek 29 Sierpień 2006 8:52:44 am - spanner

innym sposobem wg mnie jeszcze prostrzym i chyba nawet bardziej efektownym jest zrobienie regół moda rewrite w apachu

Super!
Niedziela 16 Lipiec 2006 5:05:52 pm - zombie

Niesły patent. Już przerobiłem 2 strony. :)

niezłe
Wtorek 07 Marzec 2006 1:24:25 pm - palik

podoba mi się prostota rozwiązania :)

Ale jak?
Czwartek 23 Luty 2006 8:58:41 pm - stasieniek <stas_krawczyk_at_poczta.onet.pl>

Ale jak ja mogę te zmienne wykorzystać? Nie rozumiem tego.

Thx
Środa 18 Styczeń 2006 12:01:21 am - kamil_w <kwdowicz_at_gmail.com>

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.

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2024 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System