Дом Figaroo

Разработка и развитие нового форумного движка Figaroo Forum System (FFS), быстрого, функционального и надёжного.
«Знание — могущество».

5 апреля 2009

Создаём ЧПУ (SEF): Apache + PHP

Рубрика: Программирование на PHP — Метки: — Figaroo @ 23:26

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

ЧПУ — это Человеку Понятные УРЛ (URL). В англоязычном интернете называется SEF links — Search Engines Friendly links (ссылки, дружественные поисковым системам).

Это делается для того, чтобы ссылки на страницы вашего сайта имели красивый вид, понятный человеку и дружественный для поисковых систем.

Например, ссылка http://localhost/forum/users/Figaroo/ гораздо легче запоминается человеком, чем http://localhost/?mode=forum&page=users¶m=Figaroo. Также, первую ссылку гораздо легче продиктовать по телефону.
Чтобы перейти на уровень вверх достаточно стереть нужную часть пути, если человек уже был на вашем сайте и набирает адрес страницы вручную, то он сразу может обратиться к нужному ему документу глядя на URL'ы предыдущих запросов.
Пользователь может быстро и безошибочно определить свое местонахождение на сайте. Это удобно.

Также, такие адреса легче и быстрее индексируются поисковыми машинами, такими как Яндекс, Гугль и др.

Теперь о том, как это реализовать для сайта на языке PHP.

В файле .htaccess (расположенном в корневой директории сайта) разместим следующий код:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

Далее, в корневой директории сайта создадим файл index.php:

<?php

// предшествующий код сайта

$_URL = preg_replace("/^(.*?)index\.php$/is", "$1", $_SERVER['SCRIPT_NAME']);
$_URL = preg_replace("/^".preg_quote($_URL, "/")."/is", "", urldecode($_SERVER['REQUEST_URI']));
$_URL = preg_replace("/(\/?)(\?.*)?$/is", "", $_URL);
$_URL = preg_replace("/[^0-9A-Za-z._\\-\\/]/is", "", $_URL); // вырезаем ненужные символы (не обязательно это делать)
$_URL = explode("/", $_URL);
if (preg_match("/^index\.(?:html|php)$/is", $_URL[count($_URL) - 1])) unset($_URL[count($_URL) - 1]); // удаляем суффикс
switch (@$_URL[0]) {
        case '': /* главная страница */ break;
        case 'my_page': /* пример страницы. здесь можно сделать что-нибудь вроде "require_once('./pages/my_page.php');" */ break;
        default: /* ошибка - страницы нет. можно послать 404-ый заголовок и показать прикольный текст. */
}

// последствующий код сайта

?>

Таким образом все запросы, кроме запросов к реально существующим на сервере файлам и папкам (к примеру, картинкам, таблицам стилей, скриптам и т.п.), перенаправятся на файл index.php.
В файле index.php создастся переменная-массив $_URL.

К примеру, наш сайт располагается по адресу http://localhost/mysite/.
Тогда, если мы перейдём по адресу http://localhost/mysite/users/Figaroo/edit/ или же http://localhost/mysite/users/Figaroo/edit/index.html,
то $_URL будет равным array('users', 'Figaroo', 'edit').

Дальше index.php может анализировать нулевой элемент массива $_URL и решать, как поступать дальше. К примеру, он может подключать необходимый код с помощью инструкций require или include.

Преимущества данного метода в том, что сайт может находиться во вложенных папках, скажем в http://localhost/sites/my/, при этом массив $_URL не будет «загрязняться» элементами "sites" и "my". Это также даёт возможность переместить сайт во вложенный каталог или каталог выше без потери работоспособности. Также, если к адресу страницы приписать суффикс "index.html" или "index.php", адрес будет вести на страницу без суффикса (как в настоящих директориях).

Спасибо за внимание.

Комментарии (3) »

  1. Спасибо за статью! Очень пригодилась!

    Комментарий от moonmana — 2 сентября 2009 @ 21:39


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

    Для мало малоопотных рекомендую испытать данный скрипт добалением в конец index.php

    // последствующий код сайта
    echo "<pre>";
    var_export($_URL);
    echo "</pre>";
    

    После этого набираем: http://localhost/$mysite$/users/Figaroo/edit/
    , где $mysite$ – путь к вашему сайту, в том случае если он не расположен в http://localhost/
    И смотрим результат =).

    Комментарий от v01d.cmd — 16 декабря 2009 @ 19:45


  3. Спасибо огромное! Очень долго искал нечто такое! Мой ход – после разбора массива я по уникальному псевдониму ищу запись в базе (при создании записи псевдоним тоже вводится вручную) и делаю выборку. Примерно так получается http://mysite.com/stroitelstvo/montaj_okon_i_dverey
    Вобщем все работает просто идеально!

    Комментарий от Евгений — 22 января 2010 @ 17:00


RSS-лента комментариев к этой записи

Оставить комментарий

Пожалуйста, заполните все поля.

© Валерий 'Figaroo' Киркиж, 2008-2010 гг.