Nu este un răspuns, dar prea lung pentru a fi un comentariu.
@TeroKilkanen a făcut o presupunere:
S-ar putea să fie asta filtru_imagine
citește numele fișierului din $uri
variabilă și crede că imaginea este JPEG.
Să verificăm dacă este adevărat. Din fericire, nginx este un software open source și codul sursă al ngx_http_image_filter_module
este disponibil Aici.
Principalul ngx_http_image_body_filter
funcţie a început la linia 291.Să ne uităm la început:
...
comutator (ctx->faza) {
caz 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);
dacă (ctx->type == NGX_HTTP_IMAGE_NONE) {
if (conf->filter == NGX_HTTP_IMAGE_SIZE) {
out.buf = ngx_http_image_json(r, NULL);
dacă (out.buf) {
out.next = NULL;
ctx->phase = NGX_HTTP_IMAGE_DONE;
return ngx_http_image_send(r, ctx, &out);
}
}
returnează ngx_http_filter_finalize_request(r,
&ngx_http_image_filter_module,
NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);
}
...
Vedem că este ngx_http_image_test
funcție care este responsabilă pentru decizia privind validitatea imaginii. Să ne uităm la acea funcție (a început la linia 423):
static ngx_uint_t
ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in)
{
u_char *p;
p = in->buf->pos;
if (în->buf->last - p < 16) {
returnează NGX_HTTP_IMAGE_NONE;
}
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"filtru de imagine: \"%c%c\"", p[0], p[1]);
dacă (p[0] == 0xff && p[1] == 0xd8) {
/* JPEG */
returnează NGX_HTTP_IMAGE_JPEG;
} else if (p[0] == „G” && p[1] == „I” && p[2] == „F” && p[3] == „8”
&& p[5] == „a”)
{
dacă (p[4] == '9' || p[4] == '7') {
/* GIF */
returnează 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 */
returnează 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 */
returnează NGX_HTTP_IMAGE_WEBP;
}
returnează NGX_HTTP_IMAGE_NONE;
}
Cred că este destul de clar că funcția de mai sus analizează primii 16 octeți ai tamponului încercând să găsească una dintre cele patru semnături cunoscute. Deci problema nu este legată de $uri
valoare variabilă.
Care poate fi cauza? Bine, ngx_http_image_filter_module
documentație spune următoarele:
Acest modul utilizează libgd bibliotecă. Este recomandat să utilizați cea mai recentă versiune disponibilă a bibliotecii.
Suportul formatului WebP a apărut în versiunea 1.11.6. Pentru a transforma imaginile în acest format, libgd
biblioteca trebuie să fie compilată cu suportul WebP.
Poate că problema este în versiunea ta nginx. Verificați WebP-ul și filtru_imagine
compatibilitate fără transformări suplimentare URI, ceva de genul
locație ~ \.webp$ {
redimensionare image_filter 1200 -;
image_filter_jpeg_quality 80;
imagine_filter_buffer 10M;
}
și apoi solicitarea fișierului WebP existent în mod explicit. Dacă tot vei primi un 415 Tip media neacceptat
eroare, problema este cel mai probabil în versiunea dvs. nginx.