16 sierpnia 2016

Praktyczne przykłady mod rewrite

Usuwamy zbędne końcówki

 W przypadku odwoływania się do katalogu, wczytywany jest domyślny plik – zazwyczaj index.html lubindex.php. Jest do zbędne, i lepiej skrócić adres ograniczając się do samego http://adres.pl/katalog/. A oto kod, dzięki któremu osiągniemy ten efekt. Koniec ze zbędnymi index’ami. Od teraz linki z index będą przekierowywane do krótszej wersji adresu, zakończonego samym znakiem / (slash).
RewriteRule ^index.(php|html|htm)$ / [R=301,L]
RewriteRule ^([a-z0-9-_]+)/index.(php|html|htm)$ /$1/ [R=301,L]

Wymuszamy slash

Kolejnym zidentyfikowanym problemem adresów URL jest fakt, że katalog jest dostępny zarówno a adresu bez ukośnika jak i z ukośnikiem. Z oczywistych przyczyn nie chcemy by tak było. Dlatego warto zastosować jeden kod, z poniżej przedstawionych. Ten kod został przedstawiony na blogu magicznego seo i sem, we wpisie o poskramianiu htacces.

RewriteEngine on
# nie dodajemy nic jeśli żądany plik istnieje
RewriteCond %{REQUEST_FILENAME} !-f
# sprawdzamy czy dany URL nie ma slasha na końcu
RewriteCond %{REQUEST_URI} !(.*)/$
# jeśli nie ma, przepisujemy URL z przekierowaniem 301
RewriteRule ^(.*)$
http://%{HTTP_HOST}/$1/ [L,R=301]

Drugi kod, przetestowany na tym serwisie natomiast, działa równie skutecznie i jest prostszy.

RewriteEngine On
RewriteRule ^([a-z0-9-_]+)$ http://%{HTTP_HOST}/$1/ [R=301]

Subdomena www w adresie

WWW to tak naprawdę subdomena dodana do witryny głównej. My sami również możemy dowolnie tworzyć subdomeny własnych domen. Najprostsze przykłady, stosowane przez znane serwisy to poczta.onet.pl, czat.wp.pl itd. W serwerach najczęściej subdomena www. jest obsługiwana automatycznie i uznawane jest, że prowadzi do domeny głównej.

Jest wielu zwolenników, jak i przeciwników tej jak by się wydawać mogło stałej części adresu internetowego. Ja osobiście jestem absolutnie przeciw, gdyż to zbędne wydłużanie URL które nikomu nie przynosi korzyści. Ładniej wygląda na etykietach czy ulotkach (poza internetem) – gdzie www bezsprzecznie sugeruje, że to adres internetowy. Natomiast w samym internecie jest zbędny. Przykładowe przekierowanie z adresu z www na formę bez:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.adres.eu(.*) [NC]
RewriteRule ^(.*)$ http://adres.eu/$1 [R=301,L]

Efekt odwrotny uzyskamy stosując, poniższy kod:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^adres.pl$
RewriteRule ^(.*)$ http://www.adres.pl/$1 [R=301,L]

W miejsce zmiennej adres.pl czy adres.eu należy wstawić własny adres domeny.

Jednolity adres – z www lub bez

Zaczynając pozycjonować, warto wybrać jedną wersję swojego adresu domenowego. Zazwyczaj serwer jest dostępny zarówno pod http://adres.pl jak i pod http://www.adres.pl.

Obydwa te adresy jednak dla robotów wyszukiwarek są różnymi serwisami. Przedrostek www. jest normalną subdomeną, jak na przykład w portalach serwisy pocztowe: poczta.onet.pl. Warto wybrać jednolitą wersję i stosować ją za każdym razem kiedy linkujemy do naszego serwisu.

Jeśli posiadamy już sporą ilość linków z daną formą z www lub bez niego należy iść za ciosem. Dla polepszenia efektu, jeśli mamy dostęp do opcji mod_rewrite na serwerze możemy skorzystać z przekierowania permanentnego.

Przykładowe przekierowanie z adresu bez www na formę z tą subdomeny:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^adres.pl$ 
RewriteRule ^(.*)$ http://www.adres.pl/$1 [R=301,L]

Odwrotnie natomiast należy użyć takiego kodu:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.adres.eu(.*) [NC]
RewriteRule ^(.*)$ http://adres.eu/$1 [R=301,L]

W miejsce zmiennej adres.pl czy adres.eu należy wstawić własny adres domeny. W przypadku gdy nasz serwer nie udostępnia opcji rewrite, lecz mamy dostęp do kodu php naszego serwisu możemy używać do takiego przekierowania właśnie tego języka i prostego skryptu:

<?php
if(substr($_SERVER['HTTP_HOST'], 0, 3)!='www'){
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.adres.pl".$_SERVER['REQUEST_URI']);
header("Connection: close");
exit;
};
?>

Powyższy kod obsługuje sytuację przekierowywania na adres z WWW. Jeśli chcemy zrobić na odwrót wystarczy znaki != zamienić na == w pierwszej linijce kodu. Zmianie musi ulec także adres znajdujący się w trzeciej, wystarczy usunąć www. przed adresem domeny.