【问题标题】:PHP download file from /var folder without relative pathsPHP 从 /var 文件夹下载文件,没有相对路径
【发布时间】:2016-07-06 22:39:34
【问题描述】:

我想从 Web 根目录上方的文件夹下载文件。假设我想得到这个文件:

/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,它正在工作。任何想法为什么会发生这种情况?

【问题讨论】:

  • pdfs文件夹有读取权限吗?
  • 恕我直言,有同样的问题,检查一下。 stackoverflow.com/a/17896538/6557808
  • @KrzysztofDuszczyk 是的,我编辑了我的问题。
  • 嗯,当我重现问题时,向 pdfs 文件夹添加执行权限会有所帮助。真的不知道为什么:)
  • 参见this answer 上的要点 3。基本上执行但在目录上是允许用户进入目录并列出/读取内容的。

标签: php


【解决方案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 包含路径,方法是在 php.ini 中设置 include_path,或者在脚本顶部使用以下行:

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

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

【讨论】:

  • 我尝试在我的 php 脚本之上添加ini_set("safe_mode_include_dir", "/var/pdfs/");。我没有工作,所以我尝试了您的第二个解决方案,但它也没有工作。
  • 我想你误会了。我不建议你使用ini_set 来更改safe_mode_include_dir。我建议您直接在php.ini 中进行更改。第二个建议是对第一个建议的补充(不是替代方案),因此无论哪种方式,您都需要先更改php.ini。
  • 好的。我打开了我的/etc/php5/apache2/php.ini,但没有safe_mode_include_dir 选项。甚至没有注释掉。我应该追加它吗?
  • 首先您需要知道它是 PHP 启动时实际加载的 php.ini(关于其他地方如何进行的大量讨论),因为该文件通常有多个副本。获得正确的文件后,如果不存在,请添加设置。然后,您必须重新启动 Apache 才能使更改生效。顺便问一下,你运行的是什么版本的 PHP?
  • 我正在运行PHP 5.6.20-0+deb8u1。我将它附加到 php.ini 但仍然没有。
猜你喜欢
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2016-04-23
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多