Красивые ссылки (ЧПУ)

Опубликовано 18 мая, 2009 в PHP, Сайтостроительство

ЧПУ – Человеко-Понятные УРЛ. Все знают, насколько отличается мозг компьютера от мозга человека. Если компьютеру проще понять цифры (ID), то человеку – буквы и картинки. Также для человека неестественны GET-параметры в строке браузера, его глазу нужны естественные пути, такие, как в его любимом Windows.

domain.ru?category=122&page=222 – такой вид УРЛ неестественен для человека. domain.ru/122/222.html – вот это другое дело.

ЧПУ реализуется посредством технологии mode_rewrite (если мы имеем дело с вебсервером Apache). В файл .htaccess, находящийся в корне сайта, вписывается регулярное выражение, которое преобразовывает содержимое адресной строки браузера клиента в GET-запрос. Например:

RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)\.html$ /?category=$1&page=$2 [L]

Такое регулярное выражение преобразовывет «/category/334.html» в понятный компьютеру формат (GET) – «?category=category&page=334″. Скрипты принимают и обрабатывают уже понятный ему запрос ($_GET['var']).

Почти все книги и мануалы учат обрабатывать запросы именно в .haccess (разделять на GET переменные). Я же считаю, что наиболее удобно и гибко будет передавать человекоподобный запрос какому-либо скрипту (ядру системы) целиком, а уже в скрипте разбирать его по крупицам. Например:

DirectoryIndex control.php
RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) /control.php?do=$1 [L]

Этот обработчик в .htaccess посылает всю правую часть УРЛ скрипту control.php. Нужный нам запрос хранится в $_GET['do']. Уже внутри скрипта должно происходить разбиение этого запроса на частицы и подключение тех или иных модулей. Вот пример содержания control.php:

<?php
$do = $_GET['do'];
$do = explode('/', $do);
print_r($do);
//все необходимые данные содержатся в массиве $do,
//этот массив заменяет нашему человекопонятному сайту
//нечеловекопонятный $_GET.
?>

Теперь скрипт (control.php) может разбить запрос «/films/235/» на отдельные, понятные ему частичики. Теперь он знает, что клиент требует отдать ему некий фильм под ID=235. Апач не ищет папку «/fimls/235/», он следует условию в .htaccess и передает полное УРЛ файлу control.php GET запросом. Тот, в свою очередь, разделяет запрос на слеши (explode), подключает нужные модули и формирует выдачу в браузер.

Можно сделать УРЛ еще более человекопонятным и передавать название в транслите, а не ID нужного фильма. Соответственно, control.php будет производить выборку из базы уже исходя не из ID, а из названия. В любом случае, определить то, что нужно посетителю, ему не составит особого труда.

По-моему, второй способ (обработка в PHP скрипте) в разы проще, удобней и универсальней, чем первый (обработка в .htaccess).




Комментарии «Красивые ссылки (ЧПУ)»:
Комментариев: 7. Обязательно оставьте свой!
forex 25.06.2009 в 15:46

Спасибо, только есть много плагинов, которые уже сразу ссылки преобразуют

Луганский портал 06.09.2009 в 22:33

хочу сделать понятные урлы,
http://rebiznes.ru/index.php?page=2_lugansk.html
а код не работает.. Или я чтото делаю не так? Подскажите…
RewriteEngine on
RewriteRule ^.htaccess$ – [F]

RewriteRule ^([0-9]+)\.htm$ index.php?page=$1 [L]
RewriteRule ^([0-9]+)\.html$ index.php?page=$1 [L]
А если чтото есть лучше, то посоветуйте! Спасибо…

pistol 06.09.2009 в 22:43

Луганский портал, помещайте в .htaccess код, приведенный в записи. Создайте control.php, в этом файле в $_GET[do] будет запрашиваемая страница.

При запросе сайт/lugansk.html
$_GET[do] = lugansk.html


А не будет ли слишком медлленно работать если по ид из базы выбирать?

pistol 13.01.2010 в 16:32

Выбирать по id что?

Nervjaga 06.08.2010 в 16:57

Интересная идея, всё время пользовался только .htaccess
Надо будет попробывать, похоже оно даже безопаснее.
А вот с первым параграфом поспорю, у меня любимая ОС – Linux! :-p

JBoo 31.08.2010 в 11:12

Php функция explode() работает намного медленнее чем mod_rewrite, поэтому тут тоже надо меру знать.
Единственный значимый плюс этого метода – простота (но это субъективно). Если вы знаете регулярные выражения, то написать разбор урла вам будет не сложно.

Ваш комментарий: