Mod Rewrite

Pamiętam, jak kilka lat temu zainteresowałem się funkcją Mod Rewrite. Niestety wówczas brak czasu, słaba znajomość programowania oraz brak przystępnie napisanych artykułów nie pozwoliły mi na zastosowanie tej funkcji. Niedawno zainteresowałem się Mod Rewrite ponownie i zebrałem w, mam nadzieję, przystępną całość kilka przydatnych informacji.

Artykuł ten chciałem napisać właśnie w jak najkrótszej i jak najbardziej przystępnej formie, aby postarać się wyjaśnić podstawy Mod Rewrite. Czym jest i po co stosować Mod Rewrite? Przede wszystkim ze względów estetycznych oraz w celu osiągania lepszych wyników w wyszukiwarkach – lepsze pozycjonowanie.

Estetyka? Który adres URL wygląda lepiej – standardowy czy po zastosowaniu Mod Rewrite?:

https://www.rozenek.com/index.php?ln=polski&article_id=324

https://www.rozenek.com/polski,324

O ile o estetyce i gustach ciężko dyskutować, jednak na pewno argumentem powinno być lepsze pozycjonowanie w wyszukiwarkach. Kolejnym przykładem może być struktura plików i katalogów sklepu internetowego:

Przed: http://www.jakissklep.com/index.php?kategoria=drukarki&producent=panasonic&model=kxp123

Po: http://www.jakissklep.com/drukarki/panasonic/kxp123/index.html

Dla mnie osobiście druga opcja wygląda zdecydowanie lepiej.

Przede wszystkim, aby nasze Mod Rewrite działało, należy w pliku konfiguracyjnym Apache’a dopisać:

<Directory /home/nazwa_konta/katalog_www/>
AllowOverride All
</Directory>

Zapewne większość osób korzystających z profesjonalnego hostingu nie będzie musiała dokonywać żadnych wpisów w Apache, wystarczy, gdy poproszą o odpowiedni wpis administratorów lub aktywują tę funkcję w panelu administracyjnym swojego hostingu.

Kolejnym krokiem jest stworzenie pliku .htaccess o następującej zawartości:

RewriteEngine On
RewriteRule ^([a-z]*),([^-]*)$ index.php?ln=$1&article_id=$2 [L]

To jest przykładowy wpis dotyczący mojej strony. Wygląda skomplikowanie? Na pierwszy rzut oka tak – ale nie przejmuj się 🙂 Więc jak to działa? Pierwsza linia włącza silnik. Po prostu ją przepisz. Właściwa reguła zaczyna się od znaku ^ a kończy znakiem $. Nie zwracaj chwilowo uwagi na to, co jest w nawiasach.

Jeśli Twoja strona ma w chwili obecnej strukturę URL:

http://www.jakasdomena.com/index.php?zmienna1=aaa&zmienna2=bbb
a chcesz uzyskać adres URL w postaci:
http://www.jakasdomena.com/aaa,bbb

musisz zapisać w .htaccess następujące linijki:

RewriteEngine On
RewriteRule ^(blabla),(blabla)$ index.php?zmienna=$1&zmienna=$2 [L]

Chwilowo zawartość nawiasów zastąpiłem “blabla”, aby nie zaciemniać sytuacji.

W tym przypadku zastosowanie Mod Rewrite spowoduje “usunięcie” z URL index.php?zmienna1=$1&zmienna2=$2 i “wciśnięcie” do pierwszego nawiasu wartości $1 a do drugiego nawiasu wartości $2. Czyli po wpisaniu w przeglądarce URL http://www.jakasdomena.com/aaa,bbb – serwer www otrzyma do skryptu adres http://www.jakasdomena.com/index.php?zmienna1=aaa&zmienna2=bbb

Co powinno znaleźć się w nawiasach zamiast “blabla”? To zależy. O tym za chwilę. Znajdują się tam filtry danych wejściowych.

Pełny zapis pliku .htaccess dla naszego przypadku powinien wyglądać:

RewriteEngine On
RewriteRule ^([a-z]*),([a-z]*)$ index.php?zmienna1=$1&zmienna2=$2 [L]

gdzie:
([a-z]*) – oznacza dopuszczenie znaku tylko z zakresu od a do z. Gdyby nie znak * – oznaczałoby to (bardzo ważne!!!), że może wystąpić tylko jeden znak z zakresu a-z. Gwiazdka dopuszcza jego brak lub dowolną ilość

[L] – Znacznik ten pozwala na zatrzymanie przetwarzania reguł RewriteRule po skutecznym dopasowaniu adresu URL do reguły.

A oto przykładowy spis możliwości parametrów podawanych w nawiasach:

  • [a-z] – dopuszcza tylko małą literę;
  • [0-9] dopuszcza liczę od 0 do 9;
  • [a-zA-Z] – dopuszcza tylko i wyłącznie małą lub wielką literę;
  • . (kropka) – każdy pojedynczy znak;
  • ? – zero lub jedno wystąpienie wyrażenia poprzedzającego;
  • + – przynajmniej jedno wystąpienie wyrażenia poprzedzającego;
  • * – zero lub więcej wystąpień wyrażenia poprzedzającego;
  • {2} – dokładnie dwa wystąpienia wyrażenia poprzedzającego;
  • {2,} – dwa lub więcej wystąpień wyrażenia poprzedzającego;
  • {2,5} – wyrażenie poprzedzające występuje między 2 a 5 razy;
  • (…) – grupowanie;
  • (x|y) – wyrażenie x lub y;
  • [xyz] – zakres składający się z liter x, y, z;
  • [^xyz] – zakres NIE składający się z liter x, y, z – czyli wszystko za wyjątkiem x,y,z;

Flagi reguł:

  • L – ostatnia reguła;
  • R – przekierowanie, np. [R=301];
  • S – pomijanie następnych x reguł, np. [S=3];
  • NC – ignorowanie wielkości liter;
  • E – definiowanie zmiennych środowiskowych, np. [E=zmienna:wartosc];
  • F – zwraca status 403 informujący o braku dostępu do strony;
  • G – zwraca status 410 informujący o umyślnym usunięciu pliku;
  • P – proxy (wykorzystywane przy mod_proxy);
  • CO – zostanie ustawione cookie w przeglądarce użytkownika, format: [CO=zmienna:wartość:domena:czas:ścieżka];
  • N – przetwarzanie reguł nastąpi od początku;
  • C – wskazanie połączenia reguł między sobą;
  • T – ustawianie typu MIME, np. [T=text/plain];
  • NS – uniemożliwia użycie danej reguły jako podzapytania (podzapytaniem może być załączanie stron wykorzystujące SSI);
  • QSA – query string append – ciąg zmiennych określających lokację z wywoływanego adresu zostanie doklejony do przepisanego adresu;
  • NE – No Escape URI – zabezpiecza przed zmianą znaków typu #, $ czy ; na odpowiadające im kody szesnastkowe; dla podanych znaków byłoby to odpowiednio %23, %24 i %3B;
  • PT – przepisany adres jest traktowany jako adres URI (domyślnie jest to ścieżka do pliku);

Fajny przykład Mod Rewrite:

Co zrobić, aby po wpisaniu URL http://subdomena.domena.com (tylko i wyłącznie) wyświetliła się zawartość URL http://www.domena.com/aaa,bbb z pozostawieniem w przegladarce URL’u http://subdomena.domena.com ?
Ależ nic prostszego 😛 Należy zrobić następujący wpis:

RewriteCond %{HTTP_HOST} ^subdomena.domena.com$
RewriteRule ^$ aaa,bbb

Co zrobić, gdy ktoś jakimś cudem wpisze adres http://www.domena.com/aaa,bbb – podczas gdy powinien być on nieznany (jednak taką postać scache’owało google lub taki URL generuje skrypt PHP). Mod Rewrite umożliwia przerzucenie takiego wizytora po zastosowaniu następującego wpisu:

RewriteRule ^(aaa,bbb){1}$ http://subdomena.domena.com [R]

Dwie ważne uwagi do tego wpisu: Jeśli nie zastosujemy wpisu “{7}” – przekierowany także zostanie adres http://www.domena.com/aaa,b – “{7}” wymusza spełnienie warunku dla całej, siedmioznakowej zawartości nawiasu.

Flaga [R] spowoduje przekierowanie niechcianego adresu na właściwy – w subdomenie.

Oczywiście sam plik .htaccess nie da nam nic, jeśli nie przerobimy skryptów PHP do generowania nowego typu URLi. Bo co z tego, że będziemy mieli piękny .htaccess, jeśli w hiperłączach na stronie będziemy cały czas mieli zwykłe parametry… Pamiętaj o zamianie sposobu generowania linków wewnątrz własnej strony!!!

Źródła:

http://www.programuj.com/artykuly/www/regularne.php

http://webhosting.pl/print/Sposob.na.lepsze.odnosniki.czyli.mod_rewrite

http://eriz.pcinside.pl/weblog/mod_rewrite-pozornie-beznadziejne-problemy-ktore-mozna-rozwiazac-208.html

http://4programmers.net/Z_pogranicza/Mod_rewrite

http://dhosting.pl/kursy/rewrite.html

http://sf.jogger.pl/2007/05/02/mod-rewrite-w-przykladach/

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA
Change the CAPTCHA codeSpeak the CAPTCHA code
 

This site uses Akismet to reduce spam. Learn how your comment data is processed.