ไม่ใช่คำตอบ แต่ยาวเกินไปที่จะแสดงความคิดเห็น
@เทโร คิลคาเนน ตั้งสมมติฐาน:
อาจเป็นอย่างนั้น 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, ใน);
        conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);
        ถ้า (ctx->พิมพ์ == NGX_HTTP_IMAGE_NONE) {
            ถ้า (conf->filter == NGX_HTTP_IMAGE_SIZE) {
                out.buf = ngx_http_image_json(r, NULL);
                ถ้า (out.buf) {
                    out.next = NULL;
                    ctx->เฟส = NGX_HTTP_IMAGE_DONE;
                    ส่งคืน ngx_http_image_send(r, ctx, &ออก);
                }
            }
            ส่งคืน 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 *ใน)
{
    u_char *p;
    p = in->buf->pos;
    ถ้า (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;
    } อื่นถ้า (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8'
               && p[5] == 'ก')
    {
        ถ้า (p[4] == '9' || p[4] == '7') {
            /* กิฟ */
            ส่งคืน NGX_HTTP_IMAGE_GIF;
        }
    } อื่นถ้า (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;
    } อื่นถ้า (p[0] == 'R' && p[1] == 'I' && p[2] == 'F' && p[3] == 'F'
               && p[8] == 'W' && p[9] == 'E' && p[10] == 'B' && p[11] == 'P')
    {
        /* เว็บพี */
        กลับ 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 ของคุณมากที่สุด