Как сделать ЧПУ с помощью .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]

Поделиться ссылкой:
Добавить в facebook
Добавить в ЖЖ
Понравилось? Подписывайся на новые выпуски статей о заработке в сети интернет!
Подписаться по e-mail:
  или через RSS RSS   или twitter Twitter
Чат сайт знакомств видеочат лучшее средство для общение с друзьями и близкими.

53 комментария

  • Тут стоило бы отметить, что и ссылки, которые генерирует скрипт, надо изменить (вместо index.php?do=article&name=kak-sdelat-chpu — /articles/kak-sdelat-chpu/).

    А вообще, конечно, правильнее редиректить на index.php и разбирать $_SERVER["REQUEST_URI"].

    Thumb up Thumb down +2

    [Ответить]

    DarthShelL ответил:

    $_SERVER["REQUEST_URI"] – не совсем =)
    нужно парсить $_SERVER["REDIRECT_URL"], иначе переменные из get запроса не выловишь

    Thumb up Thumb down 0

    [Ответить]

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

    Thumb up Thumb down +1

    [Ответить]

  • Новичок

    Извеняюсь за то что не потеме. Сегодня решил проверить откуда идут посетители один из моих сайтов. Так статистика показала что 95% идет с яндекса остальные с сайтов и закладок. Меня заинтересовало почему нет от гугла хотябы одного посетителя в сутки. Полез в панель вебмастера: сайт в индексе. стал смотреть по каким запросам у меня есть показатели и увидел странную картину: сайт занимает топовые места по названиям элементов шаблоны. к примеру по запросу n_shap_logo (написал приблизительно) (таких запросов мало, проверял шаблон там все путем) занимает первое место. по запросу site:сайт тоже топ. А вот по тем запросам по каким у яндекса в топе показатель 50 и ниже.
    Подскажите что это? И как боросться с этим?

    Thumb up Thumb down 0

    [Ответить]

  • Скажи пожалуйста, как ты сделал так, что вместо прямых рефссылок отображаются ссылки вида http://crazy-russian.ru/partnerki/eroprofit/ ?
    Это плагин или сам на пхп писал?
    А то сам хочу на блоге сделать такое, чтоб и без ноуиндексов и чтоб вес не перетекал.

    Thumb up Thumb down 0

    [Ответить]

  • Новичок

    anisart, Если не ошибаюсь то есть скрипт такой в паблике. Также можете создать папку на вашем сайте (ее запретить к индексации) а в ней создавать папки в которых делать index.html или index.php с автоматическим переходом ту страницу куда надо. Noindex не будет но прийдется для каждой партнерки делать свои файлы и папки

    Thumb up Thumb down 0

    [Ответить]

  • Правильно. Все как сказал новичок. Просто header редиректом. И папочки создаю. При желании, могу написать отдельный пост.

    Thumb up Thumb down -3

    [Ответить]

  • Комментарий скрыт из-за низкого рейтинга Посмотреть.

    Thumb up Thumb down -5

    [Ответить]

  • Комментарий скрыт из-за низкого рейтинга Посмотреть.

    Thumb up Thumb down -3

    [Ответить]

  • Комментарий скрыт из-за низкого рейтинга Посмотреть.

    Thumb up Thumb down -4

    [Ответить]

  • Во во …. именя никуда не перебрасывает.А должно ли вообще?

    Thumb up Thumb down 0

    [Ответить]

  • Если по не ЧПУ ссылке переходить, перебрасывать и не должно.

    Thumb up Thumb down 0

    [Ответить]

  • Я разобрался. Допишите кстати, что если использовать конструкцию [QSA,L], то с ЧПУ можно принимать GET-параметры, будет полезно многим, я думаю :-)

    Thumb up Thumb down +5

    [Ответить]

  • RewriteRule ^news/([0-9]+)/? news.php?id=$1 [QSA,L]
    т.е. если будет так, тогда при попытке перейти по не ЧПУ ссылке, перекинет на ЧПУ?

    Thumb up Thumb down -2

    [Ответить]

  • Нет-нет.
    Если ты без QSA передашь GET-параметр (http://site.ru/articles/kak-sdelat-chpu/?Get_param=1) то выкинет 404 ошибку.

    А если будет QSA то не выкинет 404, а передана этой странице GET-переменная. Ну это для кодеров :)

    Thumb up Thumb down +3

    [Ответить]

  • Как сделать если методом GET передаются 2 аргумента?

    Thumb up Thumb down 0

    [Ответить]

  • Аналогично, нужно с регулярными выражениями разбираться.

    Thumb up Thumb down -1

    [Ответить]

  • Интересно, ссылка вида http://site.ru/index.php?do=article&name=kak-sdelat-chpu может не работать, если в базе имеется две статьи с таким же названием?
    Каким образом их отличать?

    Thumb up Thumb down +1

    [Ответить]

  • Это уже зависит от самого кода, обработчика. Как настроишь, так и будет выводить. Как с ЧПУ, так и без него.

    Thumb up Thumb down 0

    [Ответить]

  • Просто выберется первая запись по PRIMARY INDEX или по ORDER BYв MySQL.
    Зачем создавать страницы с одинаковыми названиями? о_О

    Thumb up Thumb down 0

    [Ответить]

  • Очень благодарю. Как раз уже около месяца ищу эту информацию, а это как раз то, что мне нужно!

    Thumb up Thumb down 0

    [Ответить]

  • Спасибо, благодаря Вашей статье написал редикт для http://webkill.org/redirec-php

    Thumb up Thumb down +2

    [Ответить]

  • Димсон

    Есть сайт с тремя страницами:
    http://site.ru/index.php – главная;
    http://site.ru/cat.php?cat=1 – список статей на сайте;
    http://site.ru/post.php?id=1 – сами статьи.

    В файле .htaccess следующие записи:
    RewriteEngine on
    RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]
    RewriteRule ^cat/([0-9]+)/? cat.php?id=$1 [L]

    После редиректа страницы стали с ЧПУ:
    http://site.ru/cat/1;
    http://site.ru/post/1.

    Проблема в следующем:
    Переходя со страницы http://site.ru/post/1 на http://site.ru/cat/1 переход осуществляется на страницу http://site.ru/post/cat/1, соответственно выдается ошибка “страница не найдена”.

    Помогите решить данную проблему!

    Thumb up Thumb down +1

    [Ответить]

  • Может быть проблема в самих ссылках, всмысле
    < a href=" здесь " > ?

    т.е. ссылки должны быть абсолютными, а не относительными.
    ./index.html
    /index.html
    index.html
    site.ru/index.html

    Thumb up Thumb down 0

    [Ответить]

  • В результате всех этих действий, на сайте получится дублированный контент:
    http://site.ru/news/4/ и http://site.ru/news/4/ одно и то же.
    Поисковикам это точно не понравится.

    Thumb up Thumb down 0

    [Ответить]

  • эм.. вы написали одно и тоже, в смысле два одинаковых адреса.

    Thumb up Thumb down +4

    [Ответить]

  • Ray Sakaviev

    Да дибилизм, у меня тоже не работает ЧПУ вида:

    В файле .htaccess следующие записи:
    RewriteEngine on
    RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]

    После редиректа страницы стали с ЧПУ:
    http://site.ru/post/1

    Я попытался разобрать, сервер как будто отправляет данные в файл http://site.ru/post.php, но при этом все стили и изображения адресуются к http://site.ru/post/ – в другую папку совсем.

    Если кто знает, пожалуйста подскажите как решить проблему???

    Thumb up Thumb down 0

    [Ответить]

  • Руслан

    RewriteEngine on
    RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]

    Извиняюсь за тупость но мне одно не понять, $1 в эту переменную данные попадают откуда?

    Thumb up Thumb down 0

    [Ответить]

  • RewriteRule ^post/([0-9]+)/? post.php?id=$1 [L]

    ([0-9]+) – эти данные, что будут в адресной строке:
    post/ 24 /

    т.е. число 24

    Thumb up Thumb down 0

    [Ответить]

  • Ray Sakaviev, если на сайте не было ЧПУ, а были пути, типа index.php?mod=45 , и если в HTML коде были не абсолютные пути, тогда большинство ссылок и изображений будет не правильно отображаться.
    Нужно привести всё к абсолютным путям, т.е. «http://адрес-сайта.ru/images/logo.jpg» вместо «images/logo.jpg». Надеюсь понятно объяснил.

    Thumb up Thumb down 0

    [Ответить]

  • Ray Sakaviev

    <base href="get_scripts_directory(); ?>» /> – вот это мне помогло, поставил в head. Спасибо большое всем :) Думаю комментировать не нужно)

    Thumb up Thumb down 0

    [Ответить]

  • Здравствуйте помогло! разобрался! НО проблеммаа!
    когда я ввожу адресс
    http://localhost/moviesonline/watch/12
    то тексты он подгружает! а вот стилт скрипты джава и т.п. нет! в чём дело! помогите!)

    Thumb up Thumb down 0

    [Ответить]

    Ray Sakaviev ответил:

    » /> – индивидуальный ответ)

    Thumb up Thumb down 0

    [Ответить]

    Ray Sakaviev ответил:

    Я не знаю что сделал с моим ответом на твой вопрос скрипт. Но посмотри мою предыдущую проблему. Тебе нужно прописать base тег в head

    Thumb up Thumb down 0

    [Ответить]

    Сумасшедший Русский ответил:

    То же и со скриптами и стилями, им пути нужно указывать абсолютные.
    Если, например, у нас style.css находится в корневой папке, нам нужно написать путь к ним: «/style.css», вместо «style.css»

    Знак / будет говорить о том, что нужно смотреть в корне сайта. Например «/style/css.css» вместо «style/css.css».

    Thumb up Thumb down 0

    [Ответить]

  • Ray Sakaviev

    Комментарий скрыт из-за низкого рейтинга Посмотреть.

    Thumb up Thumb down -6

    [Ответить]

  • Комментарий скрыт из-за низкого рейтинга Посмотреть.

    Thumb up Thumb down -3

  • Комментарий скрыт из-за низкого рейтинга Посмотреть.

    Thumb up Thumb down -3

    [Ответить]

  • Спасибо за статью очень помогла!

    Thumb up Thumb down 0

    [Ответить]

  • Димон

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

    Thumb up Thumb down 0

    [Ответить]

    Евгений ответил:

    У тебя сейчас в .htaccess прописано так:
    RewriteRule ^year([0-9]+) http://localhost/gazeta/vipysk.php?id=$1 [L]

    а надо так:
    RewriteRule ^year([0-9]+) /vipysk.php?id=$1 [L]

    Без полного пути, и тогда в строке браузера останется ЧПУ

    Thumb up Thumb down +1

    [Ответить]

  • Димон

    Статья кстати полезная.но вот трудности.

    Thumb up Thumb down 0

    [Ответить]

  • Почему же у меня не перенаплавляет.. всё так вроде делаю, а никуда не редиректит, говорит Not Found. Использую Denwer

    В чём проблема может быть?

    Thumb up Thumb down 0

    [Ответить]

  • Macroart, проверь, чтобы модуль rewrite был включен на сервере.

    Thumb up Thumb down 0

    [Ответить]

  • Подскажите как оформить ЧПУ.. необходимо ссылки вида http://мойсайт.ру/razdel/номер
    заменить на
    http://мойсайт.ру/catalog/номер

    Попробовал вот так:
    RewriteRule ^catalog/([0-9]+)/? razdel/$1 [L]
    не получилось

    Thumb up Thumb down -1

    [Ответить]

    Сумасшедший Русский ответил:

    Хм.. на вид все правильно прописано. А у сайта наверно уже есть .htaccess ?

    Thumb up Thumb down -1

    [Ответить]

    Вова ответил:

    Вся проблема в том что ви неправильно написали ЧПУ. Вот так будет правильней для такого урл http://мойсайт.ру/razdel/номер(просто тут у вас в конце нету / а в ЧПУ есть вот и вся проблема.):
    RewriteRule ^catalog/([0-9]+)$ razdel/$1 [L]
    $ – для того чтобы сервер понял что после номера ничего нету и не должно быть.

    Thumb up Thumb down +1

    [Ответить]

    Сумасшедший Русский ответил:

    Точно ) Не заметил, спасибо за поправку!

    Thumb up Thumb down 0

    [Ответить]

  • Подскажите можно ли сделать так чтобы в адресной строке не отображался id

    ~/2-music-ipods

    а мне надо так

    ~/music-ipods

    в фалй .htaccess у меня прописано следуещее:

    RewriteRule ^([0-9]+)\-[a-zA-Z0-9-]* /category.php?id_category=$1 [QSA,L]

    Thumb up Thumb down 0

    [Ответить]

    Сумасшедший Русский ответил:

    RewriteRule ^music-ipods? /category.php?id_category=2 [QSA,L]

    Если я правильно понял, просто пропишите адреса вручную в htaccess

    Thumb up Thumb down +1

    [Ответить]

    Вова ответил:

    Так конечно можна, ну а если категорий к примеру 100?
    Я думаю все зависит от движка, если там категория выводится через id, а не name то прийдется вручную…

    Thumb up Thumb down 0

    [Ответить]

    Сумасшедший Русский ответил:

    Как вариант можно просто передавать в файл название, даже если оно латиницей и делать выборку по полученному значению. Вообще WP передает весь адрес в index.php и там уже его разбирает, сложновато конечно, но самый верный подход ИМХО

    Thumb up Thumb down 0

  • Спасибо за мини-мануал)
    Вопрос.
    Были раньше страницы вида
    site.ru/?art=blog
    site.ru/?art=about
    site.ru/?art=contact
    и так много(около200 страниц)
    Эти страницы содержат текст, в котором встречаются ссылки на другие страницы сайта. (т.е contact).
    Сделал чпу вида site.ru/art/blog и тд. Вопрос в следующем.
    Возможно ли при помощи .htaccess сделать что бы внутренние ссылки сайта внутри документа тоже меняли вид?
    Спасибо!

    Thumb up Thumb down 0

    [Ответить]

Есть что сказать?