Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 找不到Xsendfile文件_Php_File - Fatal编程技术网

Php 找不到Xsendfile文件

Php 找不到Xsendfile文件,php,file,Php,File,我在Dreamhost上使用modxsendfile下载大的zip文件(50mb+) 我启用了modxsendfile,并在.htaccess中启用了“xsendfile on” 当我给 header('X-Sendfile: "'.$fullPath.'"'); 命令,使用服务器上不存在的文件的完整路径,我得到一个未找到网页错误 readfile()可以很好地找到文件并提供它,但是.zip文件太大,php无法处理 如果您能提供任何帮助,我们将不胜感激 我也遇到了同样的问题,并且能够解决它,所

我在Dreamhost上使用modxsendfile下载大的zip文件(50mb+)

我启用了modxsendfile,并在.htaccess中启用了“xsendfile on”

当我给

header('X-Sendfile: "'.$fullPath.'"');
命令,使用服务器上不存在的文件的完整路径,我得到一个未找到网页错误

readfile()可以很好地找到文件并提供它,但是.zip文件太大,php无法处理


如果您能提供任何帮助,我们将不胜感激

我也遇到了同样的问题,并且能够解决它,所以这个解决方案可能对您有效

首先要做的是检查Apache错误日志(对于我来说,位于/etc/httpd/logs中)。这是我在我的作品中发现的:

[Wed Sep 05 14:29:02 2012] [error] [client ?.?.?.?] (20023)The given path was above the root path: xsendfile: unable to find file: /path/to/file
问题是,我想要提供的文件位于httpd.conf中定义的DocumentRoot(对我来说,/var/www/html)之上

我的解决方案是在DocumentRoot目录中创建一个符号链接,指向包含我要提供服务的文件的目录。我使用了以下命令:

ln -s /path/to/file_dir /path/to/doc_root/file_dir
然后我所要做的就是将PHP point xSendFile指向符号链接:

header("X-SendFile: /path/to/doc_root/file_dir/file_name.ext");

我终于找到了最简单的解决方案:

header('X-Sendfile: '.realpath(dirname(__FILE__)).'/'.$the_rest_of_path);   

这样对我来说非常有效

实际上有一个apache/xsendfile配置值

在主机配置中,您只需添加:

XSendFilePath /tmp
其中
/tmp
是您希望xsendfile能够访问的任何位置。这是一个白名单,我相信你可以添加多个

例如:

<Directory /var/www/mysite/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
    XSendFile On
    XSendFilePath /tmp
</Directory>

选项索引跟随符号链接多视图
不允许超限
命令允许,拒绝
通融
上的XSendFile
XSendFilePath/tmp

您能添加一些详细信息吗?我相信它们暗示$fullPath的引号不正确。、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,回答问题时请提供更多详细信息。我可以看到您指出的事实是,他在文件路径周围添加了引号,但是mod_xsendfile实际上并不关心这个问题。mod_xsendfile肯定会关心明确的文件路径。因此,我认为使用引号更好,因为不知道$fullPath是否包含空格。这是正确的答案。modxsendfile会进行一些安全检查,以确保应该允许从给定目录提供文件,有时这不会自动工作。仅供参考,XSendFilePath也可以采用多个路径,因此您可以将多个目录列入白名单。这有点像黑客。相反,您应该将XSendFilePath指令设置为Apache confs中工作目录的绝对路径。例如,
XSendFilePath/Path/To/Your/Working/Directory/
-这将列出该目录,并允许xsendfile从中提供文件。注意:这是因为X-Sendfile头需要绝对路径。给定OPs$fullPath变量,我们可以安全地假设他已经在使用绝对路径。
header('X-Sendfile: '.$fullPath);