Krótkie URLe i PHP
14 July 2008
Comments
Umiemy już tworzyć reguły w pliku .htaccess. Teraz dowiemy się jak automatycznie przepisywać wszystkie linki na stronie na te "krótkie". Tworzymy plik PHP, np. rewrite.php:
<?php
function rewrite_url_filter($data)
{
$link = $data[0];
$link = ereg_replace('"$', '', $link);
$link = explode('="', $link);
$_link = $link[0];
$link = $link[1];
// Tutaj wstawimy reguły
$link = $_link.'="'.$link.'"';
return $link;
}
function rewrite_ob_filter($string)
{
return preg_replace_callback('/(href|src|action)\s*=\s*"[^"]+"/', 'rewrite_url_filter', $string);
}
ob_start('rewrite_ob_filter');
?>
Reguła I - krótka nazwa
Najprostsza reguła przepisująca linki bez zmiennych _GET: nazwa.php, nazwa.xyz a nie nazwa.xyz?opcja=cos. Kod ma postać:
$link = preg_replace('#(nazwa1|nazwa2|nazwa3)\.php$#si', '.html', $link);
Pliki PHP o podanych nazwa zostaną zamienione na odpowiedniki z rozszerzeniem PHP.Reguła II - linki bez części zmiennych
Teraz reguła podoban do powyższej obsługująca link z zmiennymi _GET - strona.xyz?opcja=cos. Kod ma postać:
$link = preg_replace('#nazwa\.php\?opcja=ktoras?#si', 'strona.html', $link);
$link = preg_replace('#module\.php\?op=gbook?#si', 'gbook.html', $link);
Pierwszy wiersz zawiera przykładowy kod. Na czerwono zaznaczono kod odnoszący się do przepisywanego linka. # po bokach czy ? po prawej to elementy wyrażenia regularnego, ich nie ruszamy. W drugim wierszu mamy prawdziwy przykład z jP. module.php?op=gbook ładuje moduł galerii. Nie ma w nim części zmiennych więc stosujemy tą regułę. Wstawiamy slash przez . i ? w linku i gotowe. Następnie podajemy wynikowy URL, w tym przypadku gbook.html$link = preg_replace('#module\.php\?op=gbook?#si', 'gbook.html', $link);
Reguła III - link ze zmienną
Mamy link ze zmienną, liczbą: module.php?op=galery&cmd=1, module.php?op=galery&cmd=2 itd. Przepisujemy go w następujący sposób:
$link = preg_replace('#module\.php\?op=galery&cmd=([0-9]*)#si', 'gal-.html', $link);
W porównaniu do reguły II doszła nam zmienna w linku którą zastępujamy na ([0-9]*) a w linku wynikowym dajemy (\*N*umer_zmiennej). Dla linku z dwiema zmiennymi np.: module.php?op=calendar&month=3&day=16 reguła będzie następująca:
$link = preg_replace('#module\.php\?op=calendar&month=([0-9]*)&day=([0-9]*)#si', 'cal--.html', $link);
Reguła IV - zmienna nienumerycza
Gdy zmienna nie jest liczbą zamiast ([0-9]*) dajemy np. ([0-9a-zA-Z \-]*) - ta "fraza" obsłuży również litery, spacje oraz myślnik.Uwagi
- Linki nie będą przepisywane jeżeli dołączane jest wartość SID do niego- Dodając reguły grupuj je od bardziej rozbudowanych:
index.php?zestaw=1&wpis=2
index.php?zestaw=1
Jeżeli reguła dla 2 linka będzie pierwsza przepisze drugi na "wynikowy_url.html&wpis=2" i nie będzie on działał. By wszystko działało najbardziej rozbudowane linki muszą być przepisywane przed ich prostszymi formami.
index.php?zestaw=1
RkBlog
Comment article