Как сделать ЧПУ с помощью .htaccess
Если Вы умеете немного кодить и пишите свои скрипты, я вам расскажу как легко сделать ЧПУ (человеко понятный урл) с помощью .htaccess.
Что такое ЧПУ?
Например, у нас есть ссылка на страницу новостей с ID номером новости:
http://site.ru/news.php?id=4
Чтобы сделать такой URL красивее и удобнее, придумали ЧПУ, т.е. представление адреса, например в таком виде:
http://site.ru/news/4/
Скажете не очень наглядно? А вот такой пример:
http://site.ru/index.php?do=article&name=kak-sdelat-chpu
а с ЧПУ:
http://site.ru/articles/kak-sdelat-chpu/
Сделать это очень просто. Для веб-серверов Apache, есть встроенный модуль mod_rewrite. На большинстве хостингов он есть, так же как и на денвере.
Создаем файл .htaccess и кладем его в корень сайта. Первой строкой в этом файле мы пишем:
RewriteEngine on
Эта строка включает модуль mod_rewrite. Далее, мы пишем сами условия куда и зачем обращаться. Для нашего первого примера, код будет выглядеть так:
RewriteEngine on
RewriteRule ^news/([0-9]+)/? news.php?id=$1 [L]
Он будет перенаправлять с http://site.ru/news/4/ сюда http://site.ru/news.php?id=4
Все эти условия обычно указываются в htaccess с помощью регулярных выражений.
По второму примеру, код будет выглядеть так:
RewriteEngine on
RewriteRule ^articles/([-a-zA-Z0-9_]+)/? index.php?do=article&name=$1 [L]
Т.е. с адреса http://site.ru/articles/kak-sdelat-chpu/ нас перебросит на http://site.ru/index.php?do=article&name=kak-sdelat-chpu. Точнее пользователь не увидит реального адреса, а увидит только наш ЧПУ.
Как видите, все достаточно просто – создаем файл htaccess, пишем две строчки и готово!
По регулярным выражениям меня не спрашивайте, я не шарю
Знаю только:
[0-9]+ – это только для цифр
[-a-zA-Z0-9_]+ – это для латинских больших, маленьких, дефиса и подчеркивания
Если во соображаете в регулярных выражениях, Вам будет очень легко написать любое правило. А кто не соображает, тут нужно смотреть примеры, которые я привел и пробовать. Я вчера попробовал, получилось! Не сразу конечно, перерыл кучу инфы, но разобрался.
Надеюсь понятно описал. Будут вопросы, спрашивайте.
UPD by Hugo: Если использовать конструкцию [QSA,L], тогда ЧПУ сможет принимать GET запросы. Т.е. если мы будем без [QSA,L] передавать GET-параметр (http://site.ru/articles/kak-sdelat-chpu/?Get_param=1) то выкинет 404 ошибку. Чтобы этого не происходило и мы смогли принимать GET запросы, нужно:
Вместо этого:
RewriteRule ^news/([0-9]+)/? news.php?id=$1 [L]
Нужно написать [QSA,L] на конце:
RewriteRule ^news/([0-9]+)/? news.php?id=$1 [QSA,L]




Тут стоило бы отметить, что и ссылки, которые генерирует скрипт, надо изменить (вместо index.php?do=article&name=kak-sdelat-chpu — /articles/kak-sdelat-chpu/).
А вообще, конечно, правильнее редиректить на index.php и разбирать $_SERVER["REQUEST_URI"].
[Ответить]
октября 4, 2011 at 20:55
$_SERVER["REQUEST_URI"] – не совсем =)
нужно парсить $_SERVER["REDIRECT_URL"], иначе переменные из get запроса не выловишь
[Ответить]
Полезная статья. Примерно также создаются ЧПУ в некоторых партнёрских интернет-магазинах. В любом случае, спасибо, пригодится.
[Ответить]
Извеняюсь за то что не потеме. Сегодня решил проверить откуда идут посетители один из моих сайтов. Так статистика показала что 95% идет с яндекса остальные с сайтов и закладок. Меня заинтересовало почему нет от гугла хотябы одного посетителя в сутки. Полез в панель вебмастера: сайт в индексе. стал смотреть по каким запросам у меня есть показатели и увидел странную картину: сайт занимает топовые места по названиям элементов шаблоны. к примеру по запросу n_shap_logo (написал приблизительно) (таких запросов мало, проверял шаблон там все путем) занимает первое место. по запросу site:сайт тоже топ. А вот по тем запросам по каким у яндекса в топе показатель 50 и ниже.
Подскажите что это? И как боросться с этим?
[Ответить]
Скажи пожалуйста, как ты сделал так, что вместо прямых рефссылок отображаются ссылки вида ?
Это плагин или сам на пхп писал?
А то сам хочу на блоге сделать такое, чтоб и без ноуиндексов и чтоб вес не перетекал.
[Ответить]
anisart, Если не ошибаюсь то есть скрипт такой в паблике. Также можете создать папку на вашем сайте (ее запретить к индексации) а в ней создавать папки в которых делать index.html или index.php с автоматическим переходом ту страницу куда надо. Noindex не будет но прийдется для каждой партнерки делать свои файлы и папки
[Ответить]
Правильно. Все как сказал новичок. Просто header редиректом. И папочки создаю. При желании, могу написать отдельный пост.
[Ответить]
Комментарий скрыт из-за низкого рейтинга Посмотреть.
[Ответить]
Комментарий скрыт из-за низкого рейтинга Посмотреть.
[Ответить]
Комментарий скрыт из-за низкого рейтинга Посмотреть.
[Ответить]
Во во …. именя никуда не перебрасывает.А должно ли вообще?
[Ответить]
Если по не ЧПУ ссылке переходить, перебрасывать и не должно.
[Ответить]
Я разобрался. Допишите кстати, что если использовать конструкцию [QSA,L], то с ЧПУ можно принимать GET-параметры, будет полезно многим, я думаю
[Ответить]
RewriteRule ^news/([0-9]+)/? news.php?id=$1 [QSA,L]
т.е. если будет так, тогда при попытке перейти по не ЧПУ ссылке, перекинет на ЧПУ?
[Ответить]
Нет-нет.
Если ты без QSA передашь GET-параметр () то выкинет 404 ошибку.
А если будет QSA то не выкинет 404, а передана этой странице GET-переменная. Ну это для кодеров
[Ответить]
Как сделать если методом GET передаются 2 аргумента?
[Ответить]
Аналогично, нужно с регулярными выражениями разбираться.
[Ответить]
Интересно, ссылка вида может не работать, если в базе имеется две статьи с таким же названием?
Каким образом их отличать?
[Ответить]
Это уже зависит от самого кода, обработчика. Как настроишь, так и будет выводить. Как с ЧПУ, так и без него.
[Ответить]
Просто выберется первая запись по PRIMARY INDEX или по ORDER BYв MySQL.
Зачем создавать страницы с одинаковыми названиями? о_О
[Ответить]
Очень благодарю. Как раз уже около месяца ищу эту информацию, а это как раз то, что мне нужно!
[Ответить]
Спасибо, благодаря Вашей статье написал редикт для
[Ответить]
Есть сайт с тремя страницами:
– главная;
– список статей на сайте;
– сами статьи.
В файле .htaccess следующие записи:
RewriteEngine on
RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]
RewriteRule ^cat/([0-9]+)/? cat.php?id=$1 [L]
После редиректа страницы стали с ЧПУ:
;
.
Проблема в следующем:
Переходя со страницы на переход осуществляется на страницу , соответственно выдается ошибка “страница не найдена”.
Помогите решить данную проблему!
[Ответить]
Может быть проблема в самих ссылках, всмысле
< a href=" здесь " > ?
т.е. ссылки должны быть абсолютными, а не относительными.
./index.html
/index.html
index.html
site.ru/index.html
[Ответить]
В результате всех этих действий, на сайте получится дублированный контент:
и одно и то же.
Поисковикам это точно не понравится.
[Ответить]
эм.. вы написали одно и тоже, в смысле два одинаковых адреса.
[Ответить]
Да дибилизм, у меня тоже не работает ЧПУ вида:
В файле .htaccess следующие записи:
RewriteEngine on
RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]
После редиректа страницы стали с ЧПУ:
Я попытался разобрать, сервер как будто отправляет данные в файл , но при этом все стили и изображения адресуются к – в другую папку совсем.
Если кто знает, пожалуйста подскажите как решить проблему???
[Ответить]
RewriteEngine on
RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]
Извиняюсь за тупость но мне одно не понять, $1 в эту переменную данные попадают откуда?
[Ответить]
RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]
([0-9]+) – эти данные, что будут в адресной строке:
post/ 24 /
т.е. число 24
[Ответить]
Ray Sakaviev, если на сайте не было ЧПУ, а были пути, типа index.php?mod=45 , и если в HTML коде были не абсолютные пути, тогда большинство ссылок и изображений будет не правильно отображаться.
Нужно привести всё к абсолютным путям, т.е. «http://адрес-сайта.ru/images/logo.jpg» вместо «images/logo.jpg». Надеюсь понятно объяснил.
[Ответить]
<base href="get_scripts_directory(); ?>» /> – вот это мне помогло, поставил в head. Спасибо большое всем
Думаю комментировать не нужно)
[Ответить]
Здравствуйте помогло! разобрался! НО проблеммаа!
когда я ввожу адресс
то тексты он подгружает! а вот стилт скрипты джава и т.п. нет! в чём дело! помогите!)
[Ответить]
декабря 2, 2010 at 23:04
» /> – индивидуальный ответ)
[Ответить]
декабря 2, 2010 at 23:06
Я не знаю что сделал с моим ответом на твой вопрос скрипт. Но посмотри мою предыдущую проблему. Тебе нужно прописать base тег в head
[Ответить]
декабря 2, 2010 at 23:26
То же и со скриптами и стилями, им пути нужно указывать абсолютные.
Если, например, у нас style.css находится в корневой папке, нам нужно написать путь к ним: «/style.css», вместо «style.css»
Знак / будет говорить о том, что нужно смотреть в корне сайта. Например «/style/css.css» вместо «style/css.css».
[Ответить]
Комментарий скрыт из-за низкого рейтинга Посмотреть.
[Ответить]
Комментарий скрыт из-за низкого рейтинга Посмотреть.
Комментарий скрыт из-за низкого рейтинга Посмотреть.
[Ответить]
Спасибо за статью очень помогла!
[Ответить]
Привет всем.ПОдскажите. делаю переадресацию по правилам.
набираю переходит на . Всё хорошои правильно, но в строке браузера отображается старый url (www.site.com/inside.php?catalogid=1)юКак сделать так чтобы в строке браузера отображался ЧПУ ?Спасибо.
[Ответить]
июля 2, 2011 at 12:47
У тебя сейчас в .htaccess прописано так:
RewriteRule ^year([0-9]+) [L]
а надо так:
RewriteRule ^year([0-9]+) /vipysk.php?id=$1 [L]
Без полного пути, и тогда в строке браузера останется ЧПУ
[Ответить]
Статья кстати полезная.но вот трудности.
[Ответить]
Почему же у меня не перенаплавляет.. всё так вроде делаю, а никуда не редиректит, говорит Not Found. Использую Denwer
В чём проблема может быть?
[Ответить]
Macroart, проверь, чтобы модуль rewrite был включен на сервере.
[Ответить]
Подскажите как оформить ЧПУ.. необходимо ссылки вида
заменить на
Попробовал вот так:
RewriteRule ^catalog/([0-9]+)/? razdel/$1 [L]
не получилось
[Ответить]
июля 23, 2011 at 01:44
Хм.. на вид все правильно прописано. А у сайта наверно уже есть .htaccess ?
[Ответить]
июля 23, 2011 at 10:02
Вся проблема в том что ви неправильно написали ЧПУ. Вот так будет правильней для такого урл тут у вас в конце нету / а в ЧПУ есть вот и вся проблема.):
RewriteRule ^catalog/([0-9]+)$ razdel/$1 [L]
$ – для того чтобы сервер понял что после номера ничего нету и не должно быть.
[Ответить]
августа 2, 2011 at 01:06
Точно ) Не заметил, спасибо за поправку!
[Ответить]
Подскажите можно ли сделать так чтобы в адресной строке не отображался id
~/2-music-ipods
а мне надо так
~/music-ipods
в фалй .htaccess у меня прописано следуещее:
RewriteRule ^([0-9]+)\-[a-zA-Z0-9-]* /category.php?id_category=$1 [QSA,L]
[Ответить]
августа 31, 2011 at 21:59
RewriteRule ^music-ipods? /category.php?id_category=2 [QSA,L]
Если я правильно понял, просто пропишите адреса вручную в htaccess
[Ответить]
сентября 1, 2011 at 01:13
Так конечно можна, ну а если категорий к примеру 100?
Я думаю все зависит от движка, если там категория выводится через id, а не name то прийдется вручную…
[Ответить]
сентября 30, 2011 at 14:27
Как вариант можно просто передавать в файл название, даже если оно латиницей и делать выборку по полученному значению. Вообще WP передает весь адрес в index.php и там уже его разбирает, сложновато конечно, но самый верный подход ИМХО
Спасибо за мини-мануал)
Вопрос.
Были раньше страницы вида
site.ru/?art=blog
site.ru/?art=about
site.ru/?art=contact
и так много(около200 страниц)
Эти страницы содержат текст, в котором встречаются ссылки на другие страницы сайта. (т.е ).
Сделал чпу вида site.ru/art/blog и тд. Вопрос в следующем.
Возможно ли при помощи .htaccess сделать что бы внутренние ссылки сайта внутри документа тоже меняли вид?
Спасибо!
[Ответить]