使用.htaccess强制文件下载

4

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

AddType SCHM wsc

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

但是当我访问文件位置时,它并没有强制下载。

你正在使用哪个浏览器?我的 Chromium 45 正在下载文件。 - Reeno
我正在使用Chrome浏览器,但是在其他网站上类似的文件可以正常工作,但是在我的FTP上只能在浏览器中显示二进制文件。 - lopata
也许你还应该将 Content-Type 设置为 application/octet-stream。我认为可以这样写:Header set Content-Type application/octet-stream - JojOatXGME
@JojOatXGME 我尝试了,但它没有起作用。 - lopata
好的,既然在我的电脑上能够运行,我不知道为什么它不能为你工作。我已经发现,如果文件已经在缓存中了,服务器会响应 "未修改"。也许你的浏览器只是缓存了该文件,并不知道你添加了这个头部条目。在这种情况下,只有文件的新修改日期才会导致你的浏览器重新加载。你可以在 Linux 的 shell 中使用 touch <filename> 来更改时间戳。 - JojOatXGME
@JojOatXGME 我清除了缓存,现在它可以工作了!非常感谢你。 - lopata
2个回答

6

既然问题已经在评论中得到了回答,这里只是按照Stackoverflow指定的方式提供答案。

与问题中一样,可以通过使用Apache 2的mod_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类型嗅探,从而忽略声明的内容类型。更多信息请参见这里

1
这是正确的,但(虽然没有强制要求),文件名附加在附件处理类型之后,并且有“一些”浏览器(IE)会嗅探二进制文件的前几个字节以猜测MIME类型,这里有一个更完整的解决方案 - user257319

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接