ชนิด nginx, x-accel-redirect และ mime


9

ในการตั้งค่า nginx 0.8.34 ของฉันฉันกำลังใช้คุณสมบัติ X-Accel-Redirect เพื่อควบคุมการดาวน์โหลดไฟล์ในรหัสแอปพลิเคชันในขณะที่ไม่มีแอปพลิเคชันจัดการการดาวน์โหลดเอง

หลังจากความเจ็บปวดมากมายตอนนี้ก็ใช้งานได้ยกเว้น nginx จะส่งคืนไฟล์ที่มีtext/htmlประเภทเนื้อหาเสมอ

ประเภทเนื้อหาเริ่มต้นคือ application / octet-stream ที่ระบุในhttpบล็อก

บล็อกเซิร์ฟเวอร์ประกอบด้วยคำจำกัดความของไดเรกทอรีที่จัดเก็บไฟล์:

location /files {
  default_type  application/octet-stream;
  alias /srv/www/uploads;
  internal;  
}

ดังนั้นฉันจึงระบุประเภทเนื้อหาแม้ที่นี่ แต่ไม่มีอะไรเปลี่ยนแปลง

ฉันไม่ต้องการตั้งค่าประเภทเนื้อหาตามแอปพลิเคชันเพราะหลังจากนั้นฉันจะทำให้ช้าลง (ฉันต้องพิจารณาก่อน) ดังนั้น nginx ในอุดมคติจะคืนค่า mimetype ที่ถูกต้องตามนามสกุลไฟล์ (ฉันรวม mime.types ไว้ในhttpบล็อก)

คำตอบ:


12

หากคุณต้องการให้ nginx เดาประเภท mime ที่เหมาะสมคุณต้องตรวจสอบให้แน่ใจว่าไม่มีการส่งคืนชนิดเนื้อหาจากเซิร์ฟเวอร์ส่วนหลังของคุณ

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response

1
ด้วย tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('ประเภทเนื้อหา') เป็นวิธีการ. clear ตั้งค่าเนื้อหาให้เป็นข้อความ / html
Anthony

1

ฉันเป็นการส่วนตัวเพียงตั้ง application / octet-stream ในแอปพลิเคชั่น แต่คุณอาจใช้fastcgi_ignore_headersเพื่อป้องกัน Nginx จากการใช้ส่วนหัวที่จัดไว้ด้านหลัง

fastcgi_ignore_headers Content-Type;

ขอบคุณสำหรับคำตอบ. ฉันต้องการเซิร์ฟเวอร์ประเภทเนื้อหาที่แตกต่างกันเพื่อให้ภาพที่แสดงเป็นภาพและไฟล์ zip มีให้เป็นตัวเลือกการดาวน์โหลด ดังนั้นน่าเสียดายที่นี่ไม่ได้แก้ปัญหาเลย
โทมัสโคห์ล

คุณลองหรือคุณแค่สมมติว่ามันใช้งานไม่ได้? โดยไม่สนใจส่วนหัวที่ให้มาด้วยแบ็คเอนด์ก็ควรพยายามที่จะพิจารณาตามไฟล์
Martin Fjordvald

2
Content-Typeหนึ่งไม่สามารถละเลย ตามwiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headersค่าที่เป็นไปได้X-Accel-Redirect, X-Accel-Expires, ExpiresหรือCache-Control
jnns

1
"เป็นไปได้ที่จะระบุส่วนหัวเช่น" ในขณะที่การใช้ถ้อยคำที่ไม่เหมาะสมไม่ได้หมายความว่า "ค่าที่เป็นไปได้คือ" ฉันเพิกเฉยต่อ Content-Type ก่อนรวมกับ x-accel-redirect ดังนั้นฉันไม่คิดว่ามันเป็นไปไม่ได้แม้ว่าฉันจะยอมรับว่าฉันไม่สนิทกับรายละเอียดที่น่ากลัว
Martin Fjordvald

@MartinFjordvald ลองแล้ว nginx ปฏิเสธที่จะเริ่มบ่นnginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27แต่ได้fastcgi_ignore_headers "Expires"ผล
dnozay

0

ด้วย php-fpm:

<?php
    header("Content-Type: ");
    header("X-accel-redirect: (...)");

บอก php ว่าจะไม่ส่งส่วนหัวของประเภทเนื้อหาเลย (ไม่ใช่แม้แต่อันที่ว่างเปล่า) และ nginx จะเดาประเภทให้คุณและเพิ่มส่วนหัว :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.