1

我正在尝试使用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 一起使用,尽管我应该无需任何额外设置即可访问文档根目录。

4

2 回答 2

2

mod_xsendfile确实根据请求 URI从相对路径构造绝对路径,在某些情况下这实际上可能是子请求。这并不总是产生您期望的结果。

因此,我总是在X-SENDFILE标头中使用绝对 URI。

上面的第二个结果是,构建的路径不一定是您期望的,自动将您不期望的目录列入白名单,同时当然不会将您期望的目录列入白名单。

因此,始终将 URI 列入白名单。

简而言之,Apache 可能不会认为与您(或后端 *CGI)相同的目录是请求的当前工作目录。重写只会增加混乱。

出于这个原因,我实际上考虑完全删除相对路径/自动白名单的东西,因为它可能会非常令人困惑,而且文档也不足。我想完全放弃它有点晚了,但我至少应该将它标记为已弃用。

于 2014-01-07T13:32:05.413 回答
0

在您的主网站的 HT 访问文件中尝试使用[L,R=301]代替[QSA,L][L]

例如在地方使用:

RewriteRule ^download/(.*)/$ download.php?x=$1 [QSA,L]

利用:

RewriteRule ^download/(.*)/$ download.php?x=$1 [L,R=301]

告诉我是否解决了你们的问题!

于 2014-11-07T21:25:00.913 回答