Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Использование материалов
Заметка #9
11 августа 2005

Динамика в статику (mod_rewrite)


    Насколько я помню, первым термин ЧПУ (человекопонятный УРЛ) ввел в широкое применение Дмитрий Смирнов (spectator.ru). Когда web-программист только узнает про mod_rewrite, первое же желание, переделать сайт из динамики в статику. Причины две: ссылка становится намного проще, а значит лучше запоминается (ЧПУ), и второе, такие ссылки лучше индексируются поисковыми роботами. Проблема же заключается в том, что полная документация по данному модулю достаточно сложна, и не сразу сообразишь, какую часть директив нужно использовать. Еще сложность с разбором может внести незнание регулярных выражений.
    Передо мной тоже встала задача преобразования динамики в статику. Здесь я хочу без особых мудрствований описать основы mod_rewrite.

    mod_rewrite это модуль Apache, которые может преобразовывать одни имена файлов в другие, а точнее он преобразует один URL в другой. Описание правил модуля происходят в файле .htaccess.

    RewriteEngine On – данная директива включает работу модуля.
    RewriteBase – здесь мы сообщаем, что мы будем обрабатывать лишь часть URL, следующий за главным слешем. Т.е. все, исключая название сайта.
    RewriteRule – собственно, сама директива преобразования. Она может встречаться несколько раз, и каждая такая директива описывает одно правило преобразования. Причем порядок следования RewriteRule важен, так как последующие преобразования происходят с результатом работы правила. Синтаксис:

    RewriteRule Шаблон Подстановка Флаги

    Встретив такое правило, Apache проверяет на соответствие текущего URL шаблону и если это соответствие присутствует, производит подстановку. “Флаги” могут отсутствовать.
    Под шаблоном понимается Perl совместимое регулярное выражение. Приведу только основное из синтаксиса регулярных выражений.

  . Обозначает любой одиночный символ
  [chars] Класс символов: Один из символов
  [^chars] Класс символов: Ни один из символов
  text1|text2 Альтернатива: text1 или text2

  ? 0 или 1 из предшествующего текста
  * 0 или N из предшествующего текста (N > 0)
  + 1 или N из предшествующего текста (N > 1)

  ^ Маркер начала строки
  $ Маркер конца строки

  \char экранирование конкретного символа (к примеру для указания символов ".[]()" и т.д.)

  (text) Группировка текста. Все что записано в скобках, используется как некий элемент, который в последствии мы можем добавить в Постановке. Причем все, что заключили в первую скобку, в подстановке будет фигурировать как $1, из второй скобки $2 и т.д.

    Пример преобразования

RewriteEngine On
RewriteBase /
RewriteRule ^news/(0-9+)$ /index.php?action=news&newcode=$1

    Расшифруем. До открывающей скобки шаблон означает, что URL должен начинаться со строки news/. Далее в скобках мы указали, что используются только цифры и должна присутствовать хотя бы одна цифра. Знак доллара означает, что после ряда цифр ничего быть не должно. Так как скобка группирует текст, то после преобразования, $1 будет заменен на рассмотренный ряд цифр. Т.е. URL /news/14 будет преобразован в /index.php?action=news&newcode=14.
    Флаги записываются в квадратных скобках через запятую. Приведу только несколько, остальные можно посмотреть в Интернете.
L – Последнее правило. Если правило сработало, то при таком флаге дальнейшие преобразования прекращаются.
C – Связь со следующим правилом (которое, в свою очередь, может быть связано со следующим правилом). Если есть соответствие правилу, то следующее правило выполняется как обычно, иначе все следующие связанные правила пропускаются.
    Пример:

RewriteRule ^news/(0-9+)$ /index.php?action=news&newcode=$1 [L]


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

    В заключении пара моментов. Все преобразования происходят на сервере, браузер о них не знает. Это важно помнить, так как браузер может запрашивать данные из каталога, которого на сервере реально не существует. Например, в нашем запросе /news/14 браузер будет считать, что текущий каталог news, а 14 это запрашиваемый документ, в то время как скрипт index.php будет выполняться в корневом каталоге. Этот нужно учитывать в случае, когда мы, например, вставляем в документ картинку. Перед каталогом нужно обязательно поставить слеш (“/”), иначе картинка будет искаться не относительно корня, а относительно каталога news.
    Второй момент заключается в том, что для Apache нет разницы между скриптом и, например, файлом изображения. Браузер запрашивает у сервера картинку точно также, как и любой другой документ - по HTTP протоколу. Это значит, что правила преобразования будут также распространяться и на картинки. В этом случае, чтобы не было конфликта имен преобразований и имен каталогов, следует описывать правила, запрещающие преобразования. К примеру, если все картинки хранятся в каталоге /images, то нужно дописать такое преобразование:

RewriteRule ^images/(.+) - [L]



© 2005-16, Powered By Digs (Написать письмо, vk)