هل هو اسم الملف أم عنوان URL بالكامل المستخدم كمفتاح في ذاكرة التخزين المؤقت للمتصفح؟

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

سؤال

من الشائع أن ترغب المتصفحات في تخزين الموارد مؤقتًا - JavaScript وCSS والصور وما إلى ذلك.حتى يتوفر إصدار جديد، ثم تأكد من أن المتصفح يقوم بإحضار الإصدار الجديد وتخزينه مؤقتًا بدلاً من ذلك.

أحد الحلول هو تضمين رقم إصدار في اسم ملف المورد، ولكن هل سيؤدي وضع الموارد المراد إدارتها بهذه الطريقة في دليل يحتوي على رقم مراجعة إلى نفس الشيء؟هل يتم استخدام عنوان URL الكامل للملف كمفتاح في ذاكرة التخزين المؤقت للمتصفح، أم أنه مجرد اسم الملف نفسه وبعض البيانات الوصفية؟

إذا تغير الكود الخاص بي من الجلب /r20/example.js ل /r21/example.js, هل يمكنني التأكد من أن المراجعة 20 من example.js تم تخزينه مؤقتًا، ولكن الآن تم جلب المراجعة 21 بدلاً من ذلك وتم تخزينها مؤقتًا الآن؟

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

المحلول

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

تحديث:

المطالبة في هذه المقالة ThinkVitamin أن متصفحات Opera وSafari/Webkit لا تقوم بتخزين عناوين URL مؤقتًا باستخدام ?query=strings خطأ شنيع.

تعد إضافة معلمة رقم الإصدار إلى عنوان URL طريقة مقبولة تمامًا لاختراق ذاكرة التخزين المؤقت.

ما قد يربك مؤلف مقالة ThinkVitamin هو حقيقة أن الضغط على Enter في شريط العنوان/الموقع في Safari وOpera يؤدي إلى سلوك مختلف لعناوين URL التي تحتوي على سلسلة استعلام فيها.

لكن، (وهذا هو الجزء المهم!) الأوبرا وسفاري تتصرف تماما مثل IE وفايرفوكس عندما يتعلق الأمر بالتخزين المؤقت للصور المدمجة/المرتبطة بالأوراق والبرامج النصية في صفحات الويب - بغض النظر عما إذا كانت لديهم "؟" الشخصيات في عناوين URL الخاصة بهم.(يمكن التحقق من ذلك من خلال اختبار بسيط على خادم Apache عادي.)

(كنت سأعلق على الإجابة المقبولة حاليًا إذا كانت لدي السمعة للقيام بذلك.:-)

نصائح أخرى

مفتاح ذاكرة التخزين المؤقت للمتصفح هو مزيج من طريقة الطلب وURI للمورد.يتكون URI من المخطط والسلطة والمسار والاستعلام والجزء.

مقتطف ذو صلة من مواصفات HTTP 1.1:

يتكون مفتاح ذاكرة التخزين المؤقت الأساسي من طريقة الطلب وURI الهدف.ومع ذلك ، نظرًا لأن مخابرات التخزين المؤقت لـ HTTP المشتركة اليوم تقتصر عادة على استجابات التخزين المؤقت للحصول عليها ، فإن العديد من ذاكرة التخزين المؤقت ببساطة ترفض طرقًا أخرى واستخدام URI فقط كمفتاح ذاكرة التخزين المؤقت الأساسية.

مقتطف ذو صلة من مواصفات URI:

يتكون بناء جملة URI العام من تسلسل هرمي للمكونات المشار إليها باسم المخطط والسلطة والمسار والاستعلام والشظية.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty

أنا متأكد بنسبة 99.99999% من أن عنوان url بأكمله هو الذي يتم استخدامه للتخزين المؤقت للموارد في المتصفح، لذلك يجب أن يعمل نظام عنوان url الخاص بك بشكل جيد.

الحد الأدنى الذي تحتاجه لتحديد كائن HTTP هو المسار الكامل، بما في ذلك أي معلمات سلسلة استعلام.قد لا تقوم بعض المتصفحات بتخزين الكائنات باستخدام سلسلة استعلام، ولكن هذا لا علاقة له بمفتاح ذاكرة التخزين المؤقت.

ومن المهم أيضًا أن تتذكر أن المسار لم يعد كافيًا.تختلف:يقوم الرأس الموجود في استجابة HTTP بتنبيه المتصفح (أو الخادم الوكيل، وما إلى ذلك) بأي شيء آخر غير عنوان URL الذي يجب استخدامه لتحديد مفتاح ذاكرة التخزين المؤقت، مثل ملفات تعريف الارتباط وقيم التشفير وما إلى ذلك.

بالنسبة لسؤالك الأساسي، نعم، يعد تغيير عنوان URL لملف .js كافيًا.بالنسبة للسؤال الأكبر حول ما الذي يحدد مفتاح ذاكرة التخزين المؤقت، فهو عنوان URL بالإضافة إلى Vary:قيود الرأس.

نعم.المسار المختلف هو نفسه من منظور ذاكرات التخزين المؤقت.

بالطبع يجب عليه استخدام المسار بأكمله "/r20/example.js" مقابل "/r21/example.js" يمكن أن يكون صورًا مختلفة تمامًا للبدء بها.ما تقترحه هو طريقة فعالة للتعامل مع التحكم في الإصدار.

في معظم المتصفحات يتم استخدام عنوان URL الكامل.في بعض المتصفحات، إذا كان لديك استعلام في عنوان URL، فلن يتم تخزين المستند مؤقتًا أبدًا.

عنوان URL بالكامل.لقد رأيت سلوكًا غريبًا في عدد قليل من المتصفحات القديمة حيث ظهرت حساسية حالة الأحرف.

بالإضافة إلى الإجابات الموجودة، أريد فقط أن أضيف أنه قد لا ينطبق إذا كنت تستخدم ServiceWorkers أو على سبيل المثال البرنامج المساعد دون اتصال.ومن ثم يمكنك تجربة قواعد مختلفة لذاكرة التخزين المؤقت اعتمادًا على كيفية إعداد ServiceWorkers.

يعتمد على.من المفترض أن يكون عنوان URL الكامل، لكن بعض المتصفحات (Opera وSafari2) تطبيق إستراتيجية ذاكرة تخزين مؤقت مختلفة لعناوين url ذات معلمات مختلفة.

أفضل رهان هو تغيير اسم الملف.

يوجد حل ذكي جدًا هنا (يستخدم PHP وApache)

http://verens.com/archives/2008/04/09/javascript-cache-problem-solved/

ملاحظات الإستراتيجية:"وفقًا لمواصفات التخزين المؤقت لـ HTTP، يجب على وكلاء المستخدم عدم تخزين عناوين URL التي تحتوي على سلاسل الاستعلام مطلقًا.وبينما يتجاهل Internet Explorer وFirefox هذا الأمر، فإن Opera وSafari لا يتجاهلان ذلك - للتأكد من أن جميع وكلاء المستخدم يمكنهم تخزين مواردك مؤقتًا، نحتاج إلى إبقاء سلاسل الاستعلام خارج عناوين URL الخاصة بهم.

http://www.thinkvitamin.com/features/webapps/serving-javascript-fast

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