PHP: создание ЧПУ в .htaccess

Основной проблемой любого динамического сайта является отсутствие читабельного URL-адреса. В тоже время, читабельный URL-адрес это подсказка о содержащемся на веб-странице контенте. Таким образом, возникает необходимость создать полноценный ЧПУ. Решением может служить использования модуля преобразований на стороне веб-сервера. В данной статье я хочу помочь Вам решить задачи по созданию ЧПУ и настройке преобразований в файле .htaccess с целью дальнейшей обработки запросов пользователей в PHP-скрипте.

Содержание:

  • Создание ЧПУ
  • Настройка преобразований в .htaccess
    • Разбор регулярного выражения в RewriteRule
  • Обработчик ЧПУ на PHP
  • Подведём итоги

Создание ЧПУ

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

Например, если: category/name/ – обрабатывается вполне успешно, то вот просто: category/ – даже при наличии соответствующей директивы в файле .htaccess, выдаёт предупреждение. Впрочем, это никак не сказывается на работе самого сайта. Помимо этого есть и ряд других проблем, но я не буду в них вдаваться, т.к. они носят чисто субъективный характер.

Настройка преобразований в .htaccess

При создании сайтов, лучше использовать несколько более простое преобразование URL-адресов, передавая ЧПУ управляющему php-скрипту. Для этого в фале .htaccess нужно указать что-то вроде следующего:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?furl=$1 [L,QSA]
</IfModule>

Давайте разберем приведенный пример подробнее.

ifModule – как следует из названия, эта директива проверяет наличия модуля mod_rewrite.c на сервере, который в свою очередь обеспечивает работу директив преобразований.

Далее идёт RewriteEngine – это директива, которая позволяет управлять статусом модуля преобразований. Обычно он отключен, используя директиву RewriteEngine, мы можем его включить. Для этого в качестве значение указываем: on.

Следующий набор директив RewriteCond определяют условия, при которых происходят дальнейшие преобразования. В приведенном примере добавлено три исключения: не файл (!-f), не ссылка (!-l) и не директория (!-d), которые уже существуют без преобразования.

Другими словами, если на сайте есть файл filename.html и к нему идёт обращение, то будет открыт именно этот файл, а не передан запрос обработчику ЧПУ. Таким образом, мы решаем сразу ряд проблем.

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

Последняя директива RewriteRule, определяет правила для механизма преобразований. В нашем случае, это фрагмент URL-адреса начинающийся после доменного имени и заканчивающийся символом вопрос (?), если таковой есть. Он будет передана php-скрипту index.php в качестве значения переменной furl.

Другими словами, php-обработчик получает только ЧПУ, не исключая возможности получения и динамических параметров, методом POST и/или GET.

Разбор регулярного выражения в RewriteRule

Сделаю небольшое отступление и разберу используемое в примере регулярное выражение: ^(.*)$.

  • Символ галочки (^) обозначает начало строки запроса.
  • Круглые скобки предназначены для выделения групп регулярных выражений и извлечения подстроки.
  • Точка (.) означает не менее одного символа, за исключением символа перевода строки.
  • Звездочка (*) означает любое количество символов в строке, предшествующих ей.
  • Доллар ($) соответствует концу строки запроса.

Другими словами, мы извлекаем подстроку, состоящую из всех символов запроса, от начала и до конца.

Далее идет указание php-скрипта index.php от места расположения файла .htaccess. В качестве значения параметра furlздесь выступает первая (а в нашем случае и единственная) извлекаемая подстрока. Для этого в качестве значения указанна переменная регулярного выражения $1. Соответственно, если в регулярном выражении присутствует несколько извлекаемых подстрок, нужно указывать требуемый их номер очередности.

Отдельно хочу отметить, что регулярное выражение может быть и более сложным, но в нашем случае приведенного примера будет более чем достаточно.

Подведём итоги

В данной статье приведён рабочий пример, который позволяет передать PHP-обработчики фрагмент URL-адреса с целью динамического формирования нужного контента на запрос пользователя. Используемые в файле .htaccess директивы и регулярное выражение описаны в достаточной степени, чтобы решить поставленную задачу на осознанном уровне. На этом у меня всё. Спасибо за внимание. Удачи!