我正在尝试使用apache 模块 xsendfile在文件流式传输期间获得更好的性能。问题是,如果我不使用 PHP 作为 CGI 版本并且如果我不为我的 url使用重写规则,它就可以工作。
问题一:mod_rewrite
在浏览器中调用这个将起作用:
http://subdomain.domain.de/image.php
这个会给我一个404:
http://subdomain.domain.de/rewrittenImageUrl
重写规则工作正常。404 错误是由 xsendfile 模块触发的。如果我在 htaccess 中的规则中添加“R”(就像在这个问题中建议的那样),它将再次起作用,因为我被重定向到上面给出的第一个地址。但重定向不是我想要的。
我也看了这篇关于符号链接的帖子,但我认为这不能成为我帖子的解决方案,只要我使用使用 getenv('document_root') 生成的绝对路径?这个路径不应该使用任何符号链接,是吗?或者我现在错过了什么?
问题 2:CGI
如果我将 PHP 模式切换到 cgi 版本,我将得到一个 0 字节的文件。这似乎与服务器在不安装任何 xsendfile 的情况下做出反应的行为相同。
我已经将模块更新到最新版本。还测试了绝对和相对链接,但没有任何成功。除此之外,停用输出压缩不起作用。
为了完成给定的信息,这里是我正在使用的 PHP 代码:
ini_set('zlib.output_compression', 'Off');
$realImagePath = getenv('document_root')."fixedRelativeImagePathNoParamsNeeded.jpg";
$imageInfos = @getimagesize($realImagePath);
header('Content-Type: '.$imageInfos['mime']);
header("X-Sendfile: $realImagePath");
exit();
有人有线索吗?
更新 (2014-01-06)
第二个问题解决了:我不知道为什么,但是在 apache 配置中打开 xsendfile 而不是使用 htaccess 文件后它正在工作。(一旦其他问题解决,我也会在下面添加答案。)
除了第一个:首先我没有在 httpd.conf 中添加任何选项,因为它应该使用标准配置。无论如何,我现在要求我的提供商将绝对项目路径添加到 XSendFilePath 的白名单中作为全局设置。这暂时解决了 1. mod_rewrite 的问题。但这似乎不是我的情况的真正解决方案,因为我在服务器上运行许多不同的项目,每个项目都有一个单独的下载路径。因此,每次我开始一个新项目时,我都需要让我的提供商为配置添加一个新路径。我仍然无法将 x-sendfile 与 mod_rewrotite 一起使用,尽管我应该无需任何额外设置即可访问文档根目录。