Проектирование адресного пространства сайта

13.01.2007

Проектирование системы адресации страниц сайта часто не выделяется в качестве отдельной задачи. Имена придумываются на ходу и в конечном итоге редко образуют стройную систему. Программисты всё переписывают и переписывают код контроллера, а время идет.

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

Постановка задачи
Скажем, мы делаем коллективный блог. В него пишут несколько авторов-экспертов. Есть главная лента со всеми свежими записями. И есть множество лент, которые «режут» контент по годам, по авторам, по тегам. Кстати, история основана на реальных событиях.

Базовое решение
site.ru/ — главная страница сайта.
site.ru/blog/ — блог.
site.ru/blog/2004/ — записи в блоге за 2004 год.

site.ru/blog/2004/
if-it-can-be-fixed.html
 — постоянный адрес записи, permalink.

site.ru/blog/2004/
it-can-be-fixed-12-june.html
 — снизим шансы появления в течение года еще одной записи с таким же названием, добавив в импровизированное имя файла дату.

Проблема нескольких плоскостей
Теперь придумаем структуру адреса отдельных авторских лент. Одного из наших блоггеров зовут Athabaska Dick (привет Reno Jimmy). Итак, какой же у ленты адрес?

site.ru/blog/authors/athabaska-dick/ — может так? Нет, плохо. Обычно так выглядят адреса страниц с информацией об авторе.

site.ru/blog/athabaska-dick/ — вроде хорошо.
site.ru/blog/athabaska-dick/
it-can-be-broke-12-june.html
 — резонно постоянный адрес записи сделать таким.

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

site.ru/blog/2004/
it-can-be-fixed-12-june.html

site.ru/blog/athabaska-dick/
it-can-be-fixed-12-june.html

Проблема фильтрации по нескольким критериям
Наш коллективный блог планируется достаточно масштабным, так что понадобится фильтрация не только по годам и по авторам, но и по годам и авторам.

Вот и четыре наших альтернативы.

site.ru/blog/2004/
it-can-be-fixed-12-june.html

site.ru/blog/2004/athabaska-dick/
it-can-be-fixed-12-june.html

site.ru/blog/athabaska-dick/
it-can-be-fixed-12-june.html

site.ru/blog/athabaska-dick/2004/
it-can-be-fixed-12-june.html

Если критериев будет больше, программист сойдет с ума.

Решение для простых случаев
site.ru/blog/
it-can-be-fixed-12-june-2004.html
 — в постоянных ссылках на самом деле не существует никаких каталогов. Уберем их из адресов страниц. И добавим в дату год.

Если нужна фильтрация максимум по одному критерию, сделаем так.

site.ru/blog/athabaska-dick/
site.ru/blog/2004/
site.ru/blog/PHP+MySQL/

Если хотим облегчить жизнь программисту, делаем как-то так.

site.ru/blog/by-author/athabaska-dick/
site.ru/blog/years/2004/
site.ru/blog/tags/PHP+MySQL/

Решение для крупных систем
site.ru/blog/?author=athabaska-dick&
year=2004&category1=PHP&category2=MySQL
 — классический вариант с километром переменных. Супернедружественный и супергибкий.

site.ru/blog/author:athabaska-dick+
year:2004+categories:PHP,MySQL/
 — можем уделить этому внимание и сделать очень внушительно. Оправдано ли?

Постраничный вывод
Постраничный вывод лент делаем в самом конце, либо с переменными, либо с дополнительным фальшивым каталогом.

В следующий раз
Наверно будет история про английские ключевые слова и траслит в адресах. Это сильно связано с SEO, но и проектировщикам важно.

Комментарии

Алексей Новиков, 14.01.2007 01:41

Такое дело: как много пользователей будет вместо удобных ссылок изменять URL? Особенно когда они не знают, как правильно писать, «Athabasca» или «Atabaska» ;)

Датами пользуются гораздо чаще, поэтому тут разумо оставить именно их, а коль уж есть такая необходимость, то предоставить адекватные инструменты на самом сайте.

Дмитрий Сергеев, 14.01.2007 01:49

Точно, имена авторов не всегда легко запомнить. Кто скажет, как по английски пишется "Сет Годен"? :)

Алексей Новиков, 14.01.2007 01:51

Только не «Годен», а «Годин» ;)

Кстати, не сработало оповещение по email о новых комментариях.

Дмитрий Сергеев, 14.01.2007 02:00

Я на французкий манер: там "Godin" будет читаться "Годен". А мне почему-то хочется считать его французом :)

Оповещения по e-mail часто рубятся, как спам. Например, на мой gmail все местные комментарии в "Спам" приходят. Подумаю, что сделать. Спасибо за feedback.

Reno Jimmy, 14.01.2007 16:23

Польщен :)

Добавлю, что в адресной строке не стоит смешивать транслит и английские слова.

Нужен единый стиль именования. Например, все разделители между словами -- дефисы, все буквы в названиях файлов -- маленькие, предлоги, союзы и артикли исключаются вообще, все слова в именительном падеже единстенного числа и так далее.

Дмитрий Сергеев, 14.01.2007 20:28

Да, а если транслит используется, нужны четкие правила перевода букв.

Орфографических ошибок в адресах быть не должно.

Неизвестных сокращений лучше избегать.

И еще миллион вещей :)

Развитие малого бизнеса, 10.07.2007 17:48

У каждого сайта есть вполне определенная тематика. Поэтому, определив 7-8 общих слов для названий категорий в них и делать прямые ссылки: site.com/blog/category/unique-name-of-the-post
Упоминание дат в ссылках - это все таже лишняя информация на подобие этой: site.ru/blog/?post=author-name&year&category:cat_name, отвлекающая внимание пользователя от темы статьи. Тем более, если ее использовать в конце или начале - по краям текста внимание визуально заострено, а так как в средине не воткнешь - не стоит использовать такой подход вообще.
Сочинять постоянную ссылку должны авторы, равно, как они же придумывают название статье. А движок должен проверять возможные коллизии, если при сокращении названия произойдет повторение. А поскольку на одном блоге по идее не будет двух одинаковых статей, то и совпадений тоже не будет.
А длинный пермалинк (7-8 слов) - не проблема, при современных разрешениях мониторов.

Thorn, 09.12.2007 21:08

а как такой вариант? Стандартный, для крупных систем:

Пост определенного юзера
user.site.ru/blog/post/my-new-post.html

Посты за 12 сентября:
user.site.ru/blog/2007/09/12/

Если несколько постов с одним именем то добавлем номер:

user.site.ru/blog/post/my-new-post/2.html

или
user.site.ru/blog/post/my-new-post-2.html

Дмитрий Сергеев, 10.12.2007 15:10

Нормально. Только вот в русских реалиях my-new-post будет выглядеть уж больно страшно :)