Не ответ, но слишком длинный, чтобы быть комментарием.
@ТероКилканен сделал предположение:
Может быть, это image_filter
читает имя файла из $ури
переменная, и он думает, что изображение в формате JPEG.
Давайте проверим, правда ли это. К счастью, nginx — это программное обеспечение с открытым исходным кодом, и исходный код ngx_http_image_filter_module
доступен здесь.
Главный ngx_http_image_body_filter
функция начал в строке 291.Смотрим начало:
...
переключатель (ctx->фаза) {
случай NGX_HTTP_IMAGE_START:
ctx->type = ngx_http_image_test(r, in);
conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);
если (ctx-> тип == NGX_HTTP_IMAGE_NONE) {
если (conf->фильтр == NGX_HTTP_IMAGE_SIZE) {
out.buf = ngx_http_image_json(r, NULL);
если (out.buf) {
выход.следующий = NULL;
ctx->фаза = NGX_HTTP_IMAGE_DONE;
вернуть ngx_http_image_send (r, ctx, & out);
}
}
вернуть ngx_http_filter_finalize_request(r,
&ngx_http_image_filter_module,
NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);
}
...
Мы видим, что это ngx_http_image_test
функция, которая отвечает за решение о достоверности изображения. Давайте посмотрим на эту функцию (начал в строке 423):
статический ngx_uint_t
ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in)
{
u_char *p;
p = in->buf->pos;
if (in->buf->last - p < 16) {
вернуть NGX_HTTP_IMAGE_NONE;
}
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->соединение->журнал, 0,
"фильтр изображения: \"%c%c\"", p[0], p[1]);
если (p[0] == 0xff && p[1] == 0xd8) {
/* JPEG */
вернуть NGX_HTTP_IMAGE_JPEG;
} else if (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8'
&& р[5] == 'а')
{
если (p[4] == '9' || p[4] == '7') {
/* GIF */
вернуть NGX_HTTP_IMAGE_GIF;
}
} else if (p[0] == 0x89 && p[1] == 'P' && p[2] == 'N' && p[3] == 'G'
&& p[4] == 0x0d && p[5] == 0x0a && p[6] == 0x1a && p[7] == 0x0a)
{
/* PNG */
вернуть NGX_HTTP_IMAGE_PNG;
} else if (p[0] == 'R' && p[1] == 'I' && p[2] == 'F' && p[3] == 'F'
&& p[8] == 'W' && p[9] == 'E' && p[10] == 'B' && p[11] == 'P')
{
/* WebP */
вернуть NGX_HTTP_IMAGE_WEBP;
}
вернуть NGX_HTTP_IMAGE_NONE;
}
Я думаю, довольно ясно, что приведенная выше функция анализирует первые 16 байтов буфера, пытаясь найти одну из четырех известных сигнатур. Так что проблема не в нем $ури
переменное значение.
Что может быть причиной? Хорошо, ngx_http_image_filter_module
документация говорит последующий:
Этот модуль использует libgd библиотека. Рекомендуется использовать последнюю доступную версию библиотеки.
Поддержка формата WebP появилась в версии 1.11.6. Для преобразования изображений в этот формат libgd
библиотека должна быть скомпилирована с поддержкой WebP.
Возможно, проблема в вашей сборке nginx. Проверьте WebP и image_filter
совместимость без каких-либо дополнительных преобразований URI, что-то вроде
расположение ~ \.webp$ {
image_filter изменить размер 1200 -;
image_filter_jpeg_quality 80;
image_filter_buffer 10M;
}
а затем явно запросить существующий файл WebP. Если вы все еще получите 415 Неподдерживаемый тип носителя
ошибка, проблема, скорее всего, в вашей сборке nginx.