Pregunta

La situación

Estoy creando un sitio de formación de vídeo para un cliente en el Rackspace Cloud mediante la pila de la lámpara tradicional (la nube de Rackspace tiene tanto pilas de LAMP Windows y). Los vídeos y otros archivos multimedia que estoy sirviendo en este sitio deben ser protegidos como mi cliente cobra dinero para acceder a ellos. No hay ningún DRM o negocio divertido así, esencialmente, almacenamos los archivos fuera de la raíz web y usar PHP para autenticar usuarios de antes de que puedan acceder a los archivos mediante mod_rewrite para ejecutar la solicitud a través de PHP.

Así que digamos que el usuario solicita un archivo en la siguiente dirección:

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

Estoy utilizando mod_rewrite para reescribir la url para que:

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

Esta es una versión simplificada de la secuencia de comandos 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();

?>

El problema

Permítanme comenzar diciendo que esto funciona perfectamente para mí. En las máquinas de prueba local funciona como un encanto. Sin embargo, una vez desplegados en la nube deja de funcionar. Después de una cierta depuración resulta que si una solicitud a la nube tiene ciertas extensiones de archivo como JPG, PNG o SWF (es decir, las extensiones de archivos multimedia normalmente estáticos.) La solicitud se envía a un sistema de caché llamado barniz. El resultado final de esta ruta es que en el momento en todo este proceso hace que sea a mi script PHP la sesión no está presente.

Si cambio de la extensión en el URL para .php o si incluso agregar un parámetro de consulta barniz se omite y el script PHP puede conseguir a la sesión. Ningún derecho problema? Voy a añadir un parámetro de consulta de sentido para mis peticiones!

Aquí está el problema: Los archivos multimedia que estoy sirviendo a través de este sistema se solicitan a través de archivos SWF compilados que tengo cero control sobre. Ellos son generados por el software de terceros y no tengo ninguna esperanza de añadir o cambiar las direcciones URL que soliciten.

¿Hay otras opciones que tengo en esto?

Actualización:. Debo señalar que he verificado este comportamiento con el apoyo Rackspace y han dicho que no hay nada que puedan hacer al respecto

¿Fue útil?

Solución

Si la aplicación que solicita el flash está siguiendo redirecciones, me gustaría tratar de responder con una redirección en la primera solicitud y volver a escribir el segundo, por ejemplo.

GET .../29.jpg

a

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

A continuación, su r.php entrega el archivo en la segunda solicitud.

Si no es así (por cierto. Siempre), enviaría explícitamente cabeceras junto con la entrega de los archivos estáticos que Barniz acepta y actúa en consecuencia, algo así como

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");

Y: Me pongo el comando exit(); después de su primera declaración header() para asegurarse que el resto de la secuencia de comandos no se ejecuta. header() envía sólo los encabezados.

Me resulta también más fiable utilizar ob_start() como espacio en blanco en su archivo PHP puede conducir a errores molestos cuando se añade cabeceras.

Otros consejos

Tengo la misma situación, y me he puesto en contacto Rackspace esperando una respuesta mejor.

Tengo uno! Que han puesto juntos un FAQ esbozar media docena de formas de evitar / modificar el almacenamiento en caché:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top