- добавлена сборка Caddy с Souin, Otter и NutsDB - добавлена конфигурация dev, prod и test Docker Compose - настроено кеширование через Otter L1 и NutsDB L2 - добавлены e2e-тесты Bun для кеша, restart и purge - добавлена документация по запуску, API кеша и тестам
4.2 KiB
4.2 KiB
URL-справочник
Формат URL
Unsigned (по умолчанию)
/unsafe/{processing_options}/plain/{source_url}
Signed
/{signature}/{processing_options}/plain/{source_url}
Source URL
Два варианта кодирования source URL:
| Вариант | Пример |
|---|---|
plain/{url} |
plain/https://example.com/photo.jpg |
{base64url} |
aHR0cHM6Ly9leGFtcGxlLmNvbS9waG90by5qcGc |
Processing options
Resize
Вписать в размер (сохраняет пропорции, не увеличивает):
/unsafe/resize:fit:{width}:{height}:0/plain/https://example.com/photo.jpg
Заполнить размер (сохраняет пропорции, обрезает лишнее):
/unsafe/resize:fill:{width}:{height}:0/plain/https://example.com/photo.jpg
Точный размер (растягивает/сжимает):
/unsafe/resize:force:{width}:{height}:0/plain/https://example.com/photo.jpg
height:0= автоопределение высоты по пропорциям.
Crop
/unsafe/crop:{width}:{height}:0/plain/https://example.com/photo.jpg
Качество
/unsafe/q:{1-100}/plain/https://example.com/photo.jpg
Конвертация формата
Добавить расширение к source URL:
/unsafe/q:80/plain/https://example.com/photo.jpg.webp
/unsafe/q:80/plain/https://example.com/photo.jpg.avif
Поддерживаемые форматы: JPEG, PNG, WebP, AVIF, GIF, ICO, SVG, TIFF, HEIC
Гравитация (для crop/fill)
/unsafe/resize:fill:400:300:0/g:ce/plain/https://example.com/photo.jpg
| Значение | Описание |
|---|---|
ce |
Центр (по умолчанию) |
no |
Верх |
so |
Низ |
ea |
Право |
we |
Лево |
noea |
Верх-право |
nowe |
Верх-лево |
soea |
Низ-право |
sowe |
Низ-лево |
Автоопределение высоты
height = 0 — imgproxy автоматически вычисляет высоту, сохраняя пропорции:
/unsafe/resize:fit:800:0:0/q:80/plain/https://example.com/photo.jpg
Примеры
Вписать в 800px по ширине, качество 80
http://localhost:8888/unsafe/resize:fit:800:0:0/q:80/plain/https://example.com/photo.jpg
Превью 200x200, качество 60
http://localhost:8888/unsafe/resize:fill:200:200:0/g:ce/q:60/plain/https://example.com/photo.jpg
Конвертация в WebP
http://localhost:8888/unsafe/q:80/plain/https://example.com/photo.jpg.webp
Комбинированная обработка
http://localhost:8888/unsafe/resize:fit:1200:0:0/g:ce/q:75/plain/https://example.com/photo.jpg.webp
Использование base64url
echo -n "https://example.com/photo.jpg" | base64 -w0 | tr '+/' '-_' | tr -d '='
# → aHR0cHM6Ly9leGFtcGxlLmNvbS9waG90by5qcGc
http://localhost:8888/unsafe/resize:fit:800:0:0/q:80/aHR0cHM6Ly9leGFtcGxlLmNvbS9waG90by5qcGc
Подпись URL (HMAC-SHA256)
Когда заданы IMGPROXY_KEY и IMGPROXY_SALT, каждый запрос должен быть подписан.
import crypto from 'crypto'
function signUrl(key: string, salt: string, path: string): string {
const hmac = crypto.createHmac('sha256', Buffer.from(key, 'hex'))
hmac.update(Buffer.from(salt, 'hex'))
hmac.update(path)
const signature = hmac.digest().slice(0, 32).toString('base64url')
return `/${signature}${path}`
}
// Использование:
const path = '/resize:fit:800:0:0/q:80/plain/https://example.com/photo.jpg'
const url = signUrl(IMGPROXY_KEY, IMGPROXY_SALT, path)
// → /SIGNED_SIGNATURE/resize:fit:800:0:0/q:80/plain/https://example.com/photo.jpg
Внимание: В SPA-приложениях ключи подписи утекают в браузер. Рекомендуется использовать unsigned режим (
/unsafe/) сIMGPROXY_ALLOWED_SOURCESдля защиты.
Справочник
Полная документация по параметрам обработки: imgproxy.net/docs