我有与 Nginx 配合使用的 Rails 应用程序 (Redmine)。如果我单击任何附件,我的浏览器 (firefox,即 chrome) 会要求我下载文件。但如果我单击 txt 类型的附件,我的浏览器会在浏览器中打开此文件。
据我了解,Nginx 的任务是决定在浏览器中打开文件还是下载文件。我该如何设置?
答案1
txt 扩展名的默认类型是 text/plain。此行为在 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-stream)。
答案2
更改文件的名称Content-Type
可能.txt
有效,但这是解决这个问题的一个有点冒险的方法,因为您无法 100% 保证用户的浏览器会按照您的预期做出响应。此外,将文件标记.txt
为二进制文件也会产生误导。
相反,我建议使用标准方式强制浏览器下载而不是显示文件,即使用Content-Disposition
值为attachment
(RFC 2183, 也可以看看RFC 2616)。
例如,此 nginxlocation
块将发送带有URI.txt
下文件的此类标头/downloads/
,因此它们将被强制下载:
location ~ ^/downloads/.*\.txt$ {
add_header Content-Disposition "attachment";
}
因此,您可以添加其他适合您的配置的适当匹配等。
答案3
您需要提取可下载文件的位置并将其内容类型设置为application/octet-stream
。
我们的服务中提供以下位置供下载宣传材料(其中包括 pdf、图像和一些文档,但我相信它也适用于 txt 文件):
location /promomaterial/download/ {
add_header Content-Type application/octet-stream;
}
我们尝试过的每个浏览器都会从该位置下载所有文件,而不是尝试显示它们。