PHP下载文件来自/ var文件夹,没有相对路径

时间:2016-07-06 22:39:34

标签: php

我想从网络根目录下的文件夹下载文件。让我们说我想得到这个文件:

/var/pdfs/test.pdf

我的代码是:

$name = "test.pdf";
$url = "/var/pdfs/" . $name;
if (file_exists($url)) {
    header("Content-Type: application/pdf");
    header("Content-Transfer-Encoding: Binary");
    header("Content-disposition: attachment; filename='" . basename($url) . "'");
    readfile($url);
} else {
    echo "Not found: $url";
}

问题是我总是得到Not found: $url回声。

我的文件具有读取权限:

thecrafter@vps136166:/var/pdfs$ ls -la
total 6484
drwxr--r--  2 thecrafter root          4096 Jul  7 00:19 .
drwxr-xr-x 13 root       root          4096 Jul  7 00:16 ..
-rw-r--r--  1 thecrafter thecrafter 6629018 Jul  7 00:18 test.pdf

和目录:

thecrafter@vps136166:/var$ ls -la | grep pdfs
drwxr--r--  2 thecrafter root  4096 Jul  7 00:19 pdfs

我错过了什么吗?问题在哪里?

编辑1

Krzysztof Duszczyk指出,如果我赋予pdfs目录执行权限,问题就解决了。确实,我给了它755并且它正在工作。任何想法为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

问题(不是在这种情况下,但我将其留给其他人帮助)

如果您知道该文件确实存在于磁盘上,则file_exists()可能会被旨在保护/var/pdfs/内的文件免受未经授权访问的安全措施阻止。这来自file_exists上的文档:

  

警告:对于因无法访问的文件,此函数返回FALSE   安全模式限制。但是,如果仍然可以包含这些文件   它们位于safe_mode_include_dir。

解决方案(在这种情况下也不是,但可以帮助类似的症状)

您想将目录添加到safe_mode_include_dir设置。在php.ini中找到该设置,取消注释,然后添加目录:

safe_mode_include_dir = /var/pdfs/

如果这仍然不起作用,您可能还需要将目录添加到PHP包含路径,方法是在include_path中设置php.ini,或在脚本的顶部设置,以下一行:

$path = '/var/pdfs'
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

请注意,PHP删除了版本为safe mode的{​​{1}}设置,因此如果您最近安装了PHP,则问题可能出在其他地方。