我正在尝试使用apache module xsendfile在文件流中获得更好的性能。 问题是,如果我不使用PHP作为CGI版本,并且如果我不使用重写规则,那么正常工作。
在浏览器中调用此功能将起作用:
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不应该使用任何符号链接,是吗?或者我现在错过了什么?
如果我将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();
任何人都有线索?
第二个问题已解决: 我不知道为什么但是在apache配置中打开xsendfile而不是使用htaccess文件之后它正在工作。 (我将在下面添加一个答案作为soons,因为其他问题也已解决。)
除了第一个: 首先,我没有在httpd.conf中添加任何选项,因为它应该使用标准配置。无论如何,我现在要求我的提供者将绝对项目路径添加到XSendFilePath的白名单作为全局设置。 这暂时解决了1. mod_rewrite的问题。但这似乎不是我的情况的真正解决方案,因为我在服务器上运行了许多不同的项目,每个项目都有一个单独的下载路径。所以每次我开始一个新项目时,我都需要让我的提供者为配置添加一个新路径。 我仍然不能将x-sendfile与mod_rewrotite一起使用,虽然我应该可以访问文档根目录而不需要任何额外的设置。
答案 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]
告诉我是否解决了你的问题!