mod_xsendfile不适用于CGI和mod_rewrite

时间:2013-12-20 14:24:45

标签: php apache mod-rewrite cgi x-sendfile

我正在尝试使用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')生成的绝对路径,这对我的帖子来说不是解决方案吗?这个pathes不应该使用任何符号链接,是吗?或者我现在错过了什么?

问题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文件之后它正在工作。 (我将在下面添加一个答案作为soons,因为其他问题也已解决。)

除了第一个: 首先,我没有在httpd.conf中添加任何选项,因为它应该使用标准配置。无论如何,我现在要求我的提供者将绝对项目路径添加到XSendFilePath的白名单作为全局设置。 这暂时解决了1. mod_rewrite的问题。但这似乎不是我的情况的真正解决方案,因为我在服务器上运行了许多不同的项目,每个项目都有一个单独的下载路径。所以每次我开始一个新项目时,我都需要让我的提供者为配置添加一个新路径。 我仍然不能将x-sendfile与mod_rewrotite一起使用,虽然我应该可以访问文档根目录而不需要任何额外的设置。

2 个答案:

答案 0 :(得分:2)

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

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

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

因此,始终是白名单URI。

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

由于这个原因,我实际上考虑完全放弃相对路径/自动白名单的东西,因为它可以说是非常令人困惑,并且也没有记录。 我想完全放弃它有点晚了,但我至少应该将其标记为已弃用。

答案 1 :(得分: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]

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