X-Sendfile错误

时间:2010-08-30 12:51:28

标签: php lighttpd

我正在尝试使用lighttpd中的X-Sendfile指令发送文件。

我的PHP代码是;

header("Content-Type: application/force-download");
header( "Content-Disposition: attachment; filename=" . 's.php');
header("Content-Length: ". filesize("/home/web/domain/htdocs/download.php"));
header( "X-Sendfile: /home/web/domain/htdocs/download.php");

(我发送download.php文件仅用于测试目的)

然而,无论我尝试什么,我都会得到空白文件。如果我更改文件名,我会得到;

  

2010-08-30 18:01:14:(mod_fastcgi.c.2587)send-file error:无法获取stat_cache条目:/home/web/domain/htdocs/downloa1d.php

所以,它正在运行,但是当我发送正确的文件时,它不会在日志中出现任何错误,浏览器会下载一个空文件。

可能有什么不对?我该怎么办?

2 个答案:

答案 0 :(得分:1)

您的lighttpd.conf文件中可能没有正确的行。 在你的fastcgi.server中添加这个选项与=>箭头:

"allow-x-send-file" => "enable",

除了最后一个选项之外的所有选项都以逗号结尾。 我假设您已经配置了fastcgi。如果您使用不同的框架将PHP连接到服务器,我无法帮助您。 如果您有多个PHP工作进程,则必须将该选项添加到所有这些进程。

我应该补充说.php文件的大小很小,用readfile()输出它们不会有问题。 而且,正如我所看到的,您错误地使用了一些非关键标头。没有强制下载这样的东西,它只会表现得像一个未知的文件类型。使用application/octet-stream。而你的内容处置也不稳定。不仅在那个奇怪的字符串封闭。客户应该得到的是: Content-Disposition: attachment; filename="My file ♥.txt" 文件名用双引号括起来,不会被转义;相反,它是UTF-8或调用页面的编码(这是一个脏的灰色区域,每个浏览器的行为都不同)。如果您对下载路径感到满意,则甚至不必将文件名包含在安全端。然后,它看起来像这样: Content-Disposition: attachment 然后,您可以使用伪目录技巧来提供较少错误的文件名: www.example.com/download.php/Custom%20Name.txt 这将比filename =参数更可靠地工作,但在链接系统中需要更多的计划。它可能需要您进行重定向。

答案 1 :(得分:1)

好吧这是一个老帖子,但我还是要回复了,因为我也被困在这个问题太长时间了,而且我在任何地方找不到我的解决方案所以我去了:

是的,我编辑了lighttpd.conf并添加了

fastcgi.server += ( ".php" => (( "allow-x-send-file" => "enable" )) )

并使用

Header("X-LIGHTTPD-send-file: /path/filename");

在php测试页面中。但它没有用。我花了一段时间才发现我在

中也有一个php定义
etc/lighttpd/conf-enabled/15-fastcgi-php.conf

在我添加选项之后,它起作用了:)