gpt4 book ai didi

php - 如果 URL 具有某些文件扩展名,RackSpace Cloud 会删除 $_SESSION

转载 作者:可可西里 更新时间:2023-10-31 23:35:26 25 4
gpt4 key购买 nike

现状

我正在使用传统的 LAMP 堆栈(RackSpace 的云同时具有 Windows 和 LAMP 堆栈)在 RackSpace 云上为客户创建一个视频培训站点。我在这个网站上提供的视频和其他媒体文件需要受到保护,因为我的客户需要付费才能访问它们。没有 DRM 或类似的有趣业务,基本上我们将文件存储在 Web 根目录之外,并使用 PHP 在用户能够访问文件之前对用户进行身份验证,方法是使用 mod_rewrite 通过 PHP 运行请求。

假设用户在这个 URL 请求一个文件:

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

我正在使用 mod_rewrite 将该 url 重写为:

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(即通常静态媒体文件的扩展名),请求将被路由到名为 Varnish 的缓存系统。此路由的最终结果是,当整个过程到达我的 PHP 脚本时, session 不存在。

如果我将 URL 中的扩展名更改为 .PHP 或者我什至添加了一个查询参数,Varnish 将被绕过并且 PHP 脚本可以获得 session 。没问题吧?我只会在我的请求中添加一个无意义的查询参数!

问题在于:我通过该系统提供的媒体文件是通过编译后的 SWF 文件请求的,我对这些文件的控制权为零。它们是由第三方软件生成的,我没有希望添加或更改它们请求的 URL。

我还有其他选择吗?

更新:我应该指出,我已经通过 RackSpace 支持验证了此行为,他们表示对此无能为力。

最佳答案

如果请求的 Flash 应用遵循重定向,我会尝试在第一个请求上使用重定向来回答并重写第二个请求,例如

GET .../29.jpg

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

然后您的 r.php 在第二次请求时传送文件。

如果不是(顺便说一句。总是),我会明确地发送 header 以及交付 Varnish 接受并采取相应行动的静态文件,例如

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() 只发送 header 。

我发现使用 ob_start() 也更可靠,因为 PHP 文件中的空格可能会在添加 header 时导致恼人的错误。

关于php - 如果 URL 具有某些文件扩展名,RackSpace Cloud 会删除 $_SESSION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com