RkBlog

Hardware, programming and astronomy tutorials and reviews.

Mod_rewrite - kr贸tkie URLe

Serwer Apache ma bardzo ciekaw膮 opcj臋 - mod.rewrite. Umo偶liwia on "przepisanie" adresu wynikowej strony o okre艣lonej nazwie na inn膮 nazw臋. Np. index.html mo偶e sta膰 si臋 strona.html, index.php mo偶e by膰 index.html, index.php?mod=test&strona=1 mo偶e by膰 test1.html itd. Zalety mod.rewrite pojawiaj膮 si臋 gdy u偶ywamy skrypt贸w, CMS贸w napisanych w PHP lub innym j臋zyku dynamicznego generowania stron www. D艂ugie linki staj膮 si臋 kr贸tsze oraz co wa偶ne przyjazne dla wyszukiwarek, gdy偶 nie wszystkie indeksuj膮 dynamiczne strony z ?, &, =, w linkach.

Krok pierwszy - Czy mod.rewrite u nas dzia艂a?

Na darmowych serwerach raczej nie b臋dzie dzia艂a艂 (na lycosie nie dzia艂a). Jak to 艂atwo sprawdzi膰? Zrobi膰 .htacces z prost膮 regu艂膮 i zobaczy膰 czy dzia艂a - patrz ni偶ej.
Plik .htaccess traktowany jest jako ukryty (serwery unixowe). By zobaczy膰 w kliencie FTP pliki .htaccess musimy zaznaczy膰 odpowiedni膮 opcj臋. Dla Total Commandera b臋dzie to w zak艂adce Sie膰 - "Poka偶 ukryte Pliki".


Krok drugi - RewriteRule i .htaccess

Mod.rewrite sterowany jest przez plik .htaccess. Edycj臋 pliku .htaccess zaczynamy od dodania:
Options FollowSymLinks
RewriteEngine On
Nast臋pnie dodajemy zasady przepisywania stron, tzw RewriteRule. Najprostsza regu艂a:
RewriteRule ^index.html$ index.php [L]
Index.html, pierwsza nazwa to link jak膮 mamy otrzyma膰, index.php to link do przepisania. Umie艣膰 taki plik .htaccess na serwerze. Je偶eli pojawi si臋 Interial Server Error lub podobne b艂臋dy oznacza to 偶e serwer nie obs艂uguje mod.rewrite albo ca艂ego .htaccess! Czasami 偶aden b艂膮d nie pojawi si臋 a przepisywanie link贸w nie b臋dzie dzia艂a膰 - mod.rewrite nie jest w艂膮czony.
Po umieszczeniu powy偶sze regu艂y w .htaccess oba adresy - index.php i index.html b臋d膮 otwiera艂y t膮 sam膮 stron臋. Inne regu艂y tego typu (link bez zmiennej):
RewriteRule ^login.html$ login.php [L]
RewriteRule ^banner.html$ banner.php [L]
RewriteRule ^links.html$ links.php [L]
RewriteRule ^gbook.html$ module.php?op=gbook [L]
Ta s膮 proste regu艂y zast臋puj膮ce okre艣lone linki bez cz臋艣ci "zmiennych". Ostatni przyk艂ad jest ju偶 bardziej zaawansowany, lecz te偶 jest "sta艂y", nie ma element贸w "zmiennych", tj. takich, kt贸rych zmiana wywo艂a zmian臋 adresu wynikowego. Przyk艂ad, mamy linki:
links.php?id=1
links.php?id=2
links.php?id=3
links.php?id=4
Jak za pomoc膮 1 regu艂y przepisywa膰 te pliki? A takiej:
RewriteRule ^links([^-]+).html$ links.php?id=$1 [L]
Co my tam mamy. Zamiast zmiennej - cyfry (1, 2, 3, 4) da艂em $1 - zmienn膮 nr.1 a w linku wynikowym da艂em co艣 takiego: ([^-]+) - ta "fraza" zwr贸ci w tym miejscu warto艣膰 zmiennej, $1. A wi臋c links.php?id=1 zamieni si臋 na links1.html, links.php?id=3 na links3.html. Oto kolejny przyk艂ad takiej samej sytuacji:
articles.php?topic=1
articles.php?topic=2
articles.php?topic=3
Regu艂a:
RewriteRule ^arttopic-([^-]+).html$ articles.php?topic=$1 [L]
Co da odpowiednio:
arttopic-1.html
arttopic-2.html
arttopic-3.html
A gdyby艣my mieli kilka zmiennych w linku? Np.:
forum.php?page=&cmd=show&id=1&category=2
forum.php?page=&cmd=show&id=2&category=6
Zmieniaj膮 si臋 cyfry przy id i category. Za nie wstawiamy zmienne:
forum.php?page=&cmd=show&id=$1&category=$2
RewriteRule ^post([^-]+)cat([^-]+).html$ forum.php?page=&cmd=show&id=$1&category=$2 [L]
Pierwszy ([^-]+) zwr贸ci warto艣膰 $1, drugi ([^-]+) warto艣膰 $2. czyli dla pierwszego linku otrzymamy
post1cat2.html
Inny przyk艂ad:
adverts.php?cmd=show_cat&id=1&type=2
adverts.php?cmd=show_cat&id=$2&type=$1
RewriteRule ^adverts-([^-]+)-([^-]+).html$ adverts.php?cmd=show_cat&id=$2&type=$1 [L]
W tym przyk艂adzie najpierw da艂em $2 a potem $1. Jaki to da efekt? A taki 偶e otrzymamy taki link ko艅cowy:
adverts-2-1.html
Pierwsze ([^-]+) zwraca $1, mimo i偶 jest ona "dalej", po $2.

A oto plik .htaccess zawieraj膮cy regu艂y przepisywania dla jPortala. Aktualny plik .htaccess znajdziesz w modzie "Kr贸tkie Linki"
Options FollowSymLinks
RewriteEngine On

RewriteRule ^index.html$ index.php [L]
RewriteRule ^login.html$ login.php [L]
RewriteRule ^banner.html$ banner.php [L]
RewriteRule ^links.html$ links.php [L]
RewriteRule ^forum.html$ forum.php [L]
RewriteRule ^articles.html$ articles.php [L]
RewriteRule ^tnews.html$ tnews.php [L]
RewriteRule ^download.html$ download.php [L]
RewriteRule ^gbook.html$ module.php?op=gbook [L]
RewriteRule ^recomm.html$ module.php?op=recomm [L]
RewriteRule ^mailer.html$ mailer.php [L]

# Linki
RewriteRule ^links([^-]+).html$ links.php?id=$1 [L]

# Artyku艂y
RewriteRule ^arttopic-([^-]+).html$ articles.php?topic=$1 [L]
RewriteRule ^articles-([^-]+).html$ articles.php?id=$1 [L]

# Newsy kategorie
RewriteRule ^newstop-([^-]+).html$ news.php?topic=$1 [L]

# Download
RewriteRule ^download-([^-]+).html$ download.php?id=$1 [L]

# Forum
RewriteRule ^forumcat-([^-]+).html$ forum.php?category=$1 [L]
RewriteRule ^post([^-]+)cat([^-]+).html$ forum.php?page=&cmd=show&id=$1&category=$2 [L]
RewriteRule ^post([^-]+)cat([^-]+)pg([^-]+).html$ forum.php?page=&pg=$3&cmd=show&id=$1&category=$2 [L]

# Adverts
RewriteRule ^adverts.html$ adverts.php [L]
RewriteRule ^adverts-([^-]+)-([^-]+).html$ adverts.php?cmd=show_cat&id=$2&type=$1 [L]
RewriteRule ^adverts-([^-]+).html$ adverts.php?cmd=show_ad&id=$1 [L]

# Bramka GG
RewriteRule ^gg.html$ module.php?op=gg [L]

# Pozdrowienia
RewriteRule ^pozdro.html$ pozdro.php [L]
RewriteRule ^pozdroall.html$ pozdro.php?all=ok [L]

# Dowcipy
RewriteRule ^humor.html$ humor.php [L]
RewriteRule ^humor([^-]+).html$ humor.php?id=$1 [L]

# Quiz
RewriteRule ^quiz.html$ quiz.php [L]

# E-kartki
RewriteRule ^ekartki.html$ module.php?op=kartki [L]
RewriteRule ^ekartki-kat([^-]+).html$ module.php?op=kartki&kat=$1 [L]
RewriteRule ^ekartki-pok([^-]+).html$ module.php?op=kartki&cmd=pokarz&oid=$1 [L]
RewriteRule ^ekartki-wyb([^-]+).html$ module.php?op=kartki&cmd=wybierz&oid=$1 [L]

# Wy艣lij maila
RewriteRule ^mail.html$ module.php?op=mail [L]

# Onet
RewriteRule ^onet.html$ onet.php [L]

# Rk Autogaleria
RewriteRule ^galeria.html$ autogaleria.php [L]

# Rk Stat
RewriteRule ^stat.html$ stat.php [L]

# Profil
RewriteRule ^users.html$ login.php?cmd=users [L]
RewriteRule ^users-([^-]+).html$ login.php?cmd=users&l=$1 [L]
RewriteRule ^profil.html$ login.php?cmd=profil [L]
RewriteRule ^pw.html$ login.php?cmd=pw_get [L]
RewriteRule ^pw-new.html$ login.php?cmd=pw_new [L]
RewriteRule ^pw-read.html$ login.php?cmd=pw_get&act=readed [L]
RkBlog

PHP w Akcji, 14 July 2008, Piotr Mali艅ski

Comment article