【问题标题】:X-Sendfile ErrorX-Sendfile 错误
【发布时间】:2023-06-06 01:49:02
【问题描述】:

我正在尝试使用 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) 发送文件错误:无法获取 stat_cache 条目:/home/web/domain/htdocs/downloa1d.php

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

可能出了什么问题?我该怎么办?

【问题讨论】:

  • 您是否在没有 Content-Length 和 Content-Type 标头的情况下对其进行了测试?
  • 等一下,您确实意识到发送.php 文件应该实际上是流式传输文件的内容(而不是执行它),对吧?另外,请检查the docs。它是 X-LIGHTTPD-send_file,因为 X-Sendfile 仅受 1.5+ 支持(不稳定,除非您正在运行前沿)。还要意识到你给出的代码,和你给出的错误冲突(它们有不同的路径)......
  • 是的,我已经在没有 Content-Length 和 Content-Type 标头的情况下对其进行了测试,实际上我稍后添加了它们以尝试它们。是的,我知道,这就是为什么我说(我发送 download.php 文件只是为了测试目的),我将通过我们自己的 CDN 发送文件,该 CDN 通过网络连接到网络服务器,所以它只是为了测试目的并隔离问题。我首先虽然它可能是 chroot 或其他东西。这就是我尝试先下载该文件的原因。
  • 对不起,我忘了回复其他的事情。是的,我第一次使用 X-LIGHTTPD-send-file 但改变了它。所以,它也没有解决问题。我还将 lighttpd 更新到 1.4.28(在 1.4.27 中修复了一个 sendfile 错误),但它仍然无法正常工作。
  • 尝试发送非php文件。可能与static-file.exclude-extensions setting 有冲突

标签: php lighttpd


【解决方案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= 参数更可靠地工作,但需要在链接系统中进行更多规划。它可能需要您进行一些重定向。

【讨论】:

    【解决方案2】:

    好的,这是一篇旧帖子,但无论如何我都会回复,因为我也被困在这个问题上太久了,而且我在任何地方都没有找到我的解决方案,所以我开始了:

    是的,我编辑了 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
    

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

    【讨论】: