Domanda

La situazione

Sto creando un sito di video training per un cliente sul Cloud Rackspace utilizzando lo stack LAMP tradizionale (cloud di Rackspace ha sia di Windows e pile LAMP). I video e altri file multimediali sto che servono in questo sito devono essere protetti come il mio cliente carica soldi per l'accesso ad essi. Non v'è alcun DRM o per affari divertenti come quella, in sostanza, abbiamo memorizzare i file al di fuori della web root e utilizzare PHP per autenticare l'utente prima che siano in grado di accedere ai file utilizzando mod_rewrite per eseguire la richiesta tramite PHP.

Quindi diciamo che l'utente richiede un file al seguente URL:

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

Sto usando mod_rewrite per riscrivere quella url:

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

Ecco una versione semplificata dello script 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();

?>

Il problema

Vorrei iniziare dicendo questo funziona perfettamente per me. Su macchine di test locale funziona come un fascino. Tuttavia, una volta schierato nel cloud smette di funzionare. Dopo un po 'di debug si scopre che se una richiesta per la nube ha determinate estensioni di file come .jpg, .png, o .SWF (cioè le estensioni di file multimediali in genere statici.) La richiesta è indirizzato ad un sistema di cache chiamato Varnish. Il risultato finale di questo percorso è che per il momento tutto questo processo rende al mio script PHP la sessione non è presente.

Se cambio l'estensione nell'URL per .php o se ho anche aggiungere un parametro di query Varnish viene bypassato e lo script PHP può ottenere la sessione. Nessun problema giusto? Mi limiterò a aggiungere un parametro di query senza senso alle mie richieste!

Ecco il problema: I file multimediali sto servendo attraverso questo sistema vengono richiesti attraverso i file SWF compilati che ho il controllo a zero sopra. Essi sono generati da software di terze parti e non ho alcuna speranza di aggiungere o modificare gli URL che essi richiedono.

Ci sono altre opzioni che ho su questo?

Aggiornamento:. Vorrei sottolineare che ho verificato questo comportamento con il supporto di Rackspace e hanno detto che non c'è niente che possa fare al riguardo

È stato utile?

Soluzione

Se il flash applicazione che richiede sta seguendo redirect, vorrei provare a rispondere con un redirect alla prima richiesta e riscrivere la seconda, per esempio.

GET .../29.jpg

a

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

Allora il tuo r.php trasporta il file sulla seconda richiesta.

In caso contrario (btw. Sempre), vorrei inviare esplicitamente intestazioni con consegna dei file statici che Varnish accetta e agisce di conseguenza, qualcosa come

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

E: Porrei il comando exit(); dopo la vostra prima dichiarazione header() per essere sicuri che il resto dello script non viene eseguito. header() manda solo le intestazioni.

Lo trovo anche più affidabile da utilizzare come spazi ob_start() nel file PHP può portare a errori fastidiosi quando si aggiungono le intestazioni.

Altri suggerimenti

Ho la stessa situazione, e ho contattato Rackspace sperando in una risposta migliore.

Ho ottenuto uno! Hanno messo insieme una FAQ che delinea una mezza dozzina di modi per aggirare / modificare il caching:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top