使用 .htaccess 强制文件下载

Posted

技术标签:

【中文标题】使用 .htaccess 强制文件下载【英文标题】:Force file to download with .htaccess 【发布时间】:2016-01-16 05:29:12 【问题描述】:

所以我在 htaccess 中使用以下规则:

AddType SCHM wsc

<FilesMatch "\.(wsc)$">
  ForceType SCHM
  Header set Content-Disposition attachment
</FilesMatch>

但是当我转到file's location 时,它不会强制下载

【问题讨论】:

您使用的是哪个浏览器?我的 Chromium 45 下载文件 我使用的是 Chrome,但其他网站上的 similar file 对我有用,但我的 ftp 上的那个只是在浏览器中显示二进制文件 也许您还应该将Content-Type 设置为application/octet-stream。我想有人会这样想:Header set Content-Type application/octet-stream @JojOatXGME 我试过但没用 好的,因为它已经在我的电脑上工作了,我不知道为什么它不适合你。如果我的文件已经在缓存中,我已经看到服务器响应“未修改”。也许您的浏览器只是缓存文件并且不知道您已添加此标头条目。在这种情况下,只有文件的较新修改日期才会导致浏览器重新加载。您可以在 Linux 的 shell 中使用touch &lt;filename&gt; 来更改时间戳 【参考方案1】:

由于问题已经在 cmets 中得到解答,这只是为了以 *** 指定的方式提供答案。

就像问题一样,它可以通过使用 Apache 2mod_headers 来解决。由于Content-Disposition 不是HTTP 标准的一部分,您可以添加一些其他标头来实现您的目标。

<FilesMatch "\.(wsc)$">
    Header set Content-Type application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>

您应该考虑的另一件事是您的浏览器可能会缓存服务器的响应。浏览器仍将发送请求,但请求将包含一个节点,该节点表明浏览器已经拥有给定日期的文件。如果文件自给定日期以来未更改,则服务器不会将新标头发送到您的浏览器。这意味着如果您更改 .htaccess,在您禁用浏览器中的缓存或更改文件的时间戳之前,您可能看不到任何影响。


你也可以加

Header set X-Content-Type-Options "nosniff"

为了更好的兼容性(也许是安全性)。它防止浏览器进行 MIME 类型嗅探,这将忽略声明的内容类型。请参阅here 了解更多信息。

【讨论】:

这是正确的,但是(虽然不强制)文件名附加在附件处理类型之后,并且有“一些”浏览器(IE)嗅探二进制文件的前几个字节来猜测 mimetype ,这是一个完整的(呃)solution【参考方案2】:

RFC2616 表示 19.5.1 Content-Disposition

如果此标头用于内容类型为 application/octet-stream 的响应中,则暗示用户代理不应显示响应,而是直接输入“将响应另存为...”对话框。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1

【讨论】:

以上是关于使用 .htaccess 强制文件下载的主要内容,如果未能解决你的问题,请参考以下文章

使用 htaccess 强制下载图片

使用 .htaccess 强制 PDF 下载

使用.htaccess强制下载文件

apache_conf 使用.htaccess强制下载文件

可以使用 .htaccess 和特定的 GET 请求(Dropbox 样式)强制下载吗?

使用.htaccess强制下载