Как работают превью
Адрес и есть путь файла
/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 превью строится из обложки: она скачана как обычный файл элемента, поэтому работает так же, как изображение.