Niewielka sztuczka, którą od zeszłego roku stosuję w PHP, pozwala na łatwe budowanie czytelnych linków. Dzięki temu twój odnośnik zamiast http://example.com/index.php?cat=shop&id=25
, może wygląć tak: http://example.com/shop/25
, albo nawet tak: http://example.com/shop/25/swieze_jaja_wiejskie
.
Oczywiście, to samo można zrobić za pomocą mod_rewrite
, ale wada rozwiązania jest taka, że dodanie nowej sekcji do serwisu wymaga ingerencji w pliki serwera WWW.
Mój niewielki hack polega na dodaniu do konfiguracji Apache'a jednej jedynej linijki (dla ułatwienia umieszczamy ją w pliku .htaccess
):
ErrorDocument 404 /index.php
Jak można się domyślić, plik index.php
jest jedynym plikiem w całym drzewie dokumentów danej domeny i od tego momentu odpowiada on na wszelkie zapytania o nieistniejące dokumenty.
Pozostało jeszcze zatroszczyć się o obsługę tego po stronie kodu:
// sprawdzamy, o jaki dokument jest zapytanie
$request = $_SERVER['REDIRECT_URL'];
// sprawdzamy, czy zapytanie dotyczy nieistniejacego pliku
if (($request) && ($request != '/'))
{
$request = explode('/', $request);
$section = $request[1];
$request = array_splice($request, 2);
$subsection = implode('/', $request);
}
else // jesli nie, to przekierowujemy na index
{
header('Location: /index');
die();
}
// obslugujemy zadanie
switch($section)
{
case 'index':
// [...]
break;
case 'shop':
// [...]
break;
default:
// [...] wyswietl blad 404
break;
}
Zalety - rozwiązanie jest nieinwazyjne względem serwera i pozwala strukturę dokumentów kontrolować na poziomie kodu. Dzięki temu łatwo utrzymywać strukturę, którą ciężko byłoby zarządzać na poziomie mod_rewrite
(np. tłumaczone nazwy kategorii).
Wady - nieistniejące strony nie mogą otrzymywać danych przez zlecenia GET
i POST
, więc wszystkie parametry muszą być częścią URI.
Najciekawsze efekty uzyskuje się przez połączenie tak serwowanych dokumentów ze strukturą statyczną (istniejące pliki nie są przekierowywane). Można zachować wtedy elastyczność rozwiązania z możliwością przekazywania danych z przeglądarki. Dzięki temu możliwa jest obsługa formularzy na stronach.