我正在尝试强制下载一个文件夹的所有文件。
页面上的链接如下所示
<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标签不了解。
答案 0 :(得分:16)
请分别查看FilesMatch和Files的文档。它明确指出
本节中给出的指令将应用于任何对象 使用与指定匹配的basename(filename的最后一个组件) 文件名。
这意味着在您的示例中它与file.pdf
匹配。您的第二个示例*.*
与file.pdf
匹配,但您的第一个示例.*uploads/documents.*
却没有。它实际上永远不会匹配,因为它包含一个斜杠,用作目录分隔符。
您应该在<Files *.*>
指令中附上<Files *.pdf>
或Location
(取决于您要强制下载的内容):
<Location "/uploads/documents/">
<Files *.*>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
</Location>
不幸的是,.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>
清除浏览器并进行检查。