Ситуация
Я создаю сайт обучающего видео для клиента в RackSpace Cloud с использованием традиционного стека LAMP (в облаке RackSpace есть как Windows, так и стеки LAMP). Видео и другие медиафайлы, которые я размещаю на этом сайте, должны быть защищены, так как мой клиент взимает плату за доступ к ним. У нас нет DRM или такого забавного бизнеса, по сути, мы храним файлы за пределами корневого веб-каталога и используем PHP для аутентификации пользователя, прежде чем он сможет получить доступ к файлам с помощью mod_rewrite для запуска запроса через PHP.
Допустим, пользователь запрашивает файл по этому адресу:
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-скрипт, сеанса еще нет.
Если я изменю расширение в URL на .PHP или даже добавлю параметр запроса, Varnish будет обойден, и сценарий PHP сможет получить сеанс. Нет проблем, верно? Я просто добавлю бессмысленный параметр запроса в мои запросы!
Вот загвоздка: Медиа-файлы, которые я обслуживаю через эту систему, запрашиваются через скомпилированные SWF-файлы, которые я не контролирую. Они создаются сторонним программным обеспечением, и я не надеюсь добавлять или изменять URL-адреса, которые они запрашивают.
Есть ли у меня другие варианты?
Обновление: Я должен отметить, что я проверил это поведение с поддержкой RackSpace, и они сказали, что ничего не могут с этим поделать.