ไม่ใช่คำตอบ แต่ยาวเกินไปที่จะแสดงความคิดเห็น
@เทโร คิลคาเนน ตั้งสมมติฐาน:
อาจเป็นอย่างนั้น 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 ของคุณมากที่สุด