【问题标题】:mod_xsendfile won't work with CGI and mod_rewritemod_xsendfile 不适用于 CGI 和 mod_rewrite
【发布时间】: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


【解决方案1】:

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

因此,我将始终在 X-SENDFILE 标头中使用绝对 URI。

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

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

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

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

【讨论】:

  • 有时有一项任务是仅在用户有权访问文件时才提供文件。如果我们只提供白名单文件,这怎么可能?将它们列入白名单将使它们可供任何用户使用,对吧?
【解决方案2】:

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

例如在地方使用:

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

用途:

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

如果解决了你们的问题,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 2012-08-18
    • 1970-01-01
    • 2012-09-30
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多