سؤال

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

اللغات المستخدمة: ASP.NET، VB.NET، وبالطبع HTML، CSS، و JQUERY.

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

المحلول

إذا كان هذا هو حول .css و .js التغييرات، طريقة واحدة إلى "تخزين التخزين المؤقت" هو إبداء شيء مثل "_versionNo"لاسم الملف لكل إصدار. فمثلا:

script_1.0.css // This is the URL for release 1.0
script_1.1.css // This is the URL for release 1.1
script_1.2.css // etc.

أو بدلا من ذلك القيام بذلك بعد اسم الملف:

script.css?v=1.0 // This is the URL for release 1.0
script.css?v=1.1 // This is the URL for release 1.1
script.css?v=1.2 // etc.

يمكنك التحقق من هذا حلقة الوصل لمعرفة كيف يمكن أن تعمل.

نصائح أخرى

انظر الى مخبأ السيطرة و ال تنتهي صلاحيته علامة متغيرة.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

تتمثل الممارسات الشائعة الأخرى في إلحاق السلاسل المتغيرة باستمرار حتى نهاية الملفات المطلوبة. على سبيل المثال:

<script type="text/javascript" src="main.js?v=12392823"></script>

تحديث 2012.

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

في تطبيقات الويب غير المتصلة (وهو حقا أي موقع HTML5) applicationCache.swapCache() يمكن استخدامها لتحديث الإصدار المخزن مؤقتا من موقع الويب الخاص بك دون الحاجة إلى إعادة تحميل الصفحة يدويا.

هذا مثال رمز من دليل المبتدئين لاستخدام ذاكرة التخزين المؤقت للتطبيق على HTML5 Rocks موضح كيفية تحديث المستخدمين على أحدث إصدار من موقعك:

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);

أنظر أيضا باستخدام ذاكرة التخزين المؤقت للتطبيق على شبكة مطور Mozilla لمزيد من المعلومات.

تحديث 2016.

تغير الأشياء بسرعة على الويب. تم طرح هذا السؤال في عام 2009 وفي عام 2012 نشرت تحديثا حول طريقة جديدة للتعامل مع المشكلة الموضحة في السؤال. مرت 4 سنوات أخرى والآن يبدو أنه مهم جدا. بفضل cgaldiolo. لأشيرها في التعليقات.

حاليا، اعتبارا من يوليو 2016، HTML Standard، القسم 7.9، تطبيقات الويب غير المتصلة يتضمن تحذير الاستهلاك:

هذه الميزة في عملية إزالتها من منصة الويب. (هذه عملية طويلة تستغرق سنوات عديدة.) باستخدام أي من ميزات تطبيق الويب غير المتصلة في هذا الوقت محبط للغاية. استخدام عمال الخدمة بدلا من ذلك.

وكذلك باستخدام ذاكرة التخزين المؤقت للتطبيق على شبكة مطور Mozilla التي تمت الرجوع إليها في عام 2012:

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

أنظر أيضا BUG 1204581 - إضافة إشعار إهمال ل Appcache إذا تم تمكين Interner Worker Interception.

ليس على هذا النحو. طريقة واحدة هي إرسال الرؤوس المناسبة عند تقديم المحتوى لإجبار المتصفح على إعادة تحميل:

التأكد من عدم التخزين المؤقت صفحة الويب، عبر جميع المتصفحات.

إذا كان لديك بحثك عن "cache header" أو شيء مماثل هنا على ذلك، ستجد أمثلة محددة ASP.NET.

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

myimage.gif?random=1923849839

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

/Content/css/Site.css?version={FileVersionNumber}

هنا مثال ASP.NET MVC.

<link href="@Url.Content("~/Content/Css/Reset.css")?version=@this.GetType().Assembly.GetName().Version" rel="stylesheet" type="text/css" />

لا تنس تحديث إصدار التجميع.

كان لدي مشكلة مماثلة وهذا هو كيف حلها:

  1. في index.html ملف قمت بإضافة بيان:

    <html manifest="cache.manifest">
    
  2. في <head> تضمنت القسم البرنامج النصي في تحديث ذاكرة التخزين المؤقت:

    <script type="text/javascript" src="update_cache.js"></script>
    
  3. في <body> القسم الذي أدخلته وظيفة تحميل:

    <body onload="checkForUpdate()">
    
  4. في cache.manifest لقد وضعت جميع الملفات التي أرغب في التخزين المؤقت. من المهم الآن أنه يعمل في حالتي (Apache) فقط عن طريق التحديث في كل مرة تعليق "الإصدار". إنه أيضا خيار لتسمية الملفات مع "؟ ver = 001" أو شيء ما في نهاية الاسم ولكنه لا حاجة. وبعد تغيير فقط # version 1.01 مشغلات حدث تحديث ذاكرة التخزين المؤقت.

    CACHE MANIFEST
    # version 1.01
    style.css
    imgs/logo.png
    #all other files
    

    من المهم أن تضم 1.، 2. و 3. النقاط فقط في index.html. غير ذلك

    GET http://foo.bar/resource.ext net::ERR_FAILED
    

    يحدث لأن كل ملف "طفل" يحاول ذاكرة التخزين المؤقت للصفحة أثناء التخزين المؤقت للصفحة بالفعل.

  5. في update_cache.js ملف قمت بوضع هذا الرمز:

    function checkForUpdate()
    {
        if (window.applicationCache != undefined && window.applicationCache != null)
        {
            window.applicationCache.addEventListener('updateready', updateApplication);
        }
    }
    function updateApplication(event)
    {
        if (window.applicationCache.status != 4) return;
        window.applicationCache.removeEventListener('updateready', updateApplication);
        window.applicationCache.swapCache();
        window.location.reload();
    }
    

الآن أنت فقط تغيير الملفات والظهر لديك لتحديث تعليق الإصدار. الآن سيتم تحديث صفحة Visiting index.html ذاكرة التخزين المؤقت.

أجزاء الحل ليست لي لكنني وجدت لهم عبر الإنترنت ووضعوا معا حتى يعمل.

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

<img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ...

تحرير كما هو موضح من قبل الآخرين، فيما يلي حلا أكثر كفاءة بكثير لأنه سيقوم بإعادة تحميل الصور فقط عندما يتم تغييره، حدد هذا التغيير عن طريق حجم الملف:

<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"

هناك الكثير من الإجابات مفقودة النقطة - معظم المطورين يدركون جيدا أن إيقاف تشغيل ذاكرة التخزين المؤقت غير فعالة. ومع ذلك، هناك العديد من الظروف الشائعة حيث تكون الكفاءة غير مهمة وسلوك ذاكرة التخزين المؤقت الافتراضية مكسورة بشكل سيء.

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

<meta http-equiv="pragma" content="no-cache" />

انظر أيضا https://stackoverflow.com/questions/126772/how-to-force-a-web-browser-not-to-cache-images.

لست متأكدا مما إذا كان ذلك قد يساعدك حقا، فهذه الطريقة التي يجب أن تعمل فيها التخزين المؤقت على أي متصفح. عندما يطلب المستعرض ملف، يجب أن يرسل دائما طلبا إلى الخادم إلا إذا كان هناك وضع "غير متصل". سيقوم الخادم بقراءة بعض المعلمات مثل تعديل التاريخ أو Enags.

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

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

هذه هي الطريقة التي ينبغي القيام به. استخدام معالم عشوائية أو رقم الإصدار في عناوين URL هو أشبه الاختراق أكثر من أي شيء.

http://www.checkupdown.com/status/e304.html.http://en.wikipedia.org/wiki/http_etag.http://www.xpertdeveloper.com/2012/03/last-modified-header-vs-expire-header-vs-etag/

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

إذن هذا هو تخميني، لديك نوع من تاريخ انتهاء الصلاحية، ويجب عليك استخدام ETAGs المعدلة الأخيرة أو مزيج منها جميعا وتأكد من عدم وجود تاريخ انتهاء الصلاحية.

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

بلدي 2 سنتا!

تحديث عنوان URL إلى ما يلي يعمل بالنسبة لي:

/custom.js?id=1

عن طريق إضافة رقم فريد بعد ?id= وزيادة ذلك للتغييرات الجديدة، لا يتعين على المستخدمين الضغط CTRL + F5 لتحديث ذاكرة التخزين المؤقت. بدلا من ذلك، يمكنك إلحاق التجزئة أو إصدار سلسلة من الوقت الحالي أو Epoch بعد ?id=

شيء مثل ?id=1520606295

هنا هي صفحة MDSN على إعداد التخزين المؤقت في ASP.NET.

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))
Response.Cache.SetCacheability(HttpCacheability.Public)
Response.Cache.SetValidUntilExpires(False)
Response.Cache.VaryByParams("Category") = True

If Response.Cache.VaryByParams("Category") Then
   '...
End If

لقد قمت بتطبيق هذا الحل البسيط الذي يعمل بالنسبة لي (ليس بعد في بيئة الإنتاج):

function verificarNovaVersio() {
    var sVersio = localStorage['gcf_versio'+ location.pathname] || 'v00.0.0000';
    $.ajax({
        url: "./versio.txt"
        , dataType: 'text'
        , cache: false
        , contentType: false
        , processData: false
        , type: 'post'
     }).done(function(sVersioFitxer) {
        console.log('Versió App: '+ sVersioFitxer +', Versió Caché: '+ sVersio);
        if (sVersio < (sVersioFitxer || 'v00.0.0000')) {
            localStorage['gcf_versio'+ location.pathname] = sVersioFitxer;
            location.reload(true);
        }
    });
}

لدي ملف صغير يقع حيث يكون HTML:

"Versio.txt":

v00.5.0014

يتم استدعاء هذه الوظيفة في جميع صفحاتي، لذلك عند تحميلها يتحقق إذا كانت قيمة الإصدار Localstorage أقل من الإصدار الحالي ودقة

location.reload(true);

... لإجبار إعادة التحميل من الخادم بدلا من ذاكرة التخزين المؤقت.

(من الواضح، بدلا من Localstorage، يمكنك استخدام ملفات تعريف الارتباط أو تخزين العميل المستمر)

اخترت هذا الحل لساطايتها، لأن mantaining فقط ملف واحد "Versio.txt" سيجبر الموقع الكامل لإعادة تحميله.

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

أنا مبتدئ قليلا وأستطيع أدرك الاحترافية الخاصة بك والمراجعة لضمان أن طريقتي نهج جيد.

آمل أن يساعد.

بالإضافة إلى تحديد Cache-Control: لا تخزين ذاكرة التخزين المؤقت، يجب عليك أيضا تعيين رأس انتهاء الصلاحية إلى -1 إذا كنت ترغب في تحديث النسخة المحلية في كل مرة (يبدو أن بعض إصدارات IE التي يبدو أنها تتطلب هذا).

يرى ذاكرة التخزين المؤقت HTTP - تحقق من الخادم، وإرسال دائما إذا تم تعديلها منذ ذلك الحين

هناك خدعة واحدة يمكن استخدامها. الحيلة هي إلحاق المعلمة / سلسلة إلى اسم الملف في علامة البرنامج النصي وتغييره عند إجراء تغييرات.

<script src="myfile.js?version=1.0.0"></script>

يفسر المتصفح السلسلة بأكملها كممسار الملف على الرغم من ما يأتي بعد "؟" هي المعلمات. لذلك يحدث وات الآن هو أنه في المرة القادمة عند تحديث ملفك فقط تغيير الرقم في علامة البرنامج النصي على موقع الويب الخاص بك (مثال <script src="myfile.js?version=1.0.1"></script>) وسيرتشف كل مستخدمي المستعرض قد تغير الملف واستضاف نسخة جديدة.

فرض المتصفحات لإزالة ذاكرة التخزين المؤقت أو تحديث البيانات الصحيحة؟ لقد جربت معظم الحلول الموصوفة في Stackoverflow، بعض العمل، ولكن بعد فترة قصيرة، فإن ذاكرة التخزين المؤقت في النهاية وعرض البرنامج النصي أو الملف المحمل السابق. هل هناك طريقة أخرى من شأنها أن تقوم بمسح ذاكرة التخزين المؤقت (CSS، JS، إلخ) ويعمل بالفعل على جميع المتصفحات؟

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

<?php
   touch('/www/sample/file1.css');
   touch('/www/sample/file2.js');
?>

ثم ... بقية البرنامج ...

استغرق الأمر بعض الوقت لحل هذه المشكلة (حيث أن العديد من المتصفحات يتصرف بشكل مختلف لأوامر مختلفة، ولكن كلها تحقق من وقت الملفات والمقارنة مع نسختك التي تم تنزيلها في المتصفح الخاص بك، إذا كان التاريخ والوقت المختلفة، فسوف يقومون بالتحديث)، إذا كنت لا يمكن أن تذهب بالطريقة الصحيحة المفترضة، هناك دائما حل قابل للاستخدام وأفضل له. مع أطيب التحيات والتخييم السعيد. بالطريقة التي تعمل باللمس ()؛ أو البدائل العمل في العديد من لغات البرمجة بما في ذلك في JavaScript Bash SH PHP ويمكنك تضمينها أو الاتصال بها في HTML.

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

إذا كان الأخير، يجب أن يكون بسيطة مثل

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top