可以通过.htaccess和特定的GET请求(类似于Dropbox)强制下载吗?

4

我想知道是否可以通过 .htaccess 实现只有在特定 GET 变量存在时强制下载文件,就像 Dropbox 所做的那样。

示例:

http://www.domain.com/file.mp4

服务器只是提供文件,而:

http://www.domain.com/file.mp4?dl

强制浏览器下载文件。

提示:在我的情况下,使用 PHPreadfile() 不可行。谢谢。


你能否检查一下\?dl$,然后添加额外的头部? - alex
4个回答

11

FilesMatch模式只匹配文件名本身,而不匹配查询字符串。

不过,你可以利用mod_rewrite模块、%{QUERY_STRING}变量和T flag来实现:

RewriteCond %{QUERY_STRING} dl
RewriteRule .*\.mp4 - [T=application/octet-stream]

或者,如果你有 Apache> 2.3 (我想),你可以使用If指令,这样会更加清晰简洁:

<FilesMatch "filepattern.mp4">
   <If "%{QUERY_STRING} =~ /dl/">
      ForceType application/octet-stream
      Header set Content-Disposition attachment
   </If>
</FilesMatch>

第一种解决方案已更新。


你好!这个也能行吗?RewriteCond %{QUERY_STRING} dl RewriteRule .*.mp4 - [T=application/octet-stream] RewriteCond %{QUERY_STRING} dl RewriteRule .*.jpg - [T=application/octet-stream] - PJunior
@PJunior 当然可以,为什么不行呢?但是你也可以将正则表达式合并成一个规则,例如 .*\.(jpg)|(mp4)。此外,您可能需要更严格地测试查询字符串(目前它只检查查询字符串是否包含子字符串“dl”,这并不总是好的)。 - SáT

4

我的项目有一个非常类似的需求。这个问题给了我一个想法,可以使用查询参数来处理下载链接,就像DropBox处理下载链接那样。我将使用类似DropBox的较长的“dl=1”参数,以避免在正常URL中出现。使用Apache“if指令”是一个很好的想法,但不幸的是我使用的是Apache 2.2,所以无法使用该指令。我考虑使用application/octet-stream Content-Type,但后来看到这篇Stack Overflow文章并不喜欢这个想法。最后,我看到了一篇BlogSpot文章,建议在RewriteRule中设置环境变量,并在Header Command中引用同一变量。 .htaccess代码运作得相当好,解决了问题。感谢本帖所有人和BlogSpot的提供的优秀建议。我的代码示例如下:

# Required Modules are:
# 1) mod_rewrite.c
# 2) mod_headers.c
RewriteEngine On
RewriteCond %{QUERY_STRING} ^dl=1
RewriteRule .* - [E=DOWNLOAD_FILE:1]
Header set Content-Disposition "attachment" env=DOWNLOAD_FILE

3
作为替代方案,您可以在标签上添加一个参数,强制浏览器打开“下载”/“另存为”提示。似乎更容易。
<a href="file.mp3" download >Download File</a>

1
谢谢,我从未听说过download属性。这是一个不错的前端伴侣。 - null

-1

试试这个:

<FilesMatch "\?dl$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

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