Главная

Программирование на PHP для начинающих

Динамическое преобразование ссылок (урлов)

URL (урл) - Uniform Resource Locator - уникальный адрес веб-документа. Часто в адресе присутствуют переменные, которые разделяются спецсимволами (чаще всего это знак амперсанда - &, иногда точка с запятой - ;). Было время, когда поисковые роботы не совсем корректно индексировали странички с такими параметрами, и вебмастера старались создать псевдостатичные ссылки, т.е. скрипт формировал ссылки без этих параметров, а при переходе по такой ссылке, она преобразовывалась в ссылку с переменными. Например, ссылка http://www.site.ru/id153.php преобразовывалось в http://www.site.ru/index.php?id=153

За такое преобразование отвечает файл .htaccess.

Директивы mod-rewrite

Файл .htaccess должен содержать команду запуска модуля преобразования ссылок (RewriteEngine on) и правило преобразования (RewriteRule), в нашем примере:

RewriteEngine on
RewriteRule id153.php index.php?id=153 [L, NC]

После правила преобразования дополнительно стоят квадратные скобки с параметрами через запятую. L - указывает, что это правило последнее (т.е. если ссылка совпала с правилом, то дальнейшие преобразования не учитываются), NC - указывает, что регистр роли не играет.

Писать правило для каждой странички было бы неудобно. Файл .htaccess позволяет применять регулярные выражения:

RewriteEngine on
RewriteRule id([0-9]+).php index.php?id=$1 [L, NC]

Мы изменили наш пример, теперь после id может стоять любой набор цифр, сами цифры подставляются во вторую часть преобразования с помощью символа $1. В правиле может быть несколько преобразований, например, с датами:

RewriteRule news/([0-9]+)/([0-9]+)/([0-9]+).php index.php?year=$1&month=$2&date=$3 [L, NC]

В данном случае мы преобразуем ссылку вида http://www.site.ru/news/2009/11/17.php, которая будет обрабатываться скриптом index.php с переменными $_GET['year'], $_GET['month'], $_GET['date'] с соответствующими значениями (число после $ соответствует порядковому номеру шалона в регулярном выражении)

Условия в mod-rewrite

Применять преобразования мы можем по условию, для этого перед RewriteRule можно добавить несколько строк с условиями с директивой RewriteCond. Самы простой повод применить условия для mod-rewrite - необходимость исключить директорию (например, админку) из такого преобразования. Тогда файл будет иметь следующий вид:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/admin/
RewriteRule id([0-9]+).php index.php?id=$1 [L, NC]
Hosted by uCoz