Урлопарсер и урлогенератор в Эгее

Я писал, что в Эгее было сделано несколько важных изменений на системном уровне; тогда я рассказал об отказе от реестра. Кривость внутреннего устройства не мешала Селекте (предыдущий релиз) быть лучшим движком блога, но мешала мне её развивать. Сегодня расскажу об урлах.

Раньше как было: все урлы были прописаны в файле .htaccess в виде инструкций мод_реврайта. Даже не буду показывать, на это было больно смотреть. Помимо, собственно, зависимости от мод_реврайта это создавало ещё кучу неудобств. Например, добавление новой страницы означало изменение хтакцесса. Поскольку у меня было автообновление, то движку приходилось править собственный хтакцесс, из-за чего к нему нужен был доступ на запись.

Теперь урлы разбирает сам движок; если реврайта нет, то в урле появляется ?go=, а остальная часть не меняется. Поэтому движку, во-первых, не нужен мод_реврайт, а во-вторых не нужно ничего менять в хтакцессе при добавлении новых страниц. Тут выяснилась приятная деталь: оказывается, мод_реврайт был единственным, что привязывало движок к Апачу; Эгея прекрасно работает и на nginx, и на lighttpd (на русском эти названия непередаваемы).

Разбор урла заключается в том, что любой урл преобразуется в название функции-обработчика, называемой candy (режим или служба в моей старой терминологии; сейчас ещё появились аджакс-обработчики как отдельный институт) и массив её параметров. Например, урл этой заметки /2011/04/25/1/ преобразуется вот во что:

$candy = 'e2m_note'

$parameters = array (
  'year' = '2011',
  'month' = '04',
  'day' = '25',
  'day-number' = '1',
)

Дальше специальный фильтр проверяет, залогинен ли пользователь, а если нет, то можно ли ему выполнять эту candy (смотреть на заметку можно всем, а вот редактировать — только мне, вот смотрите). Если можно, то e2m_note () вызывается для генерации контента страницы с массивом $parameters в качестве параметра. Сама она не интересуется урлом и просто собирает заметку по этим параметрам.

Урлогенератора не было вообще: ссылки писались прямым текстом или собирались из кусков как строки. Если урл чего-то изменялся, то потом можно было целый год обнаруживать глюки, связанные с тем, что в какой-то хитрой ситуации ссылка вела не туда. Сейчас есть функция e2_compose_url (), в которую передаётся candy и её параметры. Поэтому если функции генерации заметки нужно передать в шаблонизатор урлы тегов, то для каждого тега она делает так:

e2_compose_url ('e2m_tag', array ('tag-urlname' => $tagrec['URLName']))

На самом деле это означает «сгенерировать урл, переход по которому вызывал бы e2m_tag (array (’tag-urlname’ => $tagrec[’URLName’]))».

Итого, профит: независимость от мод_реврайта, Апача; гибкость в настройке урлов, независимость урлов от кода, который их обрабатывает; более высокая пуленепробиваемость кода. Когда-нибудь в следующей серии расскажу про шаблонизатор.

Дальше
19 комментариев
Руслан Кеба 2011

Избавление от mod_rewrite — это правильно. Теперь по идее без сложностей должен заработать даже на IIS 6 и 7.
Nginx на русском по-моему вполне передаваем: энджинкс.
А lighttpd — да, проблема :)

Артём 2011

Nginx = Engine X

Илья Бирман 2011

Детский сад :-) Хотели бы, так бы и назвали.

Александр 2011

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

Илья Бирман 2011

Раскладку лень переключать, и хочется его склонять как-то.

Олег Французов 2011

lighttpd — лайти.

Илья Бирман 2011

Как я уже ответил выше про нгинкс, хотели бы — так бы и назвали. Но авторы решили назвать его «млсчъщ» или каким-то другим случайным непроизносимым набором букв, так что так он и называется.

Clq 2011

Аджакс, но Микрософт? Нелогичненько.

Илья Бирман 2011

Боже, как вы все запарили. Совсем больше не о чем поговорить?

Clq 2011

Каков поп, таков и приход. Попарю еще немножко. Урогенератор? Генератор хвостов? :)

Александр Савенков 2011

Аксесс же, а то звучит, как какой-нибудь Хауз.

Семен Перепелица 2011

Интересно, вы всё это придумываете никуда не подглядывая? :-) Ведь все эти проблемы уже решены, например, в виде фреймворка «Руби на Рельсах». Можно было бы не строить свой велосипед, а взять уже существующий.

Илья Бирман 2011

Руби на Рельсах — это интересно, но на хостингах его нет. Я же делаю продукт для всех, а не для тех, кто будет специально для него хостинг подбирать.

Сергей Леньков 2011

Кстати да. Использование готовых фреймворков освобождает время для решения других проблем.

Vadim Kalinsky 2011

Вот так прочитал статью, а кроме привкуса «хтакцесс» и «ажакс» ничего не запомнилось. Это как крутить ручку в руках, когда что-то рассказываешь — все внимание публики будет приковано к этой гребаной ручке, а твои слова улетят в пустоту.

Семен Перепелица 2011

Илья, а в чём проблема сменить хостинг? Это что-то принципиальное? Тем более, что существует достаточно простой вариант «Хероку», который мне очень нравится. Он также имеет бесплатный тарифный план для низконагруженных приложений.

Алексей Кирпичников 2011

Илья, вы иногда перебарщиваете со своей напускной манией величия. У вас получается хуже, чем у Лебедева, потому что вы иногда лажаете в хвастовстве. Например, в этой заметке вы пишете, что Эгея была лучшим движком блога, а потом сразу же не стесняясь перечисляете такие ужасы реализации, от которых задрожали бы колени у студента 3-4 курса соответствующей специальности. Не говоря уже о том, что все ваши изящные решения были придуманы и реализованы во всех приличных фреймворках (например, Symfony, если рассматривать PHP) еще до версии 1.0.

Позвольте я дам вам совет? Пишите в блоге, что у вас самый лучший движок, а ужасы молча исправляйте. Лебедев всегда так делает, по-любому.

Илья Бирман 2011

Да пофиг мне, как Лебедев делает.

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

Захар Кириллов 2011

Прекрасно понимая, что морализаторство — это последнее, что ты хочешь услышать, всё равно не могу удержаться, поэтому заранее прошу прошения.

Сейчас 2011 год. Ты переизобретаешь велосипед нууу, пусть 2005 года. Это позволительно студенту. А в этом случае мне кажется, что ты зря растрачиваешь свой талант. На мой взгляд, гораздо круче делать проекты типа Биатлона, где код никто не увидит. А учитывая закрытость кода Эгеи, мне страшно представить, что там может быть ещё понаколбашено.

Илья Бирман 2011

Люди, проснитесь! Насрать ведь, что там понаколбашено!

Захар Кириллов 2011

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

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

Илья Бирман 2011

«Мы работаем с теми, кто нам доверяет» © Альфа-банк.

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

Анонимус 2011

Какая твою мать вам разница что там внутри? Почему вас не сильно волнует устройство холодильника, стиральной машинки или фена вашей жены? Или перед использованием вы это все разбираете и изучаете? Нет, вы просто втыкаете в розетку и все. Работает, выполняет задачи, а что под капотом неважно.

Sergey Azarkevich 2011

То, что «понаколбашено» имеет тенденцию со временем вылезать наружу.

Коля Митин 2011

Илья, ты запарил. lighttpd называется Лайти, об этом даже на его сайте написано. Хватит выдавать желаемое за действительное. ;)

Илья Бирман 2011

«Даже на его сайте», ну прям офигеть. То есть в самом названии название не написано, нужно сходить на сайт, не верить своим глазам? Мне вот как-то не приходит в голову, например, справиться на сайте, как читается Sony (а вдруг оно читается «сосиска» или вообще «брюква»?).

Действительное состоит в том, что lighttpd никак не читается, это просто набор букв.

Коля Митин 2011

а вдруг оно читается «сосиска» или вообще «брюква»

Не надо подменять слово «называется» словом «читается». Apache по-французски тоже набор букв. Или можно даже кирилицей набрать АРАСНЕ. lighttpd действительно набор букв, но сервер называется Лайти.

Илья Бирман 2011

Боже, я даже не заметил, что использовал два разных слова; в голову бы не пришло проводить между ними границу. То есть тут невозможно узнать, как называется продукт, прочитав его название. Makes sense.

Кирилл Панфилов 2011

Илья, а почему решил из Эгеи убрать файловый менеджер, бэкап, рестор и автообновление? Удобные же вещи. При работе в вордпрессе мне как раз не хватало файлового менеджера; автообновление вообще очень приятная вещь, а резервные копии гораздо удобнее делать через интерфейс, тем более, что так можно хранить не только данные из базы (и явно удобнее, чем через дамп). Чисто вкусовое?

Мои книги