- Человеку Понятный Урл
-
ЧПУ (англ. Friendly URL) — аббревиатурой от словосочетания «человекопонятный урл» (где «урл» — жаргонное обозначение
Содержание
Классический подход
Обычно параметры запроса (например, ID нужной страницы) передают сайту через GET-запрос, то есть указывая в URL после вопросительного знака в виде:
/acticles.php?tag=summer&action=list
— просмотр списка статей с меткой summer (лето)./news.php?topic=4&year=2003&month=10&sort=1
— отсортированные новости по теме 4 за октябрь 2003./catalogue.php?sect=11&kind=6&manuf=63
— товары производителя 63 типа 6 в отделе 11.
Это вполне понятно и естественно для разработчиков и программ, но не совсем понятно и не удобно для посетителей. Даже если числовые идентификаторы полностью заменить на человеческие слова, то адрес всё равно останется очень громоздким. А когда параметров много и у них длинные названия, то URL может не помещаться полностью в адресную строку создавая дополнительные неудобства. В итоге URL становится непригодным для человека.
Также адреса часто становятся привязанными к технической реализации, так как, например, в «чистом»[1]
Концепция ЧПУ
Концепция ЧПУ предполагает максимально лаконичные и интуитивно понятные адреса, которые показывают естественную для человека логическую структуру данных на сервере, а не её программный интерфейс с модулями и параметрами. Структуру обычно представляют в виде иерархии как в обычной файловой системе, к которой привык пользователь.
Те же самые примеры, но с ЧПУ будут выглядеть уже так:
/articles/by-tags/summer.html
— статьи по меткам, метка «лето»./news/sport/2003/10/
— новости спорта, 2003 год, октябрь./catalogue/light/bulbs/ge/
— каталог товаров, отдел «Свет», лампочки, производитель GE.
Достоинства для посетителя очевидны:
- подобные адреса очень легко запомнить;
- можно продиктовать URL по телефону;
- чтобы перейти на уровень вверх достаточно стереть нужную часть пути;
- если человек уже был на вашем сайте и набирает адрес вручную, то он сразу может обратиться к нужному ему документу глядя на URL’ы предыдущих запросов.
Недостатки:
- увеличение затрат ресурсов сервера для большинства реализаций;
- усложнение настройки сайта в связи с необходимостью вмешиваться в конфигурационные файлы веб-сервера.
Реализация
Apache
Для веб-сервера
В большинстве случае в файле .htaccess указывается с помощью регулярного выражения формат URL, который должен быть обработан как другой URL. Например:
RewriteEngine on RewriteRule article/(\d+)/? article.php?id=$1 [L]
Первая строчка включает mod_rewrite. Во второй указывается, что веб-сервер при запросе URL вида
/article/450/
должен обратиться к/article.php?id=450
.Обработка URL в собственном скрипте
Разработчик может вручную обработать URL и на основе него вызвать какую-то функцию. Для этого, чаще всего, нужно с помощью mod_rewrite направить все запросы одному скрипту для обработки. Для этого нужно добавить в файл .htaccess следующее содержимое:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L,QSA]
Скрипт
index.php
уже будет брать URL из переменнойREQUEST_URI
(в $_SERVER['REQUEST_URI']) и на основе каких-то настроек запускать необходимый код.Веб-Django или Ruby on Rails, веб-сервер не обращается напрямую к скрипту через URL (как, например, в чистом
Для задачи шаблона URL используется либо регулярные выражения, либо специальный язык.
Например, в RubyOnRails:
ActionController::Routing::Routes.draw do |map| map.connect 'users', :controller => 'user', :action => 'list' map.connect 'users/:id', :controller => 'user', :action => 'show' end
Строка
'users/:id'
указывает на любые URL вида/users/1
или/users/login
. Когда посетитель запросит такой адрес, то будет вызван методshow()
классаUserController
, а номер, которым заменил:id
(в этом примере это 1 или login) будет передан как параметр. Собственно, при запросе страницы/users/
будет вызван методlist()
того же класса, но уже без параметров.В некоторых веб инструментариях (например, Ramaze написанном на
Например, если у нас есть класс:
class CommentsController < Ramaze::Controller def index # Создание списка комментариев end def show(id) # Вывод комментария с нужным ID end end
То чтобы вывести комментарий по ID равным 5 мы должны открыть URL
/comments/show/5/
, то есть URL становится вида/класс/метод/первый аргумент/второй аргумент/
. Конечно же обратиться мы можем только к классам, которые являются контроллерами, то есть к тем классам, для которых мы специально указали, что они должны обслуживать посетителей.Случаи, когда введение ЧПУ не оправдано
В случаях когда адрес не виден пользователю (например,
Примечания
- ↑ Без использования веб-framework’ов
Ссылки
- «§ 48. Боремся за чистоту URL», Артемий Лебедев, «ру/Ководство», 23 марта 2000
- «§ 49. Дублирующая навигация», Артемий Лебедев, «ру/Ководство», 22 апреля 2000
Wikimedia Foundation. 2010.