Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Формат AVIF и «Эгея»

Есть такой современный формат графики — AVIF, который родился из видеоформата AV1. Интересен он тем, что даёт иногда существенную выгоду от использования — в моём непоказательном эксперименте на первой попавшейся картинке он уделал формат JPEG на порядок).

Вместе с тем он неплохо поддерживается современными браузерами — 79% по данным сайта CanIUse. Это ещё без учёта полифилов.

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

Уровень поддержки браузерами формата графики AVIF

У меня возникла хорошая, на первый взгляд, идея чуть упростить себе жизнь через модуль mod_rewrite веб-сервера «Апач» («Эгея» его требует, у меня на хостинге он тоже используется) при помощи примерно такого правила:

<IfModule mod_rewrite.c>
AddType image/avif .avif

RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/avif
RewriteCond %{REQUEST_FILENAME} \.jpg$
RewriteCond "%{REQUEST_FILENAME}.avif" -s
RewriteRule ^.*$ $0.avif [END,T=image/avif]
</IfModule>

Что тут написано? Если браузер поддерживает формат AVIF (смотрим в заголовке), и запрашивает JPEG (определяется по расширению), и существует файл ненулевой длины с расширением .avif (то есть image.jpg.avif, например), то отдаём ему AVIF.

Хорошо работает, пока в папке с картинками лежит только image.jpg.avif, как только кладёшь ещё и image.jpg — перестаёт, отдаётся только она. Вчера час наверное думал что не так, пока наконец не понял — поверх «Апача» на хостинге стоит nginx, а ему мои правила по барабану.

Если картинки по урлу нет, то nginx отдаёт запрос дальше в «Апач», срабатывает правило, отдаётся AVIF, как только кладёшь JPEG, nginx его видит, отдаёт по урлу, не спрашивая «Апач» ни о чём.

Что с этим делать пока — не знаю, вероятно ничего, nginx никто отключить не даст (у меня обычный дешёвый хостинг без затей), буду думать над другими способами.

1 комментарий
Кирилл 2023

Класть в папку image.jpg.jpg, если нет .avif — рерайтить в .jpg.jpg
Люблю изобретать костыли :)

Евгений Степанищев 2023

Я думал об этом, вся последовательность будет выглядеть так:
1) кладём image.jpg через Эгею, чтобы сработал синтаксис Эгеи и из картинки сделалась превьюшка для поиска
2) сохраняем заметку
3) переименовываем (через FTP, например) image.jpg → image.jpg.jpg
4) доливаем image.jpg.avif

при изменении заметки — повторяем. Слишком много телодвижений. Я сейчас думаю над тем как перейти на avif полностью