mod_xsendfile不能用于CGI和mod_rewrite

我正在尝试使用apache模块xsendfile在文件stream中获得更好的性能。 问题是,它只是在工作,如果我不使用PHP作为CGI版本,如果我不使用我的url重写规则

问题1:mod_rewrite

在浏览器中调用这个函数将会工作:

http://subdomain.domain.de/image.php 

这一个会给我一个404:

 http://subdomain.domain.de/rewrittenImageUrl 

重写规则是正确的。 404错误是由xsendfile模块触发的。 如果我在htaccess的规则中添加一个“R”( 就像这个问题中提到的那样 ),它会再次工作,因为我被redirect到上面给出的第一个地址。 但redirect不是我想要的。

我也注意到了这个关于符号链接的post ,但是我认为这不可能是我的文章的解决scheme,只要我使用使用getenv('document_root')生成的绝对path? 这个程序不应该使用任何符号链接,是吗? 还是我错过了什么?

问题2:CGI

如果我将PHP模式切换到cgi版本,我将得到一个0字节的文件。 这似乎是相同的行为,如服务器会反应没有任何安装的xsendfile。


我已经将模块更新到最新版本。 也testing了绝对和相对的链接没有任何成功。 除此之外, 取消激活输出压缩不起作用。

要完成给定的信息,这里是我正在使用的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)

第二个问题解决了 :我不知道为什么,但是在apacheconfiguration文件中打开xsendfile而不是使用htaccess文件。 (我会在下面添加一个答案,因为另一个问题也解决了。)

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

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

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

上述的第二个结果是,构建的路径,不一定是你所期望的,自动白名单目录,你不指望,当然,没有白名单目录,你会预期。

因此,总是白名单的URI。

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

实际上,考虑到这个原因,我完全考虑放弃相对路径/自动白名单的工作,因为这可能是非常令人困惑的,而且也没有文档记录。 我认为完全放弃是有点迟了,但我至少应该将其标记为不赞成。

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

例如在适当的地方使用:

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

使用:

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

告诉我,如果解决你的问题家伙!