PHP强制下载,htaccess拒绝所有,无法读取文件头

Posted

技术标签:

【中文标题】PHP强制下载,htaccess拒绝所有,无法读取文件头【英文标题】:PHP force download, htaccess deny all, cant read file header 【发布时间】:2013-08-23 11:47:20 【问题描述】:

我想从 .htaccess 保护正常访问的文件夹中下载文件。 我找到了很多教程,但没有一个适合我。

.htaccess

<files "passportScan.jpg">
  deny from all
</files>

php

$file_name = 'passportScan.jpg';
$file_url = self::SERVER_URL . 'uploads/prom_conf/'.$user['uid'].'/' . $file_name;    
header("Content-Description: File Transfer"); 
header('Content-Type: image/jpeg');
header("Content-disposition: attachment; filename=\"".$file_name."\"");
readfile($file_url);

当我访问 url /uploads/passportScan.jpg 时,它是被禁止的。那是正确的。但是当我调用我的 php 方法时,它会强制下载文件但随后出现错误“无法读取文件头!未知文件格式或找不到文件!”

编辑 如果我删除 htaccess,它就可以正常工作。

编辑 2 通过电子邮件调用链接。

【问题讨论】:

向我们展示更多代码(例如,使用的变量的声明)。 变量没问题。因为如果我删除 htaccess 它会完美运行。但随后该文件不受保护。 self::SERVER_URL?您使用的是完整的 http 网址吗? 那么就无法访问受限文件了。 是的,我更改为相对 url 并且它有效。谢谢! 【参考方案1】:

如果文件和你的 php 脚本在同一台服务器上,只需使用内部路径

【讨论】:

@tttpapi 小心,你在考虑 URL,而这个答案是关于文件路径的。不同的是readfile不会尝试加载一个HTTP url,而是直接读取磁盘上的文件,这当然可以,因为它与apache无关【参考方案2】:

您可以创建文件,而不是使用完整的 http url,例如。 download.php 然后使用 download.php?file=ID 下载该图像。

【讨论】:

以上是关于PHP强制下载,htaccess拒绝所有,无法读取文件头的主要内容,如果未能解决你的问题,请参考以下文章

服务器无法读取 htaccess 文件,拒绝访问是安全的

使用 .htaccess 拒绝访问目录中的所有 PHP 文件

服务器无法读取htaccess文件

.htaccess 拒绝目录访问

使用 www 强制 HTTPS 并在 CodeIgniter 中删除 index.php .htaccess

权限被拒绝:/var/www/abc/.htaccess pcfg_openfile:无法检查 htaccess 文件,确保它是可读的?