ЧПУ – Человеко-Понятные УРЛ. Все знают, насколько отличается мозг компьютера от мозга человека. Если компьютеру проще понять цифры (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. Обязательно оставьте свой!
Спасибо, только есть много плагинов, которые уже сразу ссылки преобразуют
хочу сделать понятные урлы,
а код не работает.. Или я чтото делаю не так? Подскажите…
RewriteEngine on
RewriteRule ^.htaccess$ – [F]
RewriteRule ^([0-9]+)\.htm$ index.php?page=$1 [L]
RewriteRule ^([0-9]+)\.html$ index.php?page=$1 [L]
А если чтото есть лучше, то посоветуйте! Спасибо…
Луганский портал, помещайте в .htaccess код, приведенный в записи. Создайте control.php, в этом файле в $_GET[do] будет запрашиваемая страница.
При запросе сайт/lugansk.html
$_GET[do] = lugansk.html
А не будет ли слишком медлленно работать если по ид из базы выбирать?
Выбирать по id что?
Интересная идея, всё время пользовался только .htaccess
Надо будет попробывать, похоже оно даже безопаснее.
А вот с первым параграфом поспорю, у меня любимая ОС – Linux! :-p
Php функция explode() работает намного медленнее чем mod_rewrite, поэтому тут тоже надо меру знать.
Единственный значимый плюс этого метода – простота (но это субъективно). Если вы знаете регулярные выражения, то написать разбор урла вам будет не сложно.