Frage

Die Situation

Ich erstelle eine Video-Training-Website für einen Client auf dem Rackspace Cloud mit dem traditionellen LAMP-Stack (Rackspace Cloud Windows und LAMP-Stacks hat). Die Videos und andere Mediendateien ich auf dieser Seite muß mich dazu diene, geschützt werden, wie mein Kunde Geld für den Zugang zu ihnen auflädt. Es gibt keine DRM oder lustiges Geschäft wie das, im Wesentlichen speichern wir die Dateien außerhalb des Web-Root und Verwendung von PHP zum Authentifizieren des Benutzers, bevor sie in der Lage sind, die Dateien zugreifen, indem mod_rewrite mit der Anfrage durch den PHP auszuführen.

Lassen Sie sich also sagen, dass der Benutzer eine Datei unter dieser URL:

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

ich mod_rewrite bin mit dieser URL zu umschreiben:

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

Hier ist eine vereinfachte Version des files.php Skript:

<?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();

?>

Das Problem

Lassen Sie mich zunächst sagen, das perfekt funktioniert für mich. Auf lokale Prüfmaschinen funktioniert es wie ein Zauber. Jedoch einmal in die Cloud bereitgestellt es nicht mehr funktioniert. Nach einigen Debuggen es stellt sich heraus, dass, wenn eine Anforderung an die Wolke bestimmte Dateiendungen wie JPG, PNG hat, oder .SWF (das heißt Erweiterungen von typischerweise statischen Mediendateien.) Die Anforderung an einen Cache-System namens Varnish geleitet wird. Das Endergebnis dieses Routing ist, dass durch die Zeit, dieser ganze Prozess, es zu meinem PHP-Skript macht die Sitzung nicht vorhanden ist.

Wenn ich die Erweiterung in der URL zu .PHP ändern oder wenn ich auch einen Abfrageparameter Varnish hinzufügen umgangen und der PHP-Skript kann die Sitzung erhalten. Kein Problem richtig? Ich werde nur einen bedeutungslosen Abfrageparameter auf meine Anfragen hinzuzufügen!

Hier ist der Haken: Die Mediendateien ich durch dieses System diene werden durch kompilierte SWF-Dateien aufgefordert, dass ich null Kontrolle über. Sie werden durch Software von Drittanbietern, und ich habe keine Hoffnung auf das Hinzufügen oder die URLs zu ändern, dass sie beantragen.

Gibt es andere Optionen, die ich dazu?

Update:. Ich sollte anmerken, dass ich dieses Verhalten mit Rackspace Unterstützung überprüft haben, und sie haben gesagt, es gibt nichts, was sie dagegen tun können

War es hilfreich?

Lösung

Wenn das anfragende Flash-App Umleitungen folgen, würde ich versuchen, mit einer Umleitung auf der ersten Anfrage zu beantworten und die zweite umschreiben, z.

GET .../29.jpg

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

Dann wird Ihr r.php liefert die Datei auf die zweite Anforderung.

Wenn nicht (btw. Immer), würde ich ausdrücklich Header sendet zusammen mit Bereitstellung der statischen Dateien dass Varnish akzeptiert und entsprechend handelt, so etwas wie

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

Und: Ich würde den exit(); Befehl nach dem ersten header() Anweisung platzieren, um sicherzustellen, dass der Rest des Skripts nicht ausgeführt wird. header() sendet nur Header.

Ich finde es auch zuverlässigen ob_start() als Leerzeichen in Ihrer PHP-Datei zu verwenden, kann zu lästigen Fehlern führen, wenn Header hinzugefügt wird.

Andere Tipps

Ich habe die gleiche Situation, und ich habe Rackspace für eine bessere Antwort der Hoffnung, in Kontakt gebracht.

Ich habe ein! Sie haben eine FAQ zusammengestellt umreißt ein halbes Dutzend Möglichkeiten, um Bypass / ändern das Caching:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top