使用htaccess </filesmatch>中的<filesmatch>强制下载

时间:2013-01-17 22:06:49

标签: .htaccess

我正在尝试强制下载一个文件夹的所有文件。

页面上的链接如下所示

<a href="http://example.com/uploads/documents/file.pdf">Click to download</a>

我的.htaccess

中有这个片段
<filesMatch ".*uploads/documents.*">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</filesMatch>

我已经知道标签内的2行是可行的,因为当我将.htaccess直接放在我想用下面的代码强制下载的文件夹中时它可以工作:

<Files *.*>
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</Files>

似乎有些东西我对filesMatch标签不了解。

3 个答案:

答案 0 :(得分:16)

请分别查看FilesMatchFiles的文档。它明确指出

  

本节中给出的指令将应用于任何对象   使用与指定匹配的basename(filename的最后一个组件)   文件名。

这意味着在您的示例中它与file.pdf匹配。您的第二个示例*.*file.pdf匹配,但您的第一个示例.*uploads/documents.*却没有。它实际上永远不会匹配,因为它包含一个斜杠,用作目录分隔符。

如果可以编辑apache config

您应该在<Files *.*>指令中附上<Files *.pdf>Location(取决于您要强制下载的内容):

<Location "/uploads/documents/">
    <Files *.*>
        ForceType application/octet-stream
        Header set Content-Disposition attachment
    </Files>
</Location>

如果您无法编辑apache config

不幸的是,.htaccess文件中不允许使用Location指令。只需在/uploads/documents/目录中创建一个.htaccess。

答案 1 :(得分:14)

搜索更多信息,发现此代码:

<FilesMatch "\.(mov|mp3|jpg|pdf|mp4|avi|wmv)$">
   ForceType application/octet-stream
   Header set Content-Disposition attachment
</FilesMatch>

为我工作。

答案 2 :(得分:2)

如果您不在文件名中使用-,此代码非常完美!

例如,对于name-1.mp3,更改为name1.mp3

<FilesMatch "\.(mp3|avi)$" >
    ForceType application/octet-stream
    Header add Content-Disposition "attachment"
</FilesMatch>

清除浏览器并进行检查。