Wiele maszyn indeksujących strony internetowe nie lubi stron, w adresach których użyto znaki ? i &. Część maszyn napotykając taki adres swierdza że jest to strona dynamiczna i w związku z tym nie będzie jej wprowadzała do swojego indeksu. Co zatem zrobić aby przeskoczyć ten problem. Z pomocą przychodzi nam tutaj moduł mod_rewrite. Wklepując kilka linijek do pliku .htaccess w katalogu głównym naszej strony oraz modyfikując nieco główny plik strony - index.php, możemy spowodować, że naszą stronę będzie można przeglądać za pomocą adresów bez wykorzystania niechcianych znaków ?&.
Zacznijmy od początku. Na serwerze Apache 2.0 i nowszych wersjach jest domyślnie istalowany jest wspomniany moduł mod_rewrite. Jest to taki moduł, który możemy wykorzystać do tego aby pomóc nieco maszynom indeksującym naszą stronę internetową. Tak naprawdę dzięki temu modułowi możemy zmienić sposób przekazywanych parametrów metodą GET. Standardowo tą metodą przekazujemy parametry do skryptu przez takie wywołanie skryptu:
http://nazwa.serwera.pl/nazwa_pliku.php?param1=1¶m2=2¶m3=3
Gdybyśmy chcieli teraz te wartości przekazać bez wykożystania znaków ?& to musimy do tego uruchomić omawiany moduł. W tym celu do pliku .htaccess dokładamy takie oto linijki:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L]
Umieszczony kod spowoduje przekazanie wszystkiego co będzie znajduje się po adresie URL naszej do zmiennej $_GET['url'] w skrypcie index.php. Zanim przejdziemy do konstrukcji pliku index.php zastanówmy się w jakim formacie chcemy przekazywać zmienne. Osobiście postanowiłem sworzyć taką obsługęzmiennych, żeby użytkownik przeglądający moją stronę miał wrażenie, że wszystkie postrony są statyczne. Rozwiązanie to niesie za sobą sporo problemów związanych później z osadzaniem powiązań do innych podstron. Postaram się to omówić w dalszej części artykułu, a póki co pomimo umieszczonego takiego rozwiązania, polecam osobiście na zastosowanie jako separatora pomiędzy wartościami np.: przecinka, podkreślnika albo kropki. No dobra koniec tego. Napiszmy w końcu coś w naszym index.php.
if (eregi("([^0-9a-z/_.])",$v)) { die('Error 404!'); }
preg_match_all("([^/]+)",$v,$url);
$url=$url[0];
print_r($url);
Jak widzimy konstrukcja index.php nie jest bardzo skomplikowana. Po pierwsze: założyłem że w adesie url mogą występować tylko znaki z określonego zbioru. Czyli:
- cyfry,
- litery (małe i duże) z pominięciem ogonków,
- znaki specjalne: ukośnik, podkreślnik i kropka
Zastosowana tutaj funkcja eregi z warunkiem postaci ([^0-9a-z/_.]) sprwdza czy przekazany w ścieżce url napis jest właśnie tej postaci. Jeżeli nie to kończymy wykonywanie skryptu, zaś w przeciwnym wypadku idziemy do następnej linijki w której rozbijamy przekazany napis na tablicę konkretnych wartości odseparowanych nakiem ukośnika /. Procedura preg_match_all z odpowiednim warunkeim ([^/]+) spowoduje rozbicie napisu $v na tablicę wartości. Ponieważ procedura wstawia tak na serio jeszcze kilka innych wartości do tablicy $url musimy sobie okroić do interesującej nas części czyli $url[0];
Taraz już, gdy wywołamy taki adres za pomocą adresu:
na stronie powinniśmy otrzymać taki oto wynik: