我正在尝试使用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
所以,它正在运行,但是当我发送正确的文件时,它不会在日志中出现任何错误,浏览器会下载一个空文件。
可能有什么不对?我该怎么办?
答案 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
在我添加选项之后,它起作用了:)