可以使用 .htaccess 和特定的 GET 请求(Dropbox 样式)强制下载吗?

Posted

技术标签:

【中文标题】可以使用 .htaccess 和特定的 GET 请求(Dropbox 样式)强制下载吗?【英文标题】:It's possible to force download with .htaccess and a specific GET request (Dropbox style)? 【发布时间】:2012-04-03 08:22:52 【问题描述】:

我想知道 .htaccess 是否可以像 Dropbox 那样仅在存在特定 GET 变量时强制文件下载。

例子:

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

服务器只提供文件,而:

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

强制浏览器下载文件。

PS:在我的情况下,将phpreadfile() 一起使用不是一个可行的选择。谢谢。

【问题讨论】:

你可以检查\?dl$然后添加额外的标题吗? 【参考方案1】:

FilesMatch 的模式与查询字符串不匹配,只有文件名正确。

但是,您可以使用 mod_rewrite 模块、%QUERY_STRING 变量和 T flag:

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

或者,如果你有 Apache > 2.3(我认为),你可以使用If directive,它更干净:

<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 是的,当然,为什么它不起作用?但是您也可以通过将正则表达式组合成.*\.(jpg)|(mp4) 之类的内容,在单个规则中执行此操作。此外,您可能希望更严格地测试查询字符串(就目前而言,它只是检查查询字符串是否包含子字符串“dl”,这并不总是好的)。【参考方案2】:

我对我的项目有非常相似的要求。这个问题实际上给了我使用类似于DropBox handles download links 的查询参数的想法。我将使用像 DropBox 这样更长的“dl=1”参数,因此它不太可能出现在正常的 URL 中。使用 Apache 的“if 指令”是一个好主意,但不幸的是我使用的是 Apache 2.2,所以它不可用。我考虑使用 application/octet-stream Content-Type 但后来我看到了另一个不喜欢这个想法的Stack Overflow thread。所以最后我看到了BlogSpot Article,它建议在 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>

【讨论】:

谢谢,从未听说过download 属性。这是一个不错的前端伴侣。【参考方案4】:

试试这个:

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

【讨论】:

以上是关于可以使用 .htaccess 和特定的 GET 请求(Dropbox 样式)强制下载吗?的主要内容,如果未能解决你的问题,请参考以下文章

RewriteRule在.htaccess中不起作用

使用特定域的 .htaccess 重定向到 HTTPS

htaccess通配符子域重定向与https非www

.htaccess 重定向所有页面,除了少数页面重定向到特定页面

.htaccess 使用 GET 参数重定向

使用 htaccess 删除 get 变量和 .php