Как сделать ЧПУ для сайта на PHP

Как сделать ЧПУ для сайта на PHP

Написано Denis

Категория: Программирование

(Человеко-Понятные Урлы) или SEF (англ. Search Engines Friendly url). Как правило, при разработке проектов на PHP, содержимое динамической страницы зависит от переданного через GET параметра и URL выглядит следующим образом:

yourdomain.com/index.php?id=201


в данной случае намного аккуратнее смотрелась бы ссылка вида:

yourdomain.com/201/

yourdomain.com/201.html

а ещё лучше:

yourdomain.com/name-page.html

Как это сделать? Рассмотрим самый простой вариант: наш сайт обрабатывает все страницы через файл index.php и содержимое страницы определяется только одной переменной – id. В таком случае механизм преобразования из /index.php?id=201 в /name-page.html будет иметь следущий вид:

 

Блок-схема обработки ЧПУ (SEF)

 

1) Определяем существует ли запрашиваемый путь в реальности. Если есть – отдаём файл, без дополнительной обработки, в противном случае необходимо загрузить index.php, который обработает несуществующий ЧПУ. Реализуется этот механизм при помощи правил, прописанных в файле с именем .htaccess.

Файл .htaccess должен находиться в корневой директории. Создать и править .htaccess можно в обычном текстовом редакторе.

 

Содержимое файла .htaccess:

 

RewriteEngine On – разрешаем серверу преобразовывать URL.

RewriteBase / – устанавливаем базовый URL.

RewriteCond %{REQUEST_FILENAME} !-f – проверяем, что запрошенной директории не существует.

RewriteCond %{REQUEST_FILENAME} !-d – проверяем, что запрошенного файла не существует.

RewriteRule . /index.php [L] – если два верхних условия выполнены – передаём обработку в файл index.php

 

MySQL

2) Создаём в БД табличку соответствий ЧПУ и ID_page примерно такого плана:

 

SEF
varchar(255)
ID_page
int(11)
index 1
page 2
page-name 3

 

PHP

3) Содержимое файла index.php, из комментариев в коде ясно, как это работает.

 

 

Вот, в целом, и всё ;).

Комментарии (48) к статье Мне интересно ваше мнение!

  1. ivan:

    Здравствуйте,

    хочу сделать вид типа http :// www .site.com/category/23/?p=10

    т.е. сделал ЧПУ site.com/?Category=23 – http :// www .site.com/category/23/ – это работает,
    а как же сделать постраничную навигацию, все что ?p=10 – не видит как GET

    спасибо

  2. newstarter:

    Здравствуйте, подскажите пожалуйста, как в .htaccess прописать путь к заархивированному файлу в папке, потому что при смене ссылок на ЧПУ через mod_rewrite ссылка с главной страницы сайта downloads/file.zip изменилась на index/downloads/file.zip. А такой страницы не существует, это же не страница, это же файл в папке, лежащей в корне сайта. СПАСИБО за совет!

  3. Denis:

    как полностью выглядит ссылка? как, чем она формируется? что за CMS?

  4. Олег:

    Спасибо за статью, часа 4 искал информацию по теме, у вас оказалась самая вменяемая.

    У меня вопрос смежный встал про 404 ошибку.
    Настроил так, что по запросу site.com/page/ отображается то содержание что нужно. Но заметил что если ввести site.com/page/jfhjskhf – выдается та же самая страница, хотелось бы этого избежать.
    Не подскажите что поправить?

    Спасибо.

  5. Александр:

    Мне не совсем понятно следующая запись: “Создаём в БД табличку соответствий ЧПУ и ID_page примерно такого плана”. Если не трудно, расспишите немного подробнее!
    Заранее благодарен!

  6. Александр:

    Разобрался с базами, все работает! Ваше описание оказалось самым внятным во всем интернете, спасибо Вам за это! Есть еще один вопрос. Некоторые “некрасивые” URL у меня уже проиндексированы имеют очень хорошие позиции, поэтому хочу их оставить. В связи с этим, возможно ли сделать так, что если поле SEF пустое, чтобы принималось значение старое?

  7. Алексей:

    А что если в строку чпу и id сразу добавить несколько полей для сценария генерации страницы: тип страницы (главная или каталог и т.п.) и какие-то константы можно сюда же? Так делают?

  8. Александр:

    Проблема в этом методе, что нельзя передавать параметры вида ?param=1.
    Подскажите читателям, как можно модифицировать код, чтобы еще и параметры видны были и можно было делать ссылки вида site.com/catalog/tovar.html?param=1 например.


Оставьте комментарий Высказывайте свои мысли по этой теме


+ 2 = пять