我在Dreamhost上使用mod_xsendfile下载大型zip文件(超过50mb)
我启用了mod_xsendfile,并在.htaccess中启用了“ XSendFile on”。
当我给
header('X-Sendfile: "'.$fullPath.'"');
Run Code Online (Sandbox Code Playgroud)
命令,使用服务器上确实存在的文件的完整路径,我得到一个网页未找到错误。
readfile()可以很好地找到该文件并将其提供服务,但是.zip文件太大,php无法处理。
您能提供的任何帮助将不胜感激!
实际上,有一个apache / xsendfile配置值。
在主机配置中,您只需添加:
XSendFilePath /tmp
Run Code Online (Sandbox Code Playgroud)
哪里/tmp是无论你想xsendfile能够访问。这是一个白名单,我相信您可以添加多个。
例如:
<Directory /var/www/mysite/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
XSendFile On
XSendFilePath /tmp
</Directory>
Run Code Online (Sandbox Code Playgroud)
小智 2
我遇到了同样的问题并且能够解决它,所以这个解决方案可能适合你。
首先要做的是检查 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
Run Code Online (Sandbox Code Playgroud)
问题是,我想要提供的文件位于 httpd.conf 中定义的 DocumentRoot(对我来说,/var/www/html)上方。
我的解决方案是在 DocumentRoot 目录中创建一个符号链接,指向包含我要提供的文件的目录。我使用了以下命令:
ln -s /path/to/file_dir /path/to/doc_root/file_dir
Run Code Online (Sandbox Code Playgroud)
然后我所要做的就是让 PHP 将 xSendFile 指向符号链接:
header("X-SendFile: /path/to/doc_root/file_dir/file_name.ext");
Run Code Online (Sandbox Code Playgroud)