Перейти к основному содержимому

Как работают превью

Адрес и есть путь файла​

/assets/components/prism/img/card/8f3a1c2d9e4b7a60f512/prism/12/sunset.jpg.webp
│ │ │ │
│ │ │ └ формат
│ │ └ путь оригинала в источнике
│ └ подпись HMAC
└ пресет (`card@2x` для плотности 2)

Первый запрос обрабатывает img/index.php: проверяет подпись, генерирует картинку через Glide и кладёт её ровно по этому пути. Все следующие запросы отдаёт веб-сервер как обычный статический файл с Cache-Control: immutable — PHP не запускается вовсе.

Порядок операций​

Каждый шаг работает с результатом предыдущего, поэтому порядок важен:

#ШагОткуда берётся
1Поворот по EXIFСам файл
2Кадр элементаРамка в диалоге, доли оригинала
3Размер и режимПоля пресета
4ФильтрыНастройки и «Опции» пресета
5Водяной знакТам же
6Фон и рамка (bg, border)Там же
7Формат и качествоПоля пресета

Кадр стоит до пресета: дальше пресет имеет дело только с выделенным прямоугольником, он и есть «оригинал» для всего, что ниже. Поэтому кадр действует сразу во всех пресетах, а srcset и атрибуты width/height считаются от него.

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

Подпись​

Адрес подписан ключом prism.signing_key. Испорченный на один символ адрес отдаёт 403.

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

предупреждение

Ключ подписи не публикуйте и не переносите между сайтами. Смена ключа делает все ранее выданные адреса недействительными — понадобится сбросить кэш превью.

Два режима​

prism.thumb_modeКак работает
ondemand (по умолчанию)Превью создаётся при первом запросе. Нужен rewrite на img/index.php.
pregenerateВсе пресеты, плотности и форматы создаются сразу при загрузке файла. Rewrite не нужен, загрузка дольше, диска занимает больше.

Переключились на pregenerate на живом сайте — прогоните thumbs:regenerate для уже загруженных элементов.

Что не превьюируется​

SVG превью не получает — растрировать вектор незачем, отдаётся сам файл. Он при этом не «как пришёл»: при загрузке из него вырезаются скрипты, обработчики событий и внешние ссылки, а отдаётся он с ограничительным Content-Security-Policy (на Apache — из .htaccess, который Prism кладёт в папку, на nginx — из правила в конфиге, см. Установку).

У видео и embed превью строится из обложки: она скачана как обычный файл элемента, поэтому работает так же, как изображение.