Làm cách nào tôi có thể chắc chắn rằng Nginx phục vụ các tệp văn bản gốc dưới dạng tải xuống, thay vì nội tuyến?


18

Tôi có ứng dụng Rails (Redmine) hoạt động với Nginx. Nếu tôi đang nhấp vào bất kỳ tệp đính kèm nào thì trình duyệt của tôi (firefox, tức là chrome) yêu cầu tôi tải xuống tệp. Nhưng nếu tôi nhấp vào tệp đính kèm kiểu txt thì trình duyệt của tôi sẽ mở tệp này trong trình duyệt.

Theo tôi hiểu, nhiệm vụ của Nginx là quyết định - mở tệp trong trình duyệt hoặc tải xuống. Làm thế nào tôi có thể thiết lập nó?

Câu trả lời:



20

Thay đổi Content-Typecủa .txttập tin có thể làm việc, nhưng đó là một cách hơi mạo hiểm để giải quyết vấn đề này, bởi vì bạn không thể đảm bảo 100% rằng trình duyệt của người dùng sẽ phản ứng như thế nào bạn mong đợi. Và hơn nữa, việc đánh dấu một .txttệp là tệp nhị phân là sai lệch .

Thay vào đó, tôi khuyên bạn nên sử dụng cách tiêu chuẩn để buộc trình duyệt tải xuống thay vì hiển thị tệp, đó là sử dụng Content-Dispositiontiêu đề có giá trị attachment( RFC 2183 , xem thêm RFC 2616 ).

Ví dụ: locationkhối nginx này sẽ gửi xuống một tiêu đề như vậy với .txtcác tệp trong /downloads/URI và do đó chúng sẽ bị buộc phải tải xuống:

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

Vì vậy, bạn có thể thêm kết hợp phù hợp khác, vv, phù hợp với cấu hình của bạn.


3
Nó dường như là giải pháp tốt nhất.
Vadim

Nhưng Content-Dispositionhack trong trình duyệt chromium có thể bắt đầu nói những từ xấu vào bảng điều khiển và thậm chí dừng tải xuống bất kỳ tệp nào từ trang. Nó nói thinhss (có hình tam giác màu vàng) như:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

Bạn cần trích xuất vị trí cho tệp có thể tải xuống và đặt loại nội dung của chúng là application/octet-stream.

Chúng tôi đã theo dõi vị trí trên dịch vụ của chúng tôi cho các tài liệu quảng cáo có thể tải xuống (bao gồm pdf, hình ảnh và một số tài liệu, nhưng tôi chắc chắn rằng nó cũng sẽ hoạt động với các tệp txt):

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

Mọi trình duyệt chúng tôi đã thử tải xuống tất cả các tệp từ vị trí này thay vì cố gắng hiển thị chúng.


4
Sử dụng "add_header" hoàn toàn sai, sử dụng "default_type" thay vào đó: location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin Tại sao default_type tốt hơn add_header?
dùng193661

2
@ user193661 Vì "add_header" nên nó bổ sung thêm tiêu đề mới "Loại nội dung", do đó, để đáp lại, bạn có thể nhận được hai tiêu đề "Loại nội dung" có thể dẫn đến hành vi lạ của các máy khách HTTP. "default_type" được đặt (ghi đè) tiêu đề "Kiểu nội dung" duy nhất trong phản hồi.
Oleg Neumyvakin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.