Обикновени магии с Mod_rewrite
Модулът mod_rewrite за Apache е едно от най-разпространените, най-известни и в същото време най-плашещи новите потребители приложения. Някои казват, че с него може да се направи на практика всичко, което е свързано с URL-адреси (Uniform Resource Locator) и вероятно са прави.
Само синтаксисът на параметъра RewriteRule може да бъде толкова сложен - особено с включването на много и сложни регулярни изрази - че е оправдано твърдениета, че mod_rewrite може да прави магии. В рамките на доброто настроени трябва да щажем, че границата с неразбираемата черна магия, все пак е трудно забележима. В същото време докато използва mod_rewrite по-неопитен разработчик може спокойно да се обърка дотолкова, че да загуби половин ден за възстановяване правилното поведение на адресите в уеб сайта си.
Какво е mod_rewrite и каква да знаем за него?
Казано накратко, mod_rewrite е начин за показване на уеб адреси, които са лесни за четене, разбираеми са и не е проблем да ги издиктувате например по телефона. Основното правило при ползването му е да се придържаме към простите настройки. Ако ползваме готов софтуер, който включва примерни правила за пренаписване на уеб адресите е добре да ползваме тях.
Уеб сървърът подава към уеб приложението, по начин невидим за потребителя, различно оформен адрес, който съдържащ доста специални символи, като разделители на променливи и др. Потребителят обаче вижда адреси и работи с препратки, които са лесни за четене от човек, не от машина.
Например вместо адрес като http://sitename.com/?cat=2134&modulename=news&PHPSESSID=42342ac34f можете съвсем лесно да работите с http://sitename.com/news/politics. Далеч по-разбираемо, нали?
С такива сайтове не само е по-удобно се работи, но търсачките и Интернет директориите доста по-лесно ги разпознават и индексират. Една от станалите модерни дейности в Интернет маркетинга - SEO (Search Engine Optimization), която означава ”оптимизацията за търсачки”, включва работа с mod_rewrite. С него се ”изчистват” адресите. Уеб сайт с оптимизирани адреси има важно предимство пред конкурентите си при подреждането на резултатите от търсене по ключови думи и фрази в Google, например.
Ако искате да пренаписвате уеб адреси с mod_rewrie имате достъп до правилата за това от две места - от файла с настройки на уеб сървъра (основният файл или този с настройките на виртуалния хост, ако са в отделен файл) и от скрития файл “.htaccess” в съответната уеб директория. Да разгледаме набързо втория вариант, който е по-разпространен и е почти сигурен, особено ако ползвате т. нар Shared hosting.
Apache чете настройките на уеб директориите в един специален файл - “htaccess”. Той е скрит, което се обозначава с точката отпред. За работа с кратки адреси е необходим .htaccess във всяка уеб директория. По принцип целият ви уеб сайт има една начална страница - т. нар. “index” файл (намира в основната директория) r затова най-вероятно всички настройки също се намират там, в съседния му .htaccess.
Ако модулът mod_rewrite не е инсталиран или не е разрешен за достъп от потребителските директории, включването на правила за пренаписване ще доведе до грешка. Затова най-добре е да оградим настройките за mod_rewrite с проверка.
Започваме да пишем между тези, като първо заявяваме начало на настройките с реда “RewriteEngine on”. След това си имаме работа с няколко вида настройки - RewriteBase, RewriteCond и най-често използваното RewriteRule.
RewriteBase
RewriteBase се използва за указване на тази част от уеб адреса, която не се променя. Тя се взима за “основа” на всички адреси под съответната уеб директория. Тоест ако всички пренаписвания, които ще правите са в директория /test, тогава задаваме за основа да се използва “/test”, без наклонена черта накрая RewriteBase/test.
RewriteRule
Най-често ще използвате правила, поредици от RewriteRule. Те задават, как точно да бъде пренаписан даденият URL. Синтаксисът на правилата е следният: “RewriteRule шаблон заместващ_низ флаг(ове)”. Шаблонът е съвпадението, което се търси, за да се замести с дадения низ. Флаговете задават допълнителни настройки за поведението. Например дали да се връща съобщение 301 (Permanently moved) и т.н. Задължителни са шаблонът и заместването, флаговете не са. В шаблона могат да се използват както точно изписани адреси, така и маскирани адреси с регулярни изрази. Например - RewriteRule ^news/(.*) categoria/novini/$1
Ще замени всички адреси, които започват с “news/” с адреси от типа “categoria/novini/” и накрая свършващите с това след “news/” в оригиналния адрес.
$1 тук означава първата променлива. Ако в шаблона има повече променливи, те могат да се извикват при заместването по реда им - $1, $2 и т.н. Комбинациите са много и нарастват със сложността на регулярните изрази. Ако ползвате готов софтуер за уеб сайт и той има пример за htaccess, може да вземете от него вариантите, които са дали разработчиците.
RewriteCond
RewriteCond е проверка за условие. Eдин или няколко реда с RewriteCond уточняват случая, в който да се приложи следващото след тях правило RewriteRule. Синтаксисът на условието е “RewriteCond %{променлива} условие”. Под променливи тук се разбират неща от обкръжението на уеб-сървъра, които могат да се сравняват със зададените условия. Някои от тези променливи са:
HTTP_USER_AGENT за идентификацията на браузъра на клиента, HTTP_REFERER за адрес на препратилата страница, REMOTE_ADDR за IP-адрес на клиента, REMOTE_HOST за dns-името на клиента и др.
При задаване на условието могат да се използват операторите и = (съответно отрицанията им с ! пред тях). Например
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /index.moz.php
Остава да помним основното - да правим малки, възможно най-прости промени и само когато и където са необходими. Подробна документация можете да намерите на уеб сайта на Apache.







