NFsec Logo

Mod_rewrite w przykładach

20/05/2007 w Administracja Brak komentarzy.  (artykuł nr 21, ilość słów: 401)

P

ostanowiłem zebrać i opisać kilka przydatnych rozwiązań dotyczących mod_rewrite. Mam nadzieję, że ten wpis ułatwi poszukiwania odpowiednich regułek. Włączenie mod_rewrite i ustawienie domyślnej ścieżki.

RewriteEngine On
RewriteBase /

# na lokalnym komputerze w Linuksie często spotykamy

RewriteBase /~nazwa_uzytkownika/katalog_ze_strona/

Rozpoznanie subdomen ustawionych na stronę główną, tzw. wildcard (jeśli wyświetla nam się 404 – brak strony, sprawdźmy czy subdomena kieruje na stronę główną). Do zmiennej subdomain przekazujemy nazwę subdomeny. Bardzo często zamiast tego odczytuje się tą domenę w php poprzez $_SERVER[‘HTTP_HOST’].

RewriteCond %{HTTP_HOST} !=www.domena.pl
RewriteCond %{HTTP_HOST} ^(www\.)?(.+).domena.pl$
RewriteRule .* ?subdomain=%2

Drugi przykład z subdomenami przekierowuje na plik o nazwie subdomeny.

RewriteCond %{HTTP_HOST} !=www.domena.pl
RewriteCond %{HTTP_HOST} ^(.*).domena.pl$
RewriteRule .* %1.php

Przekierowanie 301, aby google widziało wszystkie nasze strony pod www.domena.pl, a nie część pod domena.pl, a część pod www.domena.pl. Dodatkowo zwiększa PR poprzez sumowanie odwołań do obu adresów.

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

Przekierujemy starą stronę na nową.

RewriteCond %{HTTP_HOST} ^www.stara-strona.pl [or]
RewriteCond %{HTTP_HOST} ^stara-strona.pl
RewriteRule (.*) http://www.nowa-strona.pl/$1 [R=301,L]

Można też to zrobić za pomocą php wstawiając do każdego skryptu odpowiedni kod.

< ?php
header("HTTP/1.1 301 Moved Permanently"); 
header("Location: http://www.nowa-strona.pl/"); 
exit;
?>

Przekierowanie z index.php na ./.

RewriteRule ^index\.php ./ [R=301,L]

Kilka przykładów uruchomienia akcji dokument z jego identyfikatorem id. Cyfry z poprzedzającym znakiem dolara odpowiadają kolejnym nawiasom.

# www.przyklad.pl/tytul-artykulu,d20.html
# tytuły złożone z małych liter, cyfr, myślnika i podkreślenia

RewriteRule ^[a-z0-9\-\_]+,d([0-9]+)\.html$ ?a=dokument&id=$1

# www.przyklad.pl/dokument/tytul-artykulu/20/
# akceptuje ze slashem i bez na końcu

RewriteRule ^dokument/(.+)/([0-9]+)/?$ index.php?a=dokument&id=$2

# www.przyklad.pl/dokument/tytul-artykulu/20/
# akceptuje tylko ze slashem na końcu

RewriteRule ^dokument/(.+)/([0-9]+)/$ artykuly.php?a=dokument&id=$2

# www.przyklad.pl/dokument,tytul-artykulu,20.html

RewriteRule ^dokument,(.+),([0-9]+)\.html$ index.php?a=dokument&id=$2

Czasem zdarza się, że dwa linki spełniają kryterium, należy wtedy użyć [L], które powoduje, że dalej nie sprawdza w aktualnym RewriteCond. Ważna jest kolejność, gdybyśmy napisali nasz przykład na odwrót zawsze wykonywałby się pierwszy przypadek.

RewriteRule ^(.+),(.+)\.html$ index.php?a=$1&id=$2 [L]
RewriteRule ^(.+)\.html$ index.php?a=$1 [L]

Można zabezpieczyć by odwołania do plików, które istnieją nie podlegały regułom mod rewrite. W naszym przypadku jeśli plik nie istnieje to otwórz stronę główną.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteuRule .* index.php [L]

Przykład blokowania plików z rozszerzeniem .tpl oraz .tpl.php.

RewriteCond %{REQUEST_URI} \.(tpl|tpl.php)$ 
RewriteRule .* - [F]

Przekieruj wszystkie odwołania do zmiennej a, poza plikami z rozszerzeniami podanymi w nawiasie.

RewriteRule !\.(js|ico|gif|jpg|png|css)$ - [L]
RewriteRule (.*) index.php?a=$1

Można to wykonać też w inny sposób i wtedy odwoływać się do adresu poprzez $_SERVER[‘REQUEST_URI’], a nie zmienną a jak w poprzednim przykładzie.

RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

Czasami potrzebne jest doczepienie całego zapytania query string. Służy do tego flaga QSA.

# przy wywołaniu test.html?parametr=2
# zostanie uruchomiony index.php?a=$1¶metr=2

RewriteRule ^(.*).html$ index.php?a=$1 [QSA]

Więcej informacji: blog Pawła Malisaka: sf.jogger.pl

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : ,

Komentowanie tego wpisu jest zablokowane.