在htaccess中使用<filesMatch>强制下载

15

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

页面上的链接看起来像这样

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


ftp根目录?你是说http吗?htaccess对ftp没有任何作用。你还拼错了“application”(注意第二个i)。 - Marc B
请不要使用application/octet-stream来强制下载。这是对HTTP中所有良好和真实内容的滥用。 - TRiG
有什么更好的方法可以强制下载文档而不是显示它? - nebulousGirl
3个回答

32

搜索更多信息找到了这段代码:

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

对我有用。


对于不确定在哪里添加此代码片段的任何人。我将此代码添加到名为.httaccess的文件中,该文件与要下载的文件位于同一目录中。 - Isuru

26
请查看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 文件。


谢谢您的解释。我已经查看了文档,但对我来说就像是中文一样。真的没有办法通过htaccess文件夹来定位一个文件夹吗? - nebulousGirl
我最终使用PHP设置正确的头文件来强制下载,因为我无法在文件夹中放置.htaccess文件,但我最终理解了htaccess中<Files>标签的工作原理。 - nebulousGirl
4
我收到了这个错误信息 - "<Files>不能出现在<Location>部分中",不认为这种方法还有效。 - Hippyjim
虽然你强制影响所有文件,但<Files>指令并不是必需的。ForceTypeHeader就足够了。但我更喜欢使用<Files>指令,因为从语义上来说更易读。 - codekandis

3

如果文件名中不包含 - ,那么此代码是完美的!

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

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

清空浏览器并检查它。

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