Główne zdjęcie witryny
Dobrze widzi się tylko sercem. Najważniejsze jest niewidoczne dla oczu. – Antoine de Saint-Exupéry

Przyjazne linki z mod_rewrite w .htaccess i PHP

Hiperłącze z przyjaznym adresem URL

Tworząc rozbudowany serwis internetowy, bez względu na to, czy jest nim sklep online, czy może zwykly blog tak jak ten, istnieje duże prawdopodobieństwo, że niektóre hiperłącza prowadzące do danej strony będą zbyt skomplikowane. Mam w szczególności na myśli linki zawierające wiele parametrów HTTP GET, które są przesyłane wraz z żądaniem. Adresy URL w takiej postaci po pierwsze są trudne do zrozumienia i zapamiętania, a po drugie negatywnie wpłyną na pozycjonowanie SEO Twojej witryny w wyszukiwarkach internetowych. Na szczęście, najpopularniejszy serwer WWW Apache zawiera wbudowany moduł mod_rewrite, który za pomocą jednego pliku .htaccess umożliwia (i to bez ingerencji w ustawienia serwera!) proste przekierowywanie z przyjaznych adresów URL do najbardziej skomplikowanych miejsc Twojego serwisu. W tym poradniku nie tylko pokażę Ci najprostszy sposób wykorzystania tego mechanizmu, ale przedstawię Ci również technikę generowania dynamicznych adresów URL z poziomu języka PHP – gdy nie wiemy z ilu i jakich stron będzie się składała nasza witryna.

Wprowadzenie

Aby włączyć na serwerze Apache moduł mod_rewrite i skonfigurować odpowiednio ustawienia przekierowań musimy najpierw utworzyć w głównym katalogu hostingowym plik pod nazwą .htaccess. Jest to zwykły plik tekstowy, który możemy utworzyć za pomocą programu Notepad++. Ważne jest, aby aby plik ten dokładnie nazywał się .htaccess (wraz z kropką na początku) oraz był zapisany w kodowaniu UTF-8 bez BOM. Jego najprostsza zawartość włączająca moduł mod_rewrite przedstawia się następująco:

<IfModule mod_rewrite.c>
RewriteEngine On
</IfModule>

Komenda RewriteEngine On powinna zawsze znajdować się na samym początku przed wykonaniem pierwszego przekierowania. Warto tutaj zaznaczyć, że wszystkie zapisane reguły zostaną zastosowane nie tylko dla bieżącego katalogu, ale również dla wszystkich podkatalogów w systemie plików serwera (w naszym przypadku dla całej witryny internetowej). Jeśli w którymś podkatalogu chciałbyś zastosować inne reguły, będziesz musiał w nim utworzyć kolejny plik .htaccess i nim nadpisać te, które znajdują się wyżej w hierarchii. Dla przykładu, jeśli zechcesz wyłączyć moduł mod_rewrite dla któregoś z podkatalogów, po prostu umieść w nim plik .htaccess o następującej treści:

<IfModule mod_rewrite.c>
RewriteEngine Off # to jest przykład ignorowanego komentarza
</IfModule>

Proste przekierowania

.htaccess każda reguła jest zapisywana w osobnej linii, zaczyna się swoją nazwą (np. RewriteRule), a argumenty są oddzielana białymi znakami (zazwyczaj spacją). Najprostszy sposób wykonania przekierowania strony to statyczne przypisanie jej adresu URL do jej dowolnej wymyślonej przyjaznej nazwy. Spójrz na poniższy przykład:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule strona-glowna /index.html
RewriteRule oferta-dla-firm /oferta/dla-firm/oferta.html
RewriteRule kontakt /kontakt/kontakt.html
</IfModule>

Teraz dzięki powyższym regułom wystarczy wejść na stronę pod adresem http://wlasocha.pl/oferta-dla-firm, a odwiedzający zostanie automatycznie przekierowany na adres http://wlasocha.pl/oferta/dla-firm/oferta.html (oczywiście, o ile nasza strona znajduje się pod adresem http://wlasocha.pl, dlatego w swoim przypadku musisz podać własną domenę). W analogiczny sposób działają dwa pozostałe przyjazne linki (czyli strona-glowna oraz kontakt). Wielką zaletą jest ukryte maskowanie adresu docelowego, tzn. internauta nie będzie miał żadnej wiedzy pod jaką sieżką tak na prawdę pobrał plik z serwera (czyli przeglądarka internetowa cały czas będzie wyświetlać adres źródłowy, a samo przekierowanie wykonuje się niejawnie po stronie serwera).

Teraz wyobraźmy sobie sytuację kiedy prowadzimy sklep internetowy w którym sprzedajmy setki różnych przedmiotów o różnych cechach, które są wyszukiwane za pomocą parametrów HTTP GET umieszczanych w skomplikowanych i tajemniczych dla kupujących adresach URL, np. jak: http://wlasocha.pl/index.php?page=search&cat=shirt&color=red&size=xs&action=show&attr=3184. Jak się domyślasz, ilość kombinacji wyszukiwania danego produktu byłaby ogromna. Oczywiście, aby linki były przyjazne, dodawanie tak dużej liczby dyrektyw do pliku .htaccess, byłoby bardzo uciążliwe – w szczególności gdy często zmieniamy asortyment. Na szczęscie moduł mod_rewrite umożliwia wykorzystanie wyrażeń regularnych do konwersji przyjaznych linków na adresy URL z dowolnymi parametrami HTTP GET (ku sprostowaniu: na odwrót także). Spójrz na poniższy przykład:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^search/([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z]+)/([0-9]+)/?$ index.php?page=search&cat=$1&color=$2&size=$3&action=show&attr=$4
</IfModule>

Teraz możliwe jest odnalezienie tego samego przedmiotu za pomocą znacznie prostszego i łatwiejszego (do zrozumienia i zapamiętania) adresu URL: http://wlasocha.pl/search/shirt/red/xs/show/3184/ (ukośnik występujący na samym końcu jest opcjonalny).

Generowanie przyjaznych linków

Teraz przejdźmy do czegoś trudniejszego, czyli do automatycznego generowania przyjaznych linków i odpowiedniego operowania nimi za pomocą języka PHP. Załóżmy, że domena naszej witryny to http://wlasocha.pl i otwieramy na niej stronę o dowolnej przyjaznej ścieżce (czyli na pewno różnej od index.php), np. taką jak ta, którą czytasz, czyli http://wlasocha/blog/przyjazne-linki-z-mod-rewrite-w-htaccess-i-php. Wykorzystując poniższe komendy w pliku .htaccess możemy przekazać do automatycznie wczytywanego skryptu index.php całą scieżkę (ale bez domeny) jaką wprowadził użytkownik odwiedzający naszą stronę:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !index.php
RewriteRule (.*) index.php?path=$1
</IfModule>

Cała ścieżka jest przekazywana do pliku index.php za pomocą parametru HTTP GET o nazwie path, który w omawianym przykładzie ma przypisaną wartość blog/przyjazne-linki-z-mod-rewrite-w-htaccess-i-php. Teraz możemy w tym skrypcie PHP odczytać ten parametr przekazany wraz z żądaniem HTTP i w zależności od jego wartości wyświetlić odpowiednią stronę internetową. Spójrz na poniższy kod PHP, jak ja to zrobiłem:

<?php
if (isset($_GET['path'])) {
	$path = filter_var($_GET['path'], FILTER_SANITIZE_STRING);
	$path_parts = explode('/', $path);
	if (isset($path_parts[0]) && $path_parts[0] == 'blog') {
		if (isset($path_parts[1]) && $path_parts[1] == 'archiwum-wpisow'
		&& isset($path_parts[2]) && isset($path_parts[3])) {
			if ($path_parts[3] == 'pierwszy-kwartal') {
				// wyświetl artykuły z pierwszego kwartału roku podanego w $path_parts[2]
			} elseif ($path_parts[3] == 'drugi-kwartal') {
				// wyświetl artykuły z drugiego kwartału roku podanego w $path_parts[2]
			} elseif ($path_parts[3] == 'trzeci-kwartal') {
				// wyświetl artykuły z trzeciego kwartału roku podanego w $path_parts[2]
			} elseif ($path_parts[3] == 'czwarty-kwartal') {
				// wyświetl artykuły z czwartego kwartału roku podanego w $path_parts[2]
			}
		} elseif (isset($path_parts[1]) && $path_parts[1] == 'chmura-tagow'
		&& isset($path_parts[2]) && !(isset($path_parts[3]))) {
			// wyświetl artykuły z przypisanym tagiem podanym w $path_parts[2]
		} elseif (!(isset($path_parts[1])) || (isset($path_parts[1])
		&& $path_parts[1] == '') && !(isset($path_parts[2]))
		&& !(isset($path_parts[3]))) {
			// wyświetl wszystkie najnowsze artykuły
		} else {
			// jak wszystkie poprzednie warunki nie zostaną spełnione to jest tylko jedno wyjście - wyświetl tylko jeden pełny artykuł ;-)
		}
	}
}
?>

Na początku odbierany parametr HTTP GET path jest dzielony na pojedyncze elementy tablicy za pomocą funkcji explode() oraz seperatora / – czyli pierwszy element $path_parts[0] jest równy blog, a następny $path_parts[1] jest równy przyjazne-linki-z-mod-rewrite-w-htaccess-i-php (w rozpatrywanym przez nas przypadku). Jako, że ten drugi element tablicy nie jest równy ani archiwum-wpisow, ani chmura-tagow, ale są zdefiniowane i mają przypisane jakieś wartości, zostanie spełniony ostatni warunek, czyli wyświetlenie tylko jednego pełnego artykułu. Oczywiście, nie jest to idealne rozpoznawanie przyjaznych linków – Ty możesz zaprogramować to znacznie lepiej!

Ponadto, mogę jeszcze wskazać, że artykuły najlepiej przechowywać w bazie danych SQL w postaci rekordów z przypisanymi przyjaznymi ścieżkami, za pomocą których odnajdziemy ten właściwy, po wpisaniu adresu URL przez użytkownika.

Zakończenie

Na zakończenie muszę stwierdzić, że w niniejszym artykule absolutnie nie wyłożyłem całej wiedzy o możliwościach modułu mod_rewrite oraz ustawień pliku .htaccess. Jeśli jesteś zainteresowany tą techniką, odsyłam Cię do Google'a, gdzie znajdziesz inne możliwości jej wykorzystania niż przedstawione przeze mnie przyjazne linki. Isnieją sposoby przekierowań stron z lub bez przedrostka www, na wersję desktop lub mobilną w zależności od urządzenia, a nawet wymuszanie szyfrowania SSL (HTTPS), czy obsługę własnych stron błędów (np. 404). No i jak zwykle na koniec – proszę o komentarz!

Komentarze

Ten wpis nie ma jeszcze żadnych komentarzy. 😟

Dodaj własny komentarz

Formularz dodawania komentarza
Kontynuując przeglądanie niniejszej witryny internetowej automatycznie wyrażasz zgodę na wykorzystanie plików cookies.