ฉันจะแน่ใจได้อย่างไรว่า Nginx ให้บริการไฟล์ธรรมดาในรูปแบบการดาวน์โหลดแทนที่จะเป็นแบบอินไลน์


18

ฉันมีแอปพลิเคชั่น Rails (Redmine) ซึ่งใช้งานได้กับ Nginx หากฉันคลิกที่ไฟล์แนบใด ๆ เบราว์เซอร์ของฉัน (firefox, เช่น, chrome) ขอให้ฉันดาวน์โหลดไฟล์ แต่ถ้าฉันคลิกที่ไฟล์แนบประเภท txt เบราว์เซอร์ของฉันจะเปิดไฟล์นี้ในเบราว์เซอร์

ดังที่ฉันเข้าใจว่ามันเป็นหน้าที่ของ Nginx ในการตัดสินใจ - เปิดไฟล์ในเบราว์เซอร์หรือดาวน์โหลด ฉันจะตั้งค่าได้อย่างไร

คำตอบ:


10

ประเภทเริ่มต้นสำหรับส่วนขยาย txt คือข้อความ / ธรรมดา พฤติกรรมนี้อธิบายไว้ในไฟล์ mime.types ใช้http://nginx.org/en/docs/http/ngx_http_core_module.html#default_typeหรือhttp://nginx.org/en/docs/http/ngx_http_core_module.html#typesเพื่อลบล้างมัน (อาจตั้งค่าเป็น application / octet -กระแส).


20

การเปลี่ยนแปลงContent-Typeของ.txtไฟล์อาจทำงานได้ แต่มันเป็นวิธีที่ค่อนข้างมีความเสี่ยงที่จะแก้ปัญหานี้เพราะคุณไม่สามารถรับประกันได้ 100% ว่าเบราว์เซอร์ของผู้ใช้จะตอบสนองต่อวิธีการที่คุณคาดหวัง นอกจากนี้ยังทำให้เข้าใจผิดว่าติดป้ายกำกับ.txtไฟล์เป็นไฟล์ไบนารี

ฉันขอแนะนำให้ใช้วิธีมาตรฐานในการบังคับให้เบราว์เซอร์ดาวน์โหลดแทนที่จะแสดงไฟล์ซึ่งจะใช้Content-Dispositionส่วนหัวที่มีค่าเป็นattachment( RFC 2183โปรดดูRFC 2616 ด้วย )

ตัวอย่างเช่นlocationบล็อกnginx นี้จะส่งส่วนหัวดังกล่าวพร้อม.txtไฟล์ภายใต้/downloads/URI และจะถูกบังคับให้ดาวน์โหลด:

location ~ ^/downloads/.*\.txt$ {
  add_header Content-Disposition "attachment";
}

ดังนั้นคุณสามารถเพิ่มการจับคู่ที่เหมาะสมอื่น ๆ ฯลฯ ที่เหมาะสมกับการกำหนดค่าของคุณ


3
มันดูเหมือนจะเป็นทางออกที่ดีที่สุด
Vadim

แต่การContent-Dispositionแฮ็กในโครเมียมเบราว์เซอร์สามารถเริ่มพูดคำหยาบเข้าไปในคอนโซลและแม้แต่หยุดดาวน์โหลดไฟล์ใด ๆ จากหน้า มันบอกว่า thinhgs (มีรูปสามเหลี่ยมสีเหลือง) เช่น:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

application/octet-streamคุณจำเป็นต้องดึงสถานที่สำหรับไฟล์ที่สามารถดาวน์โหลดและตั้งค่าชนิดเนื้อหาของพวกเขาเป็น

เรามีสถานที่ต่อไปนี้ในบริการของเราสำหรับวัสดุที่สามารถดาวน์โหลดได้ (ซึ่งรวมถึงไฟล์ PDF, รูปภาพและเอกสารบางส่วน แต่ฉันแน่ใจว่ามันจะทำงานกับไฟล์ txt ได้เช่นกัน):

location /promomaterial/download/ {
         add_header Content-Type application/octet-stream;
}

เบราว์เซอร์ทุกตัวที่เราพยายามดาวน์โหลดไฟล์ทั้งหมดจากที่ตั้งนี้แทนที่จะพยายามแสดงมัน


4
การใช้ "add_header" ผิดอย่างยิ่งให้ใช้ "default_type" แทน: location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin ทำไม default_type ดีกว่า add_header
user193661

2
@ user193661 เนื่องจาก "add_header" เป็นส่วนหัวใหม่เพิ่ม "เนื้อหาประเภท" ดังนั้นในการตอบสนองคุณจะได้รับสองส่วนหัว "เนื้อหาประเภท" สิ่งที่สามารถนำไปสู่พฤติกรรมที่แปลกประหลาดของลูกค้า HTTP "default_type" ถูกตั้งค่า (เขียนทับ) ส่วนหัว "Content-Type" เดี่ยวในการตอบสนอง
Oleg Neumyvakin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.