شرائط سحابة Rackspace $ _Session إذا كان عنوان URL لديه امتدادات ملف معينة

StackOverflow https://stackoverflow.com/questions/2248702

سؤال

الوضع

أقوم بإنشاء موقع تدريب فيديو لعميل على سحابة Rackspace باستخدام مكدس المصباح التقليدي (سحابة Rackspace لديها كدسات Windows والمصابيح). يجب حماية مقاطع الفيديو وملفات الوسائط الأخرى التي أقضيها على هذا الموقع كممكون يدلي بأموال الوصول إليها. لا يوجد عمل دائري أو أعمال مضحكة من هذا القبيل، كما نخزن الملفات خارج جذر الويب واستخدام 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

فيما يلي نسخة مبسطة من 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();

?>

المشكلة

اسمحوا لي أن أبدأ بقول هذا يعمل تماما بالنسبة لي. على آلات الاختبار المحلية، فإنه يعمل مثل سحر. ولكن بمجرد نشرها في السحابة توقف عن العمل. بعد تصحيح الأخطاء، اتضح أنه إذا كان الطلب إلى السحابة يحتوي على ملحقات ملفات معينة مثل .jpg، .png، أو .swf (أي ملحقات من ملفات الوسائط الثابتة عادة.) يتم توجيه الطلب إلى نظام ذاكرة التخزين المؤقت يسمى الورنيش. النتيجة النهائية لهذا التوجيه هي أنه بحلول الوقت الذي يجعل هذه العملية برمتها تجعله إلى برنامج PHP الخاص بي، فإن الجلسة غير موجودة.

إذا قمت بتغيير الملحق في عنوان URL إلى .php أو إذا قمت بإضافة برنيش استعلام حتى يتم تجاوز الورنيش والبرنامج النصي PHP الحصول على الجلسة. لا مشكلة أليس كذلك؟ سأضيف فقط معلمة استعلام لا معنى لها إلى طلباتي!

هنا هو فرك: يتم طلب ملفات الوسائط التي أقدمها من خلال هذا النظام من خلال ملفات SWF المترجمة التي لدي تحكم صفر. يتم إنشاؤها بواسطة برنامج تابع لجهة خارجية وليس لدي أي أمل في إضافة أو تغيير عناوين URL التي طلبها.

هل هناك أي خيارات أخرى لدي في هذا؟

تحديث: يجب أن أذكر أنني قد تحققت من هذا السلوك مع دعم Rackspace وقللوا إنه لا يوجد شيء يمكنهم فعله حيال ذلك.

هل كانت مفيدة؟

المحلول

إذا كان تطبيق Flash الطالب يتبع إعادة التوجيه، فسأحاول الإجابة مع إعادة توجيه في الطلب الأول وإعادة كتابة الوحدة الثانية، على سبيل المثال

GET .../29.jpg

ل

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

ثم يوفر R.PhP الخاص بك الملف في الطلب الثاني.

إذا لم يكن الأمر كذلك (راجع للشغل. دائما)، فسأرسل رؤوسا بشكل صريح إلى جانب تقديم الملفات الثابتة التي يقبلها الورنيش والأفعال وفقا لذلك، شيء مثل

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() يرسل فقط رؤوس.

أجد أنه أيضا أكثر موثوقية للاستخدام ob_start() نظرا لأن Whitespace في ملف PHP قد يؤدي إلى أخطاء مزعجة عند إضافة رؤوس.

نصائح أخرى

لدي نفس الموقف، وقد اتصلت بالإكمال على أمل إجابة أفضل.

حصلت على واحدة! لقد قاموا بتجميع الأسئلة الشائعة التي تحدد نصف دزينة من طرق تجاوز / تعديل التخزين المؤقت:

http://cloudsites.rackspacecloud.com/index.php/how_can_i_bypass_the_cache٪3F.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top