blackybr
18.11.2006, 17:23
mod_rewrite ... что это? как говорит вики -
A rewrite engine is a piece of web server software used to modify URLs, for a variety of purposes.
т.е. некий модуль для вэб сервера, позволяющий модифицировать линки.. Вообще сам энжин рерайта существует как на для апача, так и для мелкомягкого IIS, и даже для java платформ =) В этой статье пойдет речь именно о mod_rewrit'е для апача.
Все что от нас понадобится - файл .htaccess в корне, если же у вас он есть.. то нужно просто напросто дописать в нем определенные строки.. ну и конечно если хостер до сих пор не установил этот модуль, то его нужно немного попинать ногой..)
Лично я юзаю полные ссылки в .htaccess, если же вы хотите использовать относительные ссылки типа /index.php?blabla=31337 то желаьельно включить в файлик следущие строчки, которые хоть и немного но ускоряют работу
DocumentRoot /home/htdocs/www
<Directory /> Options FollowSymLinks
</Directory>
то бишь если у вас сайт в www, а опция не врублена, то апач будет пытаться найти файл Index.php сначала в /home/ потом в /home/htdocs/, ну и в конце концов наткнется на /home/htdocs/www/index.php. Мелочь конечно, но пару сотых секунды сэкономите..) либо можно в каждом файле писать перед рерайтрул он сл. фразу
Options +FollowSymLinks
Вообще у него можно найти довольно таки много вариантов применения.. самый популярный из них - это преобразование ссылки в более читабельный вид ) .. ну найдите мне человека которому бы понравилась ссылка вида
http://site.com/index.php?action=forum&forum=theme01
Сделаем из нее например
http://site.com/forum/someshit.htm
Для этого нам нужно сначала подключить сам RewriteEngine
RewriteEngine On
затем переписывается сам url
RewriteRule ^ ([a-z]+)/([a-z0-9]+).htm$ index.php?action=$1;forum=$2
Разберемся с этой несложной конструкцией...
RewriteRule просто задает начало строки переписывания.
([a-z]+)показывает что все до слэша заменяется маленькими латинскими буквами от a до z (все записывается в переменную $1)
дальше после слэша видим ([a-z0-9]+).htm, т.е. здесь мы заменяем все что после слэша мелкой латиницей от a до z и цифрами от 0 до 9 (переменная $2), а после этого добавляем в конец url'а расширение htm. Как вы понимаете таких .htm файлов у вас на сайте не было и не будет, просто так ссылки показываются в более удобном виде.
Тут главное запомнить - после RewriteRule идет 1ое - как переделывать, а затем что переделывать, думаю не особо сложно =)
Как вы понимаете чтобы форум полностью переписывал ссылки с параметрами в вид htm (не обязательно htm, можно любое раширение, на которое у вас хватит воображения) для всех существующих передающихся GET'ом параметров... будь то поиск, темы, форумы, личные сообщения в конце концов.. главное тоже не переусердствовать =)
Расмотрим еще один небольшой пример (тут я использую уже относительные ссылки)
сделаем из
http://site.com?index.php?forum=someshit&nickname=hacker&userID=31337
Перепишем под
http://site.com/someshit/31337-hacker.htm
Сначала как я сказал выше подрубим
Options +FollowSymLinks
потом
RewriteEngine On
RewriteRule ^([^/]+)/([0-9])-(.+)\.htm$ index.php?forum=$1&nickname=$2&userID=$3
первая строчка понятна, раберем 2ую. ([^/]+) - до слэша разрешаем юзать любые символы (ну а вдруг у нас в названии форума попадется и цифра.. хотя можно и что-то вроде ([a-zA-Z0-9]+), но тут не будет показываться например тире).
После ([0-9])-(.+) т.е. во 2ой части "конечного файла" мы вписываем саму переменную $2 (которая равна "hacker"), а в первую записываем только цифры (у нас это например айди юзера равное 31337) ( ([0-9]) ).
Ну и добавляем в конце расширение. Вторая часть строки в комментрариях не нуждается.. т.е. там всего лишь указано что переписывать. Все 3 значения переменных.
Еще раз поясню сами регулярные переменные
[a-z] - нижние латинские буквы
[A-Z] - заглавная латиница
[0-9] - цифры
кстати к слову... вы также можете юзать и [c-y] или [4-8] то есть любой рендж цифр/букв.
^ - у него два типа юзания.
1) когда он внутри квадратных скобок, он обозначает отрицание. т.е. [^ab123] означает что замена будет происходить любыми символами, кроме a,b,1,2,3
2) обозначает начало регулярки (Ex. RewriteRule ^ /*выражение*/
точка - любой одиночный символ
+ - юзание одного или более символа, используется только с [блаблабла] (Ex. [0-9+] т.е. рерайт будет производиться 1 или более символами от 0 до 9)
? - тоже самое что и "+", но юзается ни одного или один указанный символ)
* - малоэффэективная переменная на мой взгляд. Но все же ее суть в том чтобы заменить образно говоря всем чем попало )
$ - конец строки. в приныипе работает и без него
% - задает переменную идущую из RewriteCond (читаем про него дальше)
Плюс к этому можно заюзать RewriteCond, т.е. задается не правило переписывания, а условие (!!!). Синтаксис у них похожий.
что мы можем им сделать... рассмотрим на примере
RewriteRule ^(forum)/(topicID)$ /read-$1-topic-$2
Причем образуется
read-#forum-and-#topicID
где #forum название форума, #topicID айдишник топика.
Всем переменным дан номер по мере их появления, и условие и правило имеют по 2 переменные (в данном примере естесно, а вообще хоть 100, кто вам мешает), которые задаются круглыми скобками, потому чтобы юзать их, вам надо поставить их в туда, где они вам нужны в конечном результате-ссылке.
Скомбинируем и правило и условие
RewriteCond %{CONDITION_STUFF} ^(forumname)/directory/(topicID)
RewriteRule ^(forumname)/directory/(topicID)$ /our_forum-$1-topic-%2
Этим мы перепишем ссылку с многочисленными параметрами до сл типа
forumname-forum-topicID
Можно в принципе и без слешей. но имхо надписи будут сливаться =)
Тут на ум приходила веселая регулярка
RewriteRule ^([^.]+)$ /index.php
После прочтения вам не кажется немного странной ? =) Правы.. она переписывает все по правилу все, кроме любого символа, сам лично не пробовал, но кто проверит что выдаст апач на это просьба отпишитесь =)
Итак. Мы научились юзать RewriteRule и RewriteCond, юзать мод рерайт для обеспечение безопастности на сервере (например от sql inj) и просто для украшения и запоминания ссылок.
Спасибо за прочтение :) 2nd part coming up
(ц) blackybr
A rewrite engine is a piece of web server software used to modify URLs, for a variety of purposes.
т.е. некий модуль для вэб сервера, позволяющий модифицировать линки.. Вообще сам энжин рерайта существует как на для апача, так и для мелкомягкого IIS, и даже для java платформ =) В этой статье пойдет речь именно о mod_rewrit'е для апача.
Все что от нас понадобится - файл .htaccess в корне, если же у вас он есть.. то нужно просто напросто дописать в нем определенные строки.. ну и конечно если хостер до сих пор не установил этот модуль, то его нужно немного попинать ногой..)
Лично я юзаю полные ссылки в .htaccess, если же вы хотите использовать относительные ссылки типа /index.php?blabla=31337 то желаьельно включить в файлик следущие строчки, которые хоть и немного но ускоряют работу
DocumentRoot /home/htdocs/www
<Directory /> Options FollowSymLinks
</Directory>
то бишь если у вас сайт в www, а опция не врублена, то апач будет пытаться найти файл Index.php сначала в /home/ потом в /home/htdocs/, ну и в конце концов наткнется на /home/htdocs/www/index.php. Мелочь конечно, но пару сотых секунды сэкономите..) либо можно в каждом файле писать перед рерайтрул он сл. фразу
Options +FollowSymLinks
Вообще у него можно найти довольно таки много вариантов применения.. самый популярный из них - это преобразование ссылки в более читабельный вид ) .. ну найдите мне человека которому бы понравилась ссылка вида
http://site.com/index.php?action=forum&forum=theme01
Сделаем из нее например
http://site.com/forum/someshit.htm
Для этого нам нужно сначала подключить сам RewriteEngine
RewriteEngine On
затем переписывается сам url
RewriteRule ^ ([a-z]+)/([a-z0-9]+).htm$ index.php?action=$1;forum=$2
Разберемся с этой несложной конструкцией...
RewriteRule просто задает начало строки переписывания.
([a-z]+)показывает что все до слэша заменяется маленькими латинскими буквами от a до z (все записывается в переменную $1)
дальше после слэша видим ([a-z0-9]+).htm, т.е. здесь мы заменяем все что после слэша мелкой латиницей от a до z и цифрами от 0 до 9 (переменная $2), а после этого добавляем в конец url'а расширение htm. Как вы понимаете таких .htm файлов у вас на сайте не было и не будет, просто так ссылки показываются в более удобном виде.
Тут главное запомнить - после RewriteRule идет 1ое - как переделывать, а затем что переделывать, думаю не особо сложно =)
Как вы понимаете чтобы форум полностью переписывал ссылки с параметрами в вид htm (не обязательно htm, можно любое раширение, на которое у вас хватит воображения) для всех существующих передающихся GET'ом параметров... будь то поиск, темы, форумы, личные сообщения в конце концов.. главное тоже не переусердствовать =)
Расмотрим еще один небольшой пример (тут я использую уже относительные ссылки)
сделаем из
http://site.com?index.php?forum=someshit&nickname=hacker&userID=31337
Перепишем под
http://site.com/someshit/31337-hacker.htm
Сначала как я сказал выше подрубим
Options +FollowSymLinks
потом
RewriteEngine On
RewriteRule ^([^/]+)/([0-9])-(.+)\.htm$ index.php?forum=$1&nickname=$2&userID=$3
первая строчка понятна, раберем 2ую. ([^/]+) - до слэша разрешаем юзать любые символы (ну а вдруг у нас в названии форума попадется и цифра.. хотя можно и что-то вроде ([a-zA-Z0-9]+), но тут не будет показываться например тире).
После ([0-9])-(.+) т.е. во 2ой части "конечного файла" мы вписываем саму переменную $2 (которая равна "hacker"), а в первую записываем только цифры (у нас это например айди юзера равное 31337) ( ([0-9]) ).
Ну и добавляем в конце расширение. Вторая часть строки в комментрариях не нуждается.. т.е. там всего лишь указано что переписывать. Все 3 значения переменных.
Еще раз поясню сами регулярные переменные
[a-z] - нижние латинские буквы
[A-Z] - заглавная латиница
[0-9] - цифры
кстати к слову... вы также можете юзать и [c-y] или [4-8] то есть любой рендж цифр/букв.
^ - у него два типа юзания.
1) когда он внутри квадратных скобок, он обозначает отрицание. т.е. [^ab123] означает что замена будет происходить любыми символами, кроме a,b,1,2,3
2) обозначает начало регулярки (Ex. RewriteRule ^ /*выражение*/
точка - любой одиночный символ
+ - юзание одного или более символа, используется только с [блаблабла] (Ex. [0-9+] т.е. рерайт будет производиться 1 или более символами от 0 до 9)
? - тоже самое что и "+", но юзается ни одного или один указанный символ)
* - малоэффэективная переменная на мой взгляд. Но все же ее суть в том чтобы заменить образно говоря всем чем попало )
$ - конец строки. в приныипе работает и без него
% - задает переменную идущую из RewriteCond (читаем про него дальше)
Плюс к этому можно заюзать RewriteCond, т.е. задается не правило переписывания, а условие (!!!). Синтаксис у них похожий.
что мы можем им сделать... рассмотрим на примере
RewriteRule ^(forum)/(topicID)$ /read-$1-topic-$2
Причем образуется
read-#forum-and-#topicID
где #forum название форума, #topicID айдишник топика.
Всем переменным дан номер по мере их появления, и условие и правило имеют по 2 переменные (в данном примере естесно, а вообще хоть 100, кто вам мешает), которые задаются круглыми скобками, потому чтобы юзать их, вам надо поставить их в туда, где они вам нужны в конечном результате-ссылке.
Скомбинируем и правило и условие
RewriteCond %{CONDITION_STUFF} ^(forumname)/directory/(topicID)
RewriteRule ^(forumname)/directory/(topicID)$ /our_forum-$1-topic-%2
Этим мы перепишем ссылку с многочисленными параметрами до сл типа
forumname-forum-topicID
Можно в принципе и без слешей. но имхо надписи будут сливаться =)
Тут на ум приходила веселая регулярка
RewriteRule ^([^.]+)$ /index.php
После прочтения вам не кажется немного странной ? =) Правы.. она переписывает все по правилу все, кроме любого символа, сам лично не пробовал, но кто проверит что выдаст апач на это просьба отпишитесь =)
Итак. Мы научились юзать RewriteRule и RewriteCond, юзать мод рерайт для обеспечение безопастности на сервере (например от sql inj) и просто для украшения и запоминания ссылок.
Спасибо за прочтение :) 2nd part coming up
(ц) blackybr