12

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

页面上的链接如下所示

<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 标签,我似乎有些不理解。

4

3 回答 3

27

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

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

为我工作。

于 2013-07-30T13:59:13.643 回答
23

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

本节中给出的指令将应用于具有与指定文件名匹配的基本名称(文件名的最后一个组成部分)的任何对象。

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

如果您可以编辑 apache 配置

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

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

如果您无法编辑 apache 配置

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

于 2013-01-17T22:17:57.943 回答
2

如果您不在 - 文件名中使用此代码是完美的!

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

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

清除浏览器并检查它。

于 2016-06-12T18:47:37.957 回答