|
Ładny adres URL, czyli...
...jak z:
Do uzyskania powyższego efektu użyjemy następujących składników:
Zanim przystąpimy do zmiany konfiguracji trochę opisu teoretycznego. Podając dowolną ścieżkę w adresie URL automatycznie powodujemy odczytanie odpowiednich danych z odpowiednich katalogów, zazwyczaj katalogi te widzimy w adresie tak jak i plik który chcemy wykonać (z wyjątkiem tego co zostanie zadeklarowane w DirectoryIndex) a więc aby nasz adres działał musimy tak ustawić serwer aby mimo tego co my wpiszemy czytał to co jest nam potrzebne. Tu z pomocą wkracza właśnie mod_rewrite. Więcej o jego możliwościach można poczytać na stronach apache: Za jego pomocą dokonamy małego tricku powodującego ignorowanie wszystkiego co zostanie wpisane po domenie. Oto kawałek konfiguracji VirtualHosta <VirtualHost 212.160.50.140> DocumentRoot /www/moj_serwis/ ServerName www.moja_domena.pl RewriteEngine on RewriteRule ^.*$ /www/moj_serwis/index.php [l] </VirtualHost> Jeśli wpisujemy to w pliku .htaccess to powinny wystarczyć linijki: RewriteEngine on RewriteRule ^.*$ /www/moj_serwis/index.php [l] Od teraz cokolwiek wpiszemy w URLu to i tak serwer zawsze zwróci nam wynik wykonania skryptu index.php z głównego katalogu naszego serwisu. Powiedzmy, że pół drogi zostało wykonane. Mamy ładny adres ale na razie nic z niego nie wynika bo ciągle widzimy to samo. Tu wkracza właśnie nasza aplikacja, dobrym rozwiązaniem jest napisanie małej biblioteki która będzie tłumaczyła nasz 'ładny' adres na 'przydatny' adres. Bibliotekę taką potem możemy includować* na początku pliku index.php nie martwiąc się już o parametry. Przykładowo:
<?php
$parametry = $_SERVER['PHP_SELF'];
$para = explode('/', $parametry);
foreach ($para as $p) {
$dane = explode('_', $p);
$MOJE_PARAMETRY[$dane[0]] = $dane[1];
}
?>
Po wykonaniu tego kodu** w naszym index.php otrzymamy następującą tablicę: MOJE_PARAMETRY = array ( ['parametr'] => wartosc ['parametr2'] => wartosc2 ) Teraz już spokojnie mając do dyspozycji nasze parametry startowe możemy wygenerować odpowiednią zawartość strony. Jako dodatkowe zadanie pozostaje wyłączenie pewnych konkretnych katalogów spod działania rewrite'a choćby po to aby arkusze styli czy grafika nie były serwowane przez skrypt PHP. Robi się to podobnie, przekierowywując konkretny nazwę na fizyczny katalog. Np. <VirtualHost 212.160.50.140> DocumentRoot /www/moj_serwis/ ServerName www.moja_domena.pl RewriteEngine on RewriteRule ^/(css)/(.*)$ /www/moj_serwis/css/$2 [l] RewriteRule !^/(css)/.*$ /www/moj_serwis/index.php [l] </VirtualHost> W powyższym przykładzie pierwsza reguła serwuje wszystkie wywołania www.moja_domena.pl/css/cokolwiek_tytaj z katalogu /www/moj_serwis/css/ przy czym cokolwiek_tu musi być istniejącym plikiem (np. CSS) Druga reguła natomiast zapewnia przepisanie wszystkiego co nie trafia w katalog css na nasz skrypt index.php Powyższy przykład należy traktować dość luźno, jeżeli nasz serwer nie pozwala nam na używanie dyrektyw mod_rewrite w pliku .htaccess to niestety nie zdziałamy zbyt wiele. Zawsze pozostaje kontakt z administratorem maszyny, jednak dotyczy to tylko i wyłącznie kont komercyjnych. Nie zachęcam bynajmniej do pisania maili do adminów WP, Onetu czy host.sk z prośbami o odpowiednie modyfikacje konfiguracji. Sprawa ma się dużo lepiej gdy sami adminujemy dana maszyna :)
* includowanie może się sprawdzić jeśli rewrite'ów będzie kilka na kilka różnych plików.
Jako rozwinięcie tematu jeszcze raz kilka linków:
Lejzik, oryginał dostępny na http://lejzik.w3crew.com.pl/howto/url.html
|