Как сделать чпу htaccess

Обновлено: 07.07.2024

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

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

    Создание ЧПУ

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

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

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

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

    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 . Соответственно, если в регулярном выражении присутствует несколько извлекаемых подстрок, нужно указывать требуемый их номер очередности.

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

    Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!

    Что такое ЧПУ?

    Что такое ЧПУ

    ЧПУ – это исковерканная англоязычная аббревиатура SEF URL (search engines friendly url). Она обозначает адреса ссылок, которые дружелюбны для поисковых систем. О ЧПУ я также писал в статье про внутреннюю оптимизацию сайта. В русскоязычном варианте SEF URL пишется как ЧПУ – человеко-понятные url. Что всё это значит? Это значит, что адреса ваших ссылок будут иметь осознанный текст, а не технический мусор, за примером можете сходить по ссылке выше.

    Какие преимущества дают SEF URL?

    Во-первых, очевидно, что ЧПУ ссылки уже в самом своём адресе могут содержать полезную для пользователя информацию. Из такого адреса сразу понятно, о чём будет статья или страница в целом.

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

    В-четвёртых, безопасность. Сайты с ЧПУ ссылками не содержат в своём адресе техническую информацию переданную методом GET (уроки PHP), которую можно запросто использовать для взлома сайта.

    И последнее: ЧПУ – как средство навигации. Если ссылка понятна пользователю, то он сам может переходить по разделам сайта, просто редактируя ваш URL. Например:

    Если удалить из данной ссылки её последнюю часть (2-sublime-text-2), то мы попадём в раздел, к которому относится данная статья:

    Недостатки ЧПУ ссылок

    Первое: возможно, вам придётся повозиться и даже помучаться, чтобы их настроить или вовсе сделать с нуля.

    Когда ЧПУ не нужны?

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

    Также ЧПУ будет излишеством в back-end вашего сайта, то есть в панели администратора.

    Что ещё нужно знать о ЧПУ?

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

    SEF URL

    Но что если мы имеем дело с сайтом на чистом PHP, без CMS, или же хотим разработать свою собственную CMS в которой хотим сделать SEF URL? Для подобных случаев, а также для людей, которые хотят углубиться и понять всю суть преобразований обычной ссылки в ЧПУ, я и написал остальную часть статьи. Если вы читали мои предыдущие статьи, то знаете, что мой блог как раз относится к этой категории, то есть сайтам, написанным с нуля на PHP, без использования готовых CMS.

    Ах да, ещё один момент: из личного опыта не советую делать кириллических URL.

    Коротко: в чём вся суть?

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

    Суть в том, чтобы из красивого и понятного человеку URL (ЧПУ) сделать на лету URL, который будет полезен разработчику PHP (не ЧПУ):

    При этом всем на свете (посетителям, поисковым системам, всем) будет видна именно ЧПУ ссылка, но мы как разработчики PHP будем знать, что таит в себе URL на самом деле. В конце статьи, для полного понимания, я покажу все этапы, как ЧПУ работают у меня на блоге.

    Создание SEF ссылок с помощью mod_rewrite

    Все наши правила преобразований URL записываются в небезызвестный файл .htaccess, который должен лежать в корне нашего сайта.

    Для корректной работы mod_rewrite в нём обязательно должна быть написана следующая строка:

    Далее подключаем наш модуль rewrite к конкретной папке, то есть к папке, в которой лежит наш .htaccess:

    Имеем следующий файл .htaccess:

    Правила и условия mod_rewrite

    Все правила записываются с помощью команды RewriteRule, после которой ставится пробел и записывается шаблон ваших ЧПУ с помощью регулярных выражений, далее ставится ещё один пробел и указывается строка, в которую мы хотим преобразовать данный шаблон, где $1,$2,…$n – наши переменные. Более подробно о регулярных выражениях вы можете узнать по приведённой выше ссылке, а также далее в данной статье. Давайте рассмотрим пример:

    Где ^useful/([a-z]*) – это шаблон ожидаемого url,

    а /index.php?category=useful&article=$1 – это то, во что мы его конвертируем, если пришедший URL подошёл под шаблон.

    При этом $1 равен тому, что написано в круглых скобках, то есть $1 = [a-z]* Если бы круглые скобки встречались 2 раза, то у нас были бы переменная $1 и $2, если круглые скобки встречаются 3 раза, то переменные $1, $2, $3 и так далее. При этом переменные создаются в том же порядке, как идут круглые скобочки.

    Понятно? – молодцы. Непонятно? - идёмте дальше, мы ещё к этому вернёмся. Также хочу обратить ваше внимание на то, что для лучшего понимания статьи, вы уже должны обладать начальными знаниями о PHP, а также о работе с методами GET и POST. Продолжаем.

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

    То есть на данном этапе вам важно понять саму суть: в ЧПУ ссылках не передаются параметры, а без параметров мы не можем ничего сделать в PHP с этой ссылкой, поэтому с помощью mod_rewrite мы преобразуем ЧПУ ссылку без параметров в не ЧПУ ссылку с параметрами. Что такое параметры? В примере выше имеем 2 параметра:

    Параметр category и параметр article.

    Опять-таки обращаю ваше внимание, что про параметры вы уже должны были знать, я лишь вкратце вам напомнил.

    В шаблонах мы можем использовать символы и символьные классы. Символ точки обозначает абсолютно любой символ.

    • . – любой одиночный символ
    • [redf] – это класс символов. Обозначает наличие одного из перечисленных символов с учётом регистра.
    • [a-z] – класс символов. Обозначает наличие одного из символов в промежутки от a до z, то есть весь английский алфавит.
    • [a-zA-Z] – то же самое, только без учёта регистра, то есть весь алфавит, включая и большие и маленькие буквы.
    • Можно и с цифрами: 5
    • Естественно, всё можно комбинировать: [a-zA-Z0-9]
    • [^rewfad] – класс символов, но со знаком ^ внутри квадратных скобочек обозначает, что шаблон НЕ должен содержать данных символов.
    • site|cite – обозначает альтернативу: подходит site или cite.

    Квантификаторы или кванторы

    Все предыдущие примеры обозначали один символ (одну единицу), а что если мы хотим показать, что символов из этого промежутка [a-zA-Z] может быть не один, а сколько угодно. Для этого мы должны использовать квантификаторы:

    • ? — 0 или 1 символ из предшествующего текста (класса символов, символа и тд.)
    • * — 0 или любое количество символов из предшествующего текста (n>0)
    • + — 1 или любое количество символов из предшествующего текста (n>1)
    • — ровно n символов, где n – конкретное число.
    • — должно быть ровно 4 символа из предшествующего текста.
    • — 4 или 5 символов
    • — от нуля до 6 символов
    • — от 4 до бесконечности символов

    Примером может послужить наша уже известная строчка:

    В которой мы применили квантификатор (квантор) звёздочку (*) после класса символов [a-z]. Это значит, что в нашем URL после useful/ могут находиться символы от a до z в любом количестве и, естественно, в любой последовательности, а могут и не быть вовсе. Домен в счёт не берём, он подразумевается сам по себе.

    Экранирование

    Также при составлении шаблона не стоит забывать и про экранирование. Если вы хотите заключить в класс символов, например, символ точки, то вам нужно её заэкранировать, так как без экранирования точка (служебный символ) обозначает абсолютно любой символ:

    Тоже самое касается и квадратных скобочек, они у нас обозначают класс символов, поэтому если в вашем url могут быть квадратные скобочки их нужно заэкранировать:

    Ограничение начала и конца строки (маркеры)

    Для того чтобы указать начало или конец строки, без учёта домена, используются символы:

    То есть в нашем первом примере мы указали, что наш шаблон начинается именно с начала URL, а не откуда угодно (с середины, с конца):

    Обращаю ваше внимание на то, что знак ^ внутри квадратных скобок обозначает отрицание, не путайте!

    Обратные связи в mod_rewrite

    %n – то же самое, только в RewriteCond. RewriteCond мы ещё не рассматривали, он у нас впереди.

    Итак, если RewriteRule – это наши правила преобразования URL, то RewriteCond – это условие, аналог if в PHP. RewriteCond нужно в ситуациях, когда вам необходимо выполнить URL преобразование (RewriteRule) только при выполнении какого-то условия.

    У сервера есть свои собственные переменные, которые мы можем использовать в наших условиях RewriteCond:

    Синтаксис применения серверных переменных таков:

    Давайте составим наше первое условие:

    Если посетитель зашёл с браузера Mozilla Firefox, то выполняем следующее правило. Как видите, в отличие от PHP мы не используем фигурные скобки для обрамления нашего правила, которое выполнится, если условие TRUE.

    RewriteCond позволяет использовать операторы сравнения: (больше), = (равно). Также есть специальные значения, например:

    • -d (является ли каталогом)
    • -f (является ли файлом)
    • -s (является ли файлом с ненулевым размером)
    • ! – отрицание.

    Флаги

    • nocase|NC – можно писать либо nocase, либо NC, это одно и то же, обозначает регистро-независмость. То есть мы можем больше не писать:

    Вместо этого написать так:

    Если нужно поставить одновременно несколько флагов, ставим их через запятую, например:

    Как вы уже могли догадаться, mod_rewrite можно использовать не только для ЧПУ, но и для многих других интересный целей, например, клоакинга – это метод чёрного SEO, когда по одному и тому же адресу посетителям отдаётся одна страница, а поисковым роботам совершенно другая. Ну и под конец статьи, я покажу вам живой пример использования всего написанного выше и как же это всё работает взаимодействуя с нашим PHP.

    Живой пример использования mod_rewrite

    Итак, вот какой вид имеет мой файл .htaccess:

    На этом работа .htaccess завершена и на сцену выходит PHP. Следующий код размещён в index.php:

    О том, как работает конструкция switch, я подробно писал в статье по указанной ссылке. Вот и всё, дамы и господа! Наконец-то наша статья подошла к логическому завершению, и теперь вы сможете попрактиковать полученные знания. Я прощаюсь с вами до выхода новой статьи, а напоследок хочу привести интересную цитату:

    Но как мы все понимаем, этим возможности htaccess не ограничиваются, с помощью настроечного файла можно делать уйму полезных вещей для вашего сайта.

    Сегодня я хочу рассмотреть, что нужно прописывать для ЧПУ в .htaccess.

    Конечно, если у вас установлена одна из популярных CMS, например, DLE, Joomla, WordPress и другие, тогда, конечно же, рекомендую использовать настройки, которые предоставляет ваша система управления контента. Сегодня у каждой современной CMS есть для этого свои настройки и модули.

    А для тех, у кого все сложнее, кто строит своими руками, пройдем по пунктам.

    Как настроить ЧПУ в .htaccess

    Выглядеть это будет примерно так:

    Как видите, ничего сложного.

    Да уж, статьи в последнее время у меня выходят совсем небольшие) Но надеюсь информативные.

    В большинстве современных CMS, где с помощью плагинов, а где и в самом ядре системы, реализована поддержка ЧПУ – человекопонятных адресов. Если вы посмотрите на адресную строку моего блога, то увидите что-то типа этого

    А действительно, зачем это делать? Далеко не каждый человек вообще обращает внимание на адресную строку, тем более пытается там что-то разобрать. Дадим слово гуглу:

    То есть, применительно к нашему блогу разбиваем url на части:

    Однако, если в КМС есть уже поддержка ЧПУ, транслитерация и другие инструменты, то, например, на моем блоге этого нет – у меня самописная CMS. Как же реализовано? Все просто, ниже покажу как.

    Сначала небольшая ремарка. Если у вас есть какой-то опыт в сайтостроении, но вы не умеете делать ЧПУ с помощью .htaccess и php, то можете подумать, что я создал три каталога, а в них поместил файл index.html. Действительно, в принципе можно сделать каталоги blog, notes и nc-php и в последний положить индексный файл – и это будет работать! Но в реальности никто так не делает, все работают с .htaccess и php.

    Теперь нам надо работать уже с PHP. Я снова возьму в пример свой сайт. Каждый материал на моем блоге доступен по адресу upread/art.php?id=xxx, где xxx – некоторое число, идентификатор материала. Как же нам передать идентификатор в файл job.php? Ну на самом деле способов немало. Можно распарсить url и в зависимости от него выводить нужную информацию:

    Однако правильнее будет создать в базе данных отдельное поле для ЧПУ каждой записи и сравнивать перед выводом. Кстати, именно так реализован вывод, к примеру, в одной из самых распространенных CMS – WordPress. На картинке видно, что ЧПУ записан в поле post_name, а тот, из которого берется id материала - guid.


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

    Вот так просто может создать свой человекопонятный урл даже самый чайник в сайтостроении. Если вам что-то непонятно или необходимо настроить систему URL на вашем сайте, то пишите мне – за небольшое вознаграждение я вам помогу.

    Читайте также: