Không phải là một câu trả lời, nhưng quá dài để là một bình luận.
@TeroKilkanen đưa ra một giả định:
Nó có thể là image_filter
đọc tên tệp từ $uri
và nó cho rằng hình ảnh là JPEG.
Hãy kiểm tra nếu nó là sự thật. May mắn thay, nginx là một phần mềm mã nguồn mở và mã nguồn của ngx_http_image_filter_module
có sẵn đây.
chính ngx_http_image_body_filter
chức năng đã bắt đầu ở dòng 291.Hãy nhìn vào phần đầu:
...
công tắc (ctx->pha) {
trường hợp 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);
if (ctx->type == NGX_HTTP_IMAGE_NONE) {
if (conf->filter == NGX_HTTP_IMAGE_SIZE) {
out.buf = ngx_http_image_json(r, NULL);
nếu (out.buf) {
out.next = NULL;
ctx->giai đoạn = NGX_HTTP_IMAGE_DONE;
trả về ngx_http_image_send(r, ctx, &out);
}
}
trả về ngx_http_filter_Finalize_request(r,
&ngx_http_image_filter_module,
NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);
}
...
Chúng tôi thấy đó là ngx_http_image_test
chức năng chịu trách nhiệm cho quyết định về tính hợp lệ của hình ảnh. Hãy xem xét chức năng đó (đã bắt đầu tại dòng 423):
ngx_uint_t tĩnh
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) {
trả về NGX_HTTP_IMAGE_NONE;
}
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->kết nối->log, 0,
"bộ lọc ảnh: \"%c%c\"", p[0], p[1]);
nếu (p[0] == 0xff && p[1] == 0xd8) {
/* JPEG */
trả về NGX_HTTP_IMAGE_JPEG;
} khác nếu (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8'
&& p[5] == 'a')
{
if (p[4] == '9' || p[4] == '7') {
/* GIF */
trả lại NGX_HTTP_IMAGE_GIF;
}
} khác nếu (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 */
trả lại NGX_HTTP_IMAGE_PNG;
} khác nếu (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 */
trả về NGX_HTTP_IMAGE_WEBP;
}
trả về NGX_HTTP_IMAGE_NONE;
}
Tôi nghĩ khá rõ ràng là hàm trên phân tích 16 byte đầu tiên của bộ đệm để cố gắng tìm một trong bốn chữ ký đã biết. Vì vậy, vấn đề không liên quan đến $uri
giá trị biến.
Điều gì có thể là nguyên nhân? Tốt, ngx_http_image_filter_module
tài liệu nói như sau:
Mô-đun này sử dụng các libgd thư viện. Bạn nên sử dụng phiên bản mới nhất hiện có của thư viện.
Hỗ trợ định dạng WebP đã xuất hiện trong phiên bản 1.11.6. Để chuyển đổi hình ảnh ở định dạng này, libgd
thư viện phải được biên dịch với sự hỗ trợ của WebP.
Có thể vấn đề nằm ở bản dựng nginx của bạn. Kiểm tra WebP và image_filter
khả năng tương thích mà không cần bất kỳ phép biến đổi URI bổ sung nào, chẳng hạn như
vị trí ~ \.webp$ {
image_filter thay đổi kích thước 1200 -;
image_filter_jpeg_quality 80;
image_filter_buffer 10M;
}
và sau đó yêu cầu tệp WebP hiện có một cách rõ ràng. Nếu bạn vẫn sẽ nhận được một 415 Loại phương tiện không được hỗ trợ
lỗi, sự cố rất có thể xảy ra trong bản dựng nginx của bạn.