Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Псевдостатика на базе правил mod_rewrite

Из нескольких вариантов реализации псевдостатики самый популярный и пожалуй, самый удобный – преобразование ссылок с помощью модуля Apache mod_rewrite. Преобразование URL перед их обработкой – прямое назначение этого модуля. Модуль по умолчанию включен в рабочую конфигурацию Apache практически на любом Unix-хостинге, где есть поддержка скриптовых языков. Знакомство с ним необходимо любому вебмастеру, поскольку он позволяет решать множество проблем.

Для тех, кто еще не знаком с механизмом преобразования, предельно кратко расскажу, в чем суть. Правила преобразования для mod_rewrite представляют собой шаблоны регулярных выражений. Когда включен механизм преобразований, любой поступивший запрос проверяется на соответствие условиям и правилам. Если запрошенный URL соответствует шаблону условия, он преобразуется по правилам для этого условия и уже после этого Apache обрабатывает преобразованный URL. Если ни один шаблон не подходит, URL обрабатывается в своем первоначальном виде.

Полное описание модуля mod_rewrite и синтаксиса его правил нет смысла приводить здесь. Самый лучший вариант документации на русском языке приведен на сайте www.egoroff.spb.ru в статье «Модуль Apache mod_rewrite». Руководствуясь этой статьей, можно научиться творить с mod_rewrite что угодно.

Конечно, этот модуль вначале заставит вас много думать, пока вы не разберетесь в его логике. Но возможности стоят того, чтобы хорошенько его изучить – в практике вебмастера часто могут встретиться случаи, когда без него не обойтись. Это не только псевдостатика, но сейчас речь именно о ней.

Применение mod_rewrite должно согласовываться с движком и требует хорошо продуманной структуры URL. В первую очередь нужно позаботиться о GET-параметрах. Их значения нам нужно будет заложить в псевдостатические ссылки, чтобы потом mod_rewrite извлек их оттуда, восстановил истинный URL и передал его в обработку. Любая реализация псевдостатики плохо подходит для движка, требующего много параметров в ссылках, это необходимо учесть сразу, еще на этапе разработки движка.

Методику можно рассмотреть на живом примере – хотя бы на примере движка этого сайта. Он был изначально построен с учетом преобразования URL, поэтому количество параметров в ссылках ограничено до необходимого минимума, а названия параметров унифицированы. Основной скрипт для вывода страницы использует только параметр id (алиас страницы), а плагинам (если на данной странице они установлены) может потребоваться еще два параметра – pg и rid. Причем, параметр pg для каждого плагина, где он использован, будет иметь свое назначение. В многостраничной выдаче списков (галерея, раздача файлов) это номер страницы, в ленте новостей это числовой идентификатор новости, но в любом случае это число.

Теперь составляем правила преобразования ссылок.
Исходные ссылки (те, что будут видны на сайте):

Из них необходимо получить:

Поскольку файл скрипта для вывода у нас во всех случаях один и тот же, его имя в ссылках может не фигурировать. Мы и так знаем, как его зовут, и мы заложим его название в правила. Остается восстановить параметры из имен псевдофайлов. Правила будут выглядеть так:


# Включаем преобразование URL
RewriteEngine on
# Назначаем базу преобразований
RewriteBase /

# Условие преобразования
RewriteCond %{REQUEST_FILENAME} !-f
# Правила преобразования
RewriteRule ^([a-z0-9]+)\.html$ main.php?id=$1 [L]
RewriteRule ^([a-z0-9]+)\-([0-9]+)\.html$ main.php?id=$1&pg=$2 [L]

Первая директива включает механим преобразования URL. Вторая определяет, что базовой ссылкой для преобразований является корневая директория сайта. Далее следует условие преобразования – запрошенный файл не является реально существующим файлом в данной директории. Обратите внимание – это условие необходимо в абсолютном большинстве случаев. Если вы поместите в корне сайта файл идентификации для Google Webmaster Tools, он должен быть доступен и движок не должен пытаться преобразовать ссылку на этот файл. Кроме того, механизм преобразования не должен попусту анализировать имена файлов изображений и стилей. Это немного сэкономит ресурсы сервера и позволит избежать ошибок.

После условия следуют правила преобразования. Все ссылки, которые удовлетворяют условию, будут последовательно проверяться по шаблонам правил, пока не найдется подходящее правило. Тогда ссылка будет преобразована по этому правилу.

Каждое правило состоит из слова RewriteRule, за ним через пробел следует шаблон, на соответствие которому проверяется ссылка. Следом через пробел – шаблон подстановки. Разберем состав правил на примере второго правила.

Шаблон начинается со знака ^ – он означает «строка начинается с...». Знак $ означает «...и на этом строка оканчивается». Оба знака не обязательны – например, вы можете поставить знак ^, далее прописать то, с чего должна начинаться строка, а окончания не обозначать и это будет значить «строка начинается с этого, и неважно, чем она оканчивается». Или наоборот – бывает важно, чем оканчивается строка, а начинаться она может с чего угодно. Если в шаблоне нет признаков начала и конца строки, значит правило сработает на строке, в любом месте которой встречен фрагмент, совпадающий с шаблоном.

В круглых скобках даны паттерны – маски фрагментов, которые будут сохранены и подставлены в шаблон замены. В квадратных скобках дан диапазон символов, из которых должен состоять паттерн – в первом паттерне это латинские буквы от «a» до «z» и цифры от 0 до 9. Во втором паттерне это только цифры. Знак + после допустимых символов означает «не менее одного символа из указанных». Обратный слэш «экранирует» специальные символы, чтобы они принимались как есть. Это необходимо, поскольку минус используется для обозначения интервалов, а точка без экранирования понимается как «любой символ».

Шаблон этого правила можно описать таким образом:

Как видим, первые две ссылки из приведенных выше для примера не соответствуют этому правилу. А вот третья и четвертая соответствуют полностью. Значит, именно они будут этим правилом преобразованы. Теперь точно так же расшифруем шаблон подстановки. Он предписывает заменить ссылку на следующую:
main.php?id=паттерн1&pg=паттерн2

Стоящий в конце правила флаг [L] означает «в случае совпадения это правило считать последним». На соответствие нижележащим правилам ссылка проверяться уже не должна.


Конечно, это очень простой пример. Конечно же, многие всё это знали и без меня. Но тех, кто до сих пор не знал, как это делается, спешу поздравить. Вы только что разобрались в основах работы регулярных выражений. ;-)