Дом Figaroo

Блог о web-программировании и разработке новой системы управления сайтами FigarooSiteEngine.
«Знание — могущество».

5 апреля 2009

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

написал Figaroo в рубрике Web-разработка @ 23:26

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

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

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

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

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

Теперь о том, как это реализовать для сайта на языке PHP. (Пример приведён для сервера Apache с включённым mod_rewrite.)

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

# включаем mod_rewrite
RewriteEngine On
# если запрашиваемый пользователем URL - это не существующий на сервере файл...
RewriteCond %{REQUEST_FILENAME} !-f
# ...и не существующая на сервере директория
RewriteCond %{REQUEST_FILENAME} !-d
# перенаправляем запрос пользователя на index.php
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", адрес будет вести на страницу без суффикса (как в настоящих директориях).

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

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

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

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


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

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

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

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

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


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

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


  4. Статью бы дополнить, что для этого необходим у Апача Mod_rewrite, для чего следует в файле httpd.conf (файл настроек Апача)
    раскомментить эту строчку (убрать #)
    LoadModule rewrite_module modules/mod_rewrite.so

    И неплохо было бы расписать, что конкретно делают эти строчки
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]

    Комментарий by Alurum — 12 августа 2010 @ 23:48


  5. 2Alurum: спасибо за отзыв, дополнил.

    Комментарий by Figaroo — 17 августа 2010 @ 22:46


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

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

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

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