【发布时间】:2014-01-09 10:33:56
【问题描述】:
我正在尝试使用apache module xsendfile 在文件流式传输期间获得更好的性能。 问题是,如果我不使用 PHP 作为 CGI 版本并且如果我不使用重写规则为我的网址,它只是工作。
问题 1:mod_rewrite
在浏览器中调用这个就可以了:
http://subdomain.domain.de/image.php
这个会给我一个404:
http://subdomain.domain.de/rewrittenImageUrl
重写规则工作正常。 404 错误是由 xsendfile 模块触发的。 如果我在 htaccess (like suggested in this question) 中的规则中添加“R”,它将再次起作用,因为我被重定向到上面给出的第一个地址。但重定向不是我想要的。
我还关注了this post 关于符号链接的信息,但我认为只要我使用使用 getenv('document_root') 生成的绝对路径,这不能成为我帖子的解决方案?这个路径不应该使用任何符号链接,是吗?或者我现在错过了什么?
问题 2:CGI
如果我将 PHP 模式切换到 cgi 版本,我将得到一个 0 字节的文件。这似乎与服务器在不安装任何 xsendfile 的情况下做出反应的行为相同。
我已经将模块更新到最新版本。 还测试了绝对和相对链接,但没有任何成功。 除此之外,Deactivating the output compression 也没有用。
为了完成给定的信息,这里是我正在使用的 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 一起使用,尽管我应该无需任何额外设置即可访问文档根目录。
【问题讨论】:
-
您是否在 httpd.conf 中添加了 XSendFilePath 的绝对路径?如果是,您可以分享配置文件中的这些行吗?
-
感谢您对配置文件的提示。遗憾的是,我无法使用托管服务器直接访问这些文件。但我告诉我的提供商检查这些设置。通过添加绝对路径,它可以使用 mod_rewrite,但似乎仍然有问题。我已经用额外的信息更新了我上面的帖子。
标签: php apache mod-rewrite cgi x-sendfile