RkBlog

Hardware, programming and astronomy tutorials and reviews.

Krótkie URLe i PHP

Przepisywanie linków na poziomie kodu PHP z wykorzystaniem modułu mod_rewrite serwera Apache

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');
?>
Powyższe funkcje korzystające z wyrażeń regularnych posłużą nam do automatycznego zamieniania linków. W zaznaczonym miejscu będziemy musieli wstawić odpowiednie reguły.

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

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.

Wynikowe linki jakie tu podajemy muszą odpowiadać tym z .htaccessa

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.
RkBlog

PHP w Akcji, 14 July 2008,

Comment article