Как сделать ЧПУ для сайта на 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, из комментариев в коде ясно, как это работает.

 

 

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

108 комментариев к статье Мне интересно ваше мнение!

  1. Denis:

    jquery?

    Вы о чём или к чему это сказали, Сергей?

  2. Михаил:

    Ну, Денис, я полный листинг файла приводить не буду, если интересно, могу прислать на почту весь движок. Поковыряетесь))) Но все работает и уже не первый год. Спасибо за советы. Я в избранном страничку эту сохранил, надеюсь сайт этот будет жить долго. Посмотрю на днях как поведет себя скрипт с твоими переделками. Как время будет, В принципе id мне нужен и я добился того, чего хотел, но несколько другим способом. И получил, кстати удовлетворение от целой недели плясок вокруг этой темы.

    Буду следить за этой темой. Может ещё чего интересного тут вычитаю. Предложенный тобой способ очень интересен. А то в сети на эту тему все одно и то же. Причем конкретики очень мало. Общая информация.

  3. Denis:

    Спасибо. Я вчера скачал с сайта SmallNuke.com модуль News v.1.1, оттуда кусок кода и взял.

    Посмотрю на днях как поведет себя скрипт с твоими переделками.

    Напоминаю про проверку данных, полученных GET. Переменной id нужно будет присваивать собственно id, что бы дальше по коду ошибок не было.

    Я рад, что у вас всё получилось.

  4. Yaroslav:

    хорошая статья

  5. БЕДРИК:

    доброго дня, у мене таку питання, мій url- amonit.com.ua/news.php?news=32
    як його зробити amonit.com.ua/32.html???

  6. БЕДРИК:

    ________________________________________________________________________________
    Ось мій код!!! що змінити потрібно???
    ________________________________________________________________________________

    mysql_connect (“localhost”, “———“, “——–“);
    mysql_select_db (“———-“);
    $query = “SELECT id_page FROM url WHERE sef = ‘”.$sef_value.”‘ LIMIT 1″;
    $result = $_SERVER[‘REQUEST_URI’];
    if (preg_match (“/([^a-zA-Z0-9\.\/\-\_\#])/”, $result)) {
    header(“HTTP/1.0 404 Not Found”);
    echo “Недопустимые символы в URL”;
    exit;
    }
    $array_url = preg_split (“/(\/|\..*$)/”, $result,1, PREG_SPLIT_NO_EMPTY);
    if (!$array_url) {
    $ID_page = 1;
    }else{
    $sef_value = $array_url[0];
    }
    ___________________________________________________________________________

  7. БЕДРИК:

    ААААААААААААААААААААААААААААААААААААААААААААААААААААА 0_0
    допоможіть просто у мене вже паніка, другий тиждень цим ковиряюсь!!!

  8. Denis:

    Доброжелатель, оставь это при себе, мне не интересно.

  9. Denis:

    БЕДРИК, думаю спустя почти месяц проблема так или иначе решилась, в любом случае, по этому куску кода я вам ничего сказать не смогу.

  10. Sergei:

    Спасибо за статью.

  11. Павел:

    Спасибо большое, прекрасная статья во всем разобрался, вы большой человек! Очень помогли!

  12. Леонид:

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

    Помогите пожалуйста разобраться. Дело в том, что у меня на этапе:

    $array_url = preg_split (“/(\/|\..*$)/”, $result,1, PREG_SPLIT_NO_EMPTY);

    не откидывает слеш “/” и имя файла остается “/name”, а в базе “name” если добавляю в базу слеш, то все работает, если же слеша нет, то выдает 404 ошибку как и положено скрипту. Как исправить? Помогите пожалуйста

  13. Леонид:

    Если кому понадобится решил проблему следующим образом:

    /* отбрасываем из ЧПУ всё лишнее, оставляя только имя виртуального html-файла. В случае с yourdomain.com/name-page.html это будет name-page функция preg_split формирует массив, разбивая переданную строку по заданной маске. */

    $result = str_replace(‘/’, ”, $_SERVER[‘REQUEST_URI’]); /* удалил слеш “/” в начале файлы */
    $array_url = preg_split (“/\./”, $result); /* разбил файл на [имя_файла] . [расширение] то есть то что до точки и после точки */

    и дальше по коду: строка $sef_value = $array_url[0]; вытаскивает соответственно [имя_файла].

  14. Denis:

    Лонид, спасибо. В коде была ошибка: третьим параметром следовало передать не 1, а -1, тогда / и вся, что после . выводиться не будет.

  15. Вася:

    Не пойму, как именно перенаправить пользователя по с генерированному адресу? – site.ru/********/

  16. Борис:

    Приветствую!
    Подскажите, у меня в базе “name-page”, а в урле страница открывается и как “имясайта/name-page” и как “имясайта/name-page/”
    Т.е. со слэшем на конце и без слэша – работает, хотя это не правильно, т.к. для поисковиков это разные страницы.
    Что надо еще тогда в .htaccess прописать, чтобы был редирект 301, например, с “имясайта/name-page/” на “имясайта/name-page”?
    Буду признателен за ответ.

  17. WordPress уроки:

    Отличная статья если не против возьму за основу для написания своего скрипта и статьи к себе на блог. Ссылку в блоге добавлю.

  18. Denis:

    Борис – 32-я строка в примере – подберите регулярное выражение под ваши нужды. Я попозже постараюсь добавить такой вариант в пример.

    WordPress уроки – благодарю, пользуйтесь конечно. Спасибо за ссылку ;).

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

    Скажите пожалуйста, как сделать все, что написано в статье, не затронув файл управления админкой? В htsccess если не существует файл или директория разбор полетов летит в index.php, но при обращении к файлу admin.php htaccess тоже ведь будет преобразовывать его ссылки?

  20. Denis:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    редирект происходит только для несуществующих путей, если admin.php существует – он и отработает.


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


7 + три =