Делаем ЧПУ через Apache-модуль mod_rewrite | SelkinVitaly.RU
Делаем ЧПУ через Apache-модуль mod_rewrite | SelkinVitaly.RU

Делаем ЧПУ-адреса с mod_rewrite

Рубрика: Файл .htaccess

Просмотров: 7824

Приветствую вас, дорогие читатели! В прошлой статье по технологии PHP+MySQL я упомянул Apache-модуль mod_rewrite, который позволяет преобразовывать URL адреса.

ЧПУ ссылки и Apache-модуль mod rewrite

Так как преобразование в ЧПУ осуществляется с помощью регулярных выражений, а это целый язык, требующий изучения, то в этой статье хотел бы рассказать о самым популярных форматах преобразования. Но сначала немного теории.

Mod_rewrite - мощный Apache-модуль, который входит в состав дистрибутива. Как же происходит замена URL? Работа модуля осуществляется по принципу "на лету". То есть когда пользователь обращается по ЧПУ-адресу, модуль сразу же проверяется адрес, который замаскирован под ЧПУ, и обращается к ниму. Естественно, посетитель этих манипуляций не замечает и ему кажется, что он обратился по адресу, который ввёл в адресную строку браузера. Какие же преимущества имеют ЧПУ-адреса?

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

Активация модуля mod_rewrite

Как я уже сказал, модуль включён в стандартный дистрибутив, поэтому нам всего лишь нужно его активировать. Активация происходит в .htaccess. Итак, приступим. Открываем наш файл .htacces или создаём, если его нет. Прописываем следующую директиву:

RewriteEngine on

Отлично, теперь наш модуль активен и мы можем приступить в преобразованиям. Рассмотрим первый формат.

Статический ЧПУ-адрес с одной переменной

Итак, в этой статье я говорил, что сайты на PHP и MySQL имеют адреса следующего формата:

Делаем ЧПУ-адреса на сайте с PHP и MySQL

Как правило, такие адреса называют динамическими. Вот мы сейчас и займёмся преобразованием динамических адресов в ЧПУ.

Допустим, нужно преобразовать из lis.php?id=3 в bols3.hi. Регулярное выражение будет иметь следующий формат:

RewriteRule ^НАЗВАНИЕ СТРАНИЦЫ([0-9]+)\.РАСШИРЕНИЕ$ ИМЯ НАСТОЯЩЕГО АДРЕСА.php?ПЕРЕМЕННАЯ=$НУМЕРАЦИЯ

То есть в нашем случае получаем следующее:

RewriteRule ^bols([0-9]+)\.hi$ lis.php?id=$1

Теперь вместо адреса lis.php?id=90 (где 90 - id) мы можем спокойно обращаться к bols90.hi.

Статический ЧПУ-адрес с множеством переменных

Рассмотрим такую ситуацию, когда нужно преобразовать адрес с множеством переменных. Например, из lis.php?id=345&cat=3 в bols345-3.hi. Ситуация похожая, но сейчас используется две GET-переменные. В качестве разделителя используется тире. Получаем следующее выражение:

RewriteRule ^bols([0-9]+)-([0-9]+)\.hi$ lis.php?id=$1&cat=$2

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

Принцип преобразования модуля mod rewrite

Архивный ЧПУ-адрес

Многие архивы на сайте имеют адрес archive.php?year=2003&month=10. Мы же преобразуем его в archive/2003/10/. Получаем следующую строку:

RewriteRule ^archive/([0-9]+)/([0-9]+)\$ archive.php?year=$1&month=$2

ЧПУ-адрес для тегов

Сейчас теги присутствуют почти на каждом блоге и сайте. Попробуем изменить адрес для тега winter - posts.php?tag=winter в posts/tags/winter/. Имеем следующее выражение:

RewriteRule ^posts/tags/([0-9]+)\$ posts.php?tag=$1

Кстати, для индексации страниц с динамическими адресами поисковые системы применяют отдельный алгоритм. Я не знаю чем он отличает от обычного, но ЧПУ-преобразования, опять же, помогают указать роботу, что нужно индексировать наш адрес, как обычную статическую страницу.

Комментарии:

Добавил: Повар (11-Dec 2011 20:41:31)

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

Добавил: татьяна (01-Dec 2011 22:48:49)

Написала следующее RewriteEngine on RewriteRule ^mysite.ru/uslugi([0-9]+)\.php$ mysite.ru/uslugi.php?id=$1 на сайте и в строке адреса ничего не изменилось. Кроме написания команды в .htaccess, нужно ещё что-то делать? хочу преобразовать адрес mysite.ru/uslugi.php?id=3 Помогите пожалуйста, мучаюсь уже несколько дней

Добавил: Сергей (25-Nov 2011 22:32:53)

У меня работает пример вида: RewriteRule ^post([0-9]+)\.html$ view_post.php?id=$1 выводит post1.html вместо view_post.php?id=1 выводит post2.html вместо view_post.php?id=2 и т.д. Но мне надо сделать архивные адреса: Чтобы выводилось posts/1/ вместо view_post.php?id=1 posts/2/ вместо view_post.php?id=2 и т.д. Вот, как я писал команду: RewriteRule ^posts/([0-9]+)\$ view_post.php?id=$1 Ничего не получается, хотя вроде делаю всё, как написано у вас в статье. Во втором примере при попытке набрать в адресной строке posts/1/ вылазит 404 ошибка... Подскажите, пожалуйста.

Добавил: Aleks (14-May 2011 13:18:11)

есть статические и динамические страницы, для статических работает запись: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^geografic/?$ geo.php [L] Динамические в виде http://сайт.ru/ econom.php?r=1&p=1 т.е. : генерятся 4 страны ( от r=1 до r=4 ) где в каждой по 15 одинаковых характеристик (от p=1 до p=15 ) например: ссылки в виде http:// сайт.ru/econom.php?r=1&p=1 -для 1йстраны и 1 й характеристики, http:// сайт.ru/ econom.php?r=1&p=2 -для 1йстраны и 2 й характеристики и т.д. по http:// сайт.ru/ econom.php?r=4&p=15 -для 4йстраны и 15 й характеристики . Все эти ссылки размещены на одной странице Экономика - для чпу нужно в виде http:// сайт.ru/ economics-egipt-naselenie ( где economics –по сути это econom.php?, egipt - одна из 4х стран (r), naselenie - одна из 15 характеристик(p) С динамическими перепробовал – смог только сделать в цифрах: RewriteRule ^ economics ([0-9]+)-([0-9]+)\.html$ econom.php?r=$1&p=$2 – работает и получается economics 1-1.html (для 1й страны и 1й характеристики и т.д. для остальных, но как сделать в виде: economics-egipt (это r)-naselenie(это p) без html не пойму , туплю – еще чайник . Помогите пожалуйста.

Добавил: Максим (22-Mar 2011 20:43:22)

Здравствуйте! Спасибо вам за ваши уроки!!) Но на счет этого урока у меня возникли проблемы(( чуть-чуть подробней объяснить,,,,,, или даже сделать наглядный файл к этому уроку (что бы его можно было скачать) Спасибо!!!!)

Добавил: zato-rado (24-Jan 2011 12:34:59)

Привет всем.ПОдскажите. делаю переадресацию по правилам. набираю http://www.site.com/catalog/1 переходит на http://www.site.com/inside.php?catalogid=1. Всё хорошои правильно, но в строке браузера отображается старый url (www.site.com/inside.php?catalogid=1)юКак сделать так чтобы в строке браузера отображался ЧПУ ?Спасибо.

Добавил: не выходит ЧПУ( (01-Sep 2010 17:00:33)

в чем может быть причина? mod_rewrite включен. RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^feedback/([0-9]+)$ feedback.php?type=$1

Добавил: Аркадий (06-Aug 2010 13:05:28)

Пишу в .htaccess вот так кидаю его в корень сайта но это не работает что может быть подскажите пожалуйста. RewriteEngine On RewriteRule ^cat/([0-9]+)\.html$ cat.php?cat=$1

Добавил: Вальдемар (08-Apr 2010 11:58:49)

Действительно, очень хороший сайт и очень понятные объяснения. У меня задача очень похожая, но с одной важной особенностью. Был сайт динамический, а стал статический. Но в поисковиках проиндексированы в большом количестве старые динамические страницы. Нужно, чтобы при клике на старый динамический адрес, пользователь (да и поисковый робот) попадал на новый, реально существующий статический адрес. Например: было http://mysite.ru/?mark=bmw или http://mysite.ru/?mark=bmw&model=e46 стало http://mysite.ru/model/bmw.php Сколько не пробовал, ну никак не получается. Помогите, пожалуйста.

Селькин Виталий:
Просто уберите все ссылки, ссылающиеся на страницы по старому адресу. Через некоторое время они сами пропадут из индексации.

Добавил: Александр (12-Mar 2010 0:54:51)

Отличный сайт! Хорошо обьясняешь! Но вот вопрос на локальном сервере то беж дома как это сделать у меня Apache 1.3.27 включен ли в нем mod rewrite потому что у меня эфекту ноль я пишу RewriteEngine on RewriteRule ^page([0-9]+)\.htm$ index.php?a=$1 я начал с простого мне надо чтобы из http://www.exp.ru/index.php?a=1 получилось http://www.exp.ru/page1.htm файл .htaccess кидаю в корневую папку и шиш


Добавление комментария:

Имя *:

Email:

Текст *:

Символы на картинке *:

RSS-подписка
RSS-подписка на статьи по основам сайтостроения RSS-подписка на полезные уроки по web-языкам
Разделы статьй
Каталог товаров
Разделы уроков
Последние статьи
Последние уроки