现状

我创建了使用传统的LAMP堆栈上的Rackspace公司的云客户端的视频培训网站(Rackspace的云具有Windows和LAMP堆栈)。我服务于这个网站的视频和其他媒体文件需要为我的客户访问他们收取的钱得到保护。没有DRM或不道德的那样,基本上我们的文件保存在网站根目录之外,并使用PHP来验证用户,他们可以通过使用mod_rewrite运行通过PHP请求来访问文件之前。

所以我们可以说,用户在这个URL请求文件:

http://www.example.com/uploads/preview_image/29.jpg

我使用mod_rewrite重写该网址为:

http://www.example.com/files.php?path=%2Fuploads%2Fpreview_image%2F29.jpg

下面是files.php脚本的简化版本:

<?php
// Setups the environment and sets $logged_in
// This part requires $_SESSION
require_once('../../includes/user_config.php');

if (!$logged_in) {
    // Redirect non-authenticated users
    header('Location: login.php');
}

// This user is authenticated, continue

$content_type = "image/jpeg";

// getAbsolutePathForRequestedResource() takes 
// a Query Parameter called path and uses DB
// lookups and some string manipulation to get
// an absolute path. This part doesn't have
// any bearing on the problem at hand
$file_path = getAbsolutePathForRequestedResource($_GET['path']);

// At this point $file_path looks something like
// this: "/path/to/a/place/outside/the/webroot"

if (file_exists($file_path) && !is_dir($file_path)) {
    header("Content-Type: $content_type");
    header('Content-Length: ' . filesize($file_path));
    echo file_get_contents($file_path);
} else {
    header('HTTP/1.0 404 Not Found'); 
    header('Status: 404 Not Found');
    echo '404 Not Found';
}
exit();

?>

问题

让我说这完全适用于我开始。在本地测试机器它就像一个魅力。然而,一旦部署到服务器停止工作,云计算。一些调试后,事实证明,如果到云的请求如.jpg,.png或.SWF某些文件扩展名(即通常静态媒体文件的扩展名。)将请求路由到所谓的清漆缓存系统。该路由的最终结果是,在整个过程中,使得它我的PHP脚本时的会话不存在。

如果我改变扩展在URL中.PHP或者如果我甚至添加查询参数光油被旁路,PHP脚本可以获取会话。没问题吧?我只添加一个毫无意义的查询参数我的要求!

这里是擦:正在通过编译SWF文件,我有零控制要求,我通过这个系统服务的媒体文件。他们是由第三方软件生成的,我也没有增加或改变其请求的URL的希望。

有没有我对此有任何其他选项?

更新:我要指出,我核实了Rackspace公司支持这种行为,他们都表示没有什么,他们可以做些什么

有帮助吗?

解决方案

如果发出请求的Flash应用程序被以下的重定向,我想尝试与第一请求重定向到回答和重写第二个,e.g。

GET .../29.jpg

header("Status: 302 Moved temporarily");
header("Location: .../r.php?i=29.jpg&random=872938729348");

然后,你的r.php提供在第二请求中的文件。

如果不是(顺便说一句,总是),我会明确地提供该光油接受并采取相应的行动,像

静态文件一起发送头
header("Cache-Control: no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

和: 你的第一个exit();发言后,我会放在header()命令,确保不执行脚本的其余部分。 header()发送只是头。

我觉得它也使用更可靠ob_start()为空白在你的PHP文件中添加头时,可能会导致恼人的错误。

其他提示

我也有同样的情况,我已经联系Rackspace公司希望有一个更好的答案。

我得到了一个!他们已经把一个常见问题,概述了半打的方式绕过/修改缓存:

http://cloudsites.rackspacecloud.com/index.php/How_can_I_bypass_the_cache%3F

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top