我如何确保 Nginx 以下载形式提供纯文本文件,而不是内联文件?

我如何确保 Nginx 以下载形式提供纯文本文件,而不是内联文件?

我有与 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;
}

我们尝试过的每个浏览器都会从该位置下载所有文件,而不是尝试显示它们。

相关内容