Формат AVIF и «Эгея»
Есть такой современный формат графики — AVIF, который родился из видеоформата AV1. Интересен он тем, что даёт иногда существенную выгоду от использования — в моём непоказательном эксперименте на первой попавшейся картинке он уделал формат JPEG на порядок).
Вместе с тем он неплохо поддерживается современными браузерами — 79% по данным сайта CanIUse. Это ещё без учёта полифилов.
Мне очень хочется его использовать и я ищу способ это сделать в движке «Эгея», который я использую у себя в блоге. Можно было бы просто вставлять эту картинку как HTML, но это не очень-то удобно — у «Эгеи» есть специальная разметка, которая даёт несколько плюсов — в частности с ней дружит встроенный редактор и из неё лучше готовятся поисковые снипеты.
У меня возникла хорошая, на первый взгляд, идея чуть упростить себе жизнь через модуль 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 никто отключить не даст (у меня обычный дешёвый хостинг без затей), буду думать над другими способами.
Класть в папку image.jpg.jpg, если нет .avif — рерайтить в .jpg.jpg
Люблю изобретать костыли :)
Я думал об этом, вся последовательность будет выглядеть так:
1) кладём image.jpg через Эгею, чтобы сработал синтаксис Эгеи и из картинки сделалась превьюшка для поиска
2) сохраняем заметку
3) переименовываем (через FTP, например) image.jpg → image.jpg.jpg
4) доливаем image.jpg.avif
при изменении заметки — повторяем. Слишком много телодвижений. Я сейчас думаю над тем как перейти на avif полностью