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

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

سؤال

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

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

  • Internet Explorer 6+
  • فايرفوكس 1.5+
  • سفاري 3+
  • أوبرا 9+
  • كروم

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

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

المحلول

مقدمة

الصحيحة الحد الأدنى مجموعة من الرؤوس التي تعمل عبر جميع العملاء (وكلاء):

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

على Cache-Control هو في HTTP 1.1 المواصفات للعملاء والوكلاء (وضمنا المطلوبة من قبل بعض العملاء بجانب Expires).على Pragma هو في HTTP 1.0 المواصفات ما قبل التاريخ العملاء.على Expires هو في HTTP 1.0 و 1.1 المواصفات للعملاء والوكلاء.في HTTP 1.1 ، Cache-Control الأسبقية Expires, حتى إنه بعد كل HTTP 1.0 الوكلاء فقط.

إذا كنت لا تهتم حول IE6 و كسر التخزين المؤقت عند التقديم على صفحات HTTPS فقط no-store, ثم يمكنك حذف Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

إذا كنت لا تهتم حول IE6 ولا HTTP 1.0 العملاء (HTTP 1.1 قدم 1997), ثم هل يمكن حذف Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

إذا كنت لا تهتم حول HTTP 1.0 وكلاء إما, ثم هل يمكن حذف Expires.

Cache-Control: no-store, must-revalidate

من ناحية أخرى, إذا كان الملقم التلقائي يشمل صالحة Date رأس ، ثم يمكن نظريا حذف Cache-Control أيضا و تعتمد على Expires فقط.

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

ولكن قد تفشل إذا مثلاعلى enduser بالتلاعب في نظام التشغيل موعد برنامج العميل هو الاعتماد على ذلك.

أخرى Cache-Control المعلمات مثل max-age صلة لو المذكورة أعلاه Cache-Control هي المعلمات.على Last-Modified رأس كما وردت في معظم إجابات أخرى هنا فقط إذا كنت مثيرة للاهتمام في الواقع أريد إلى ذاكرة التخزين المؤقت على طلب, لذلك أنت لا تحتاج إلى تحديد ذلك على الإطلاق.

كيفية تعيين ذلك ؟

باستخدام PHP:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

باستخدام بريمج جافا أو Node.js:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

باستخدام ASP.صافي-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

باستخدام ASP.NET API ويب:

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

باستخدام ASP.NET:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

باستخدام ASP:

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

باستخدام روبي على القضبان ، أو الثعبان/قارورة:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

باستخدام بيثون/جانغو:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

باستخدام بيثون/الهرم:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

باستخدام الذهاب:

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

باستخدام أباتشي .htaccess ملف:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

باستخدام HTML4:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

HTML meta tags مقابل رؤوس استجابة HTTP

المهم أن نعرف أنه عندما صفحة HTML هو أكثر من اتصال HTTP و رأس موجود في سواء على رؤوس استجابة HTTP HTML <meta http-equiv> فئة ، ثم واحدة المحدد في رأس استجابة HTTP الحصول على الأسبقية على HTML meta.HTML meta سوف تستخدم فقط عند عرض الصفحة من القرص المحلي نظام الملفات عن طريق file:// URL.انظر أيضا W3 HTML المواصفات الفصل 5.2.2.رعاية مع هذا عندما لا يحدد لهم برمجيا ، لأن خادم الويب يمكن وهي تشمل بعض القيم الافتراضية.

عموما من الأفضل فقط لا تحديد HTML meta tags لتجنب الارتباك قبل للمبتدئين, و من الصعب الاعتماد على رؤوس استجابة HTTP.وعلاوة على ذلك, على وجه التحديد تلك <meta http-equiv> العلامات صالح في HTML5.فقط http-equiv القيم المدرجة في مواصفات HTML5 مسموح بها.

التحقق الفعلي رؤوس استجابة HTTP

للتحقق من واحدة أخرى ، يمكنك أن ترى/debug في حركة مرور HTTP مراقبة من webbrowser هو مجموعة أدوات المطور.يمكنك الوصول إلى هناك عن طريق الضغط على F12 في كروم/Firefox23+/IE9+ ، ثم فتح "شبكة" أو "صافي" علامة التبويب لوحة ، ثم النقر على طلب HTTP من الفائدة للكشف عن كل التفاصيل حول طلب HTTP والاستجابة.على الصورة أدناه هو من كروم:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

أريد أن تعيين تلك الرؤوس على تنزيل الملف أيضا

أولا هذا السؤال والجواب هو المستهدفة على "صفحات ويب" (صفحات HTML) ليس "تنزيل الملف" (PDF, zip, Excel, الخ).كنت أفضل أن يكون لهم مؤقتا من بعض ملفات النسخة معرف في مكان ما في URI المسار أو querystring إلى قوة تنزيل على تغيير الملف.عند تطبيق تلك no-cache headers على تنزيل الملف على أي حال ، ثم حذار من IE7/8 علة عند التقديم تحميل ملف عبر HTTPS بدلا من HTTP.لمزيد من التفاصيل, انظر أي لا يمكن تحميل فو.jsf.أي لم يكن قادرا على فتح هذا الموقع على الانترنت.إما أن الموقع المطلوب غير متوفر أو لا يمكن العثور عليه.

نصائح أخرى

(مرحبا الجميع:من فضلك لا مجرد غفلة نسخ و لصق كل رؤوس يمكنك أن تجد)

أولا وقبل كل شيء ، زر العودة التاريخ لا ذاكرة التخزين المؤقت:

نضارة نموذج (القسم 4.2) لا تنطبق بالضرورة على التاريخ الآليات.هذا هو تاريخ آلية العرض السابق تمثيل حتى لو أنها انتهت.

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

العودة من المفترض أن أعود في الوقت المناسب (الوقت عندما يقوم المستخدم كان تسجيل الدخول).فإنه لا انتقل إلى الأمام إلى فتح سابقا URL.

ومع ذلك ، في الممارسة العملية ، ذاكرة التخزين المؤقت يمكن أن تؤثر على زر العودة في ظروف محددة للغاية:

  • الصفحة يجب أن يتم تسليم أكثر HTTPS, وإلا ذاكرة التخزين المؤقت هذه خرق لن تكون موثوقة.بالإضافة إلى, إذا كنت لا تستخدم HTTPS ، ثم الصفحة الخاصة بك هو عرضة الدخول سرقة في العديد من الطرق الأخرى.
  • يجب أن ترسل Cache-Control: no-store, must-revalidate (نلاحظ بعض المتصفحات no-store وبعض مراقبة must-revalidate)

لك أبدا تحتاج إلى أي من:

  • <meta> مع ذاكرة التخزين المؤقت رؤوس — أنها لا تعمل على الإطلاق.عديمة الفائدة تماما.
  • post-check/pre-check — انها IE فقط التوجيه الذي ينطبق فقط على cachable الموارد.
  • إرسال نفسه رأس مرتين أو في عشرة أجزاء.بعض PHP قصاصات هناك في الواقع استبدال رؤوس السابق ، مما أدى إلى الماضي فقط واحد إرسالها.

إذا كنت تريد, يمكنك إضافة:

  • no-cache أو max-age=0, والتي سوف تجعل الموارد (URL) "لا معنى لها" و تتطلب المتصفحات تحقق مع الخادم إذا كان هناك إصدار أحدث (no-store يعني بالفعل هذا أقوى).
  • Expires مع التاريخ في الماضي HTTP/1.0 العملاء (على الرغم من أن الحقيقي HTTP/1.0 فقط العملاء غير موجودة تماما في هذه الأيام).

مكافأة: الجديد التخزين المؤقت HTTP RFC.

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

في كروم (v28.0.1500.95 m) يمكننا أن نفعل ذلك إلا من خلال Cache-Control: no-store.

في فايرفوكس (v23.0.1) أي واحدة من هذه سوف تعمل:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (https فقط)

  3. Pragma: no-cache (https فقط)

  4. Vary: * (https فقط)

في أوبرا (v12.15) نحن فقط يمكن أن تفعل هذا من قبل Cache-Control: must-revalidate (https فقط).

في سفاري (v5.1.7, 7534.57.2) أي واحدة من هذه سوف تعمل:

  1. Cache-Control: no-store
    <body onunload=""> في html

  2. Cache-Control: no-store (https فقط)

في IE8 (v8.0.6001.18702 IC) أي واحدة من هذه سوف تعمل:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (https فقط)

  7. Vary: * (https فقط)

الجمع بين ما سبق يعطينا هذا الحل الذي يعمل على كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, and Opera 12.15: Cache-Control: no-store, must-revalidate (https فقط)

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

Cache-Control: no-store
<body onunload="">

أدناه يبين سجلات الخام من الاختبارات:

HTTP:

  1. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7

  2. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7

  3. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    تفشل:Safari 5.1.7, Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8

  4. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    تفشل:Safari 5.1.7, Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  6. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  8. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  9. Cache-Control: no-store
    تفشل:Safari 5.1.7, Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    تفشل:Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  12. Vary: *
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, Opera 12.15
    النجاح:لا شيء

  13. Pragma: no-cache
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, Opera 12.15
    النجاح:لا شيء

  14. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  16. Cache-Control: must-revalidate, max-age=0
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7, Opera 12.15
    النجاح:IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, Opera 12.15
    النجاح:لا شيء

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, Opera 12.15
    النجاح:لا شيء

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, Opera 12.15
    النجاح:لا شيء

  3. Vary: *
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  4. Pragma: no-cache
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  5. Cache-Control: no-cache
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  8. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  9. Cache-Control: must-revalidate
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7
    النجاح:Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7
    النجاح:Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7
    النجاح:IE8, Opera 12.15

  12. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, Safari 5.1.7
    النجاح:فايرفوكس 23, IE8, Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:كروم 28, Safari 5.1.7
    النجاح:فايرفوكس 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    تفشل:Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7

  16. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    تفشل:Opera 12.15
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    تفشل:كروم 28, Safari 5.1.7, Opera 12.15
    النجاح:فايرفوكس 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7,
    النجاح:IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7,
    النجاح:IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7,
    النجاح:IE8, Opera 12.15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    تفشل:كروم 28, فايرفوكس 23, Safari 5.1.7,
    النجاح:IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    تفشل:كروم 28, Safari 5.1.7
    النجاح:فايرفوكس 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    تفشل:لا شيء
    النجاح:كروم 28, فايرفوكس 23, IE8, Safari 5.1.7, Opera 12.15

لقد وجدت على شبكة الإنترنت.التكوين الطريق المفيد (حاول إضافة إلى الإجابة ولكن لا يبدو أنه قد تم قبول حتى نشر هنا)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

و هنا هو صريح / node.js طريقة لفعل نفسه:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});

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

بعد الكثير من البحث والاختبار ، وجدت أن اثنين فقط من رؤوس أنا حقا بحاجة هي:

Cache-Control:no-store
تختلف:*

توضيحا رأس Vary, تحقق http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

على IE6-8 ، FF1.5-3.5, كروم 2-3, سفاري 4 ، الأوبرا 9-10, هذه الرؤوس تسبب الصفحة إلى أن يطلب من الخادم عند النقر على رابط الصفحة او وضع رابط مباشرة في شريط العنوان.التي تغطي حوالي 99% من جميع المتصفحات في استخدام اعتبارا من يناير '10.

على IE6 ، الأوبرا 9-10, ضرب زر العودة لا تزال تسبب النسخة المخزنة مؤقتا إلى أن يتم تحميل.على جميع المتصفحات الأخرى اختبرت قاموا جلب نسخة جديدة من الخادم.حتى الآن لم أجد أي مجموعة من الرؤوس التي من شأنها أن تسبب تلك المتصفحات على عدم العودة مؤقتا إصدارات الصفحات عندما تضغط على الزر مرة أخرى.

تحديث: بعد كتابة هذا الجواب ، أدركت أن خادم الويب لدينا هو تحديد نفسها HTTP 1.0 server.رؤوس لقد سردت هم الصحيح من أجل الردود من HTTP 1.0 ملقم أن لا يكون مؤقتا من قبل المتصفحات.بالنسبة HTTP 1.1 الخادم ، أنظر BalusC هو الجواب.

بعد قليل من البحث توصلنا مع القائمة التالية من الرؤوس التي يبدو أنها تغطي معظم المتصفحات:

في ASP.NET أضفنا هذه باستخدام المقتطف التالي:

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

وجدت من: http://forums.asp.net/t/1013531.aspx

استخدام pragma رأس في الرد حكاية الزوجات.RFC2616 فقط يعرف أنه طلب رأس

http://www.mnot.net/cache_docs/#PRAGMA

تنويه:أقترح بشدة القراءة @BalusC الجواب.بعد قراءة ما يلي التخزين المؤقت التعليمي: http://www.mnot.net/cache_docs/ (أنصحك بقراءة هذا أيضا), أعتقد أنها صحيحة.ومع ذلك لأسباب تاريخية (ولأن لقد اختبرت ذلك بنفسي) ، وسوف تشمل بلدي الأصلي الإجابة أدناه:


حاولت "مقبولة" الإجابة عن PHP التي لا تعمل بالنسبة لي.ثم فعلت القليل من البحث وجدت طفيف البديل ، اختباره ، وعملت.هنا هو:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

التي يجب أن تعمل.كانت المشكلة أنه عندما وضع نفسه جزء من رأس مرتين ، إذا كان false لا يتم إرسالها كما الوسيطة الثانية إلى وظيفة رأس رأس وظيفة الكتابة ببساطة السابقة header() المكالمة.لذا عند وضع Cache-Control, على سبيل المثال إذا كان أحد لا يريد أن يضع كل الحجج في واحد header() استدعاء دالة كان يجب أن تفعل شيئا من هذا القبيل:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

رؤية المزيد من وثائق كاملة هنا.

هناك خلل في IE6

المحتوى "Content-ترميز:gzip" هو دائما مؤقتا حتى إذا كنت تستخدم "Cache-Control:no-cache".

http://support.microsoft.com/kb/321722

يمكنك تعطيل ضغط gzip IE6 المستخدمين (الاختيار عميل المستخدم "MSIE 6")

بالنسبة ASP.NET الأساسية, إنشاء بسيط الوسيطة الدرجة:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

ثم سجل مع Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

تأكد من إضافة هذه في مكان ما بعد

app.UseStaticFiles();

RFC عن HTTP 1.1 يقول الطريقة الصحيحة لإضافة HTTP رأس:

Cache-Control:no-cache

المتصفحات القديمة قد تجاهل هذا إذا كان غير صحيح فهي متوافقة مع HTTP 1.1.بالنسبة لأولئك يمكنك محاولة الرأس:

Pragma:no-cache

هذا هو المفترض أيضا أن العمل HTTP 1.1 المتصفحات.

هذه التوجيهات لا تخفف من أي مخاطر أمنية.هم حقا تهدف إلى القوة UA لتحديث متقلبة المعلومات لا تبقي UA من يتم الاحتفاظ المعلومات.انظر هذا سؤال مشابه.على الأقل ليس هناك ما يضمن أن أي الموجهات, بروكسيات, الخ.سوف نتجاهل التخزين المؤقت توجيهات كذلك.

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

وضع تعديل http بعض التاريخ في عام 1995 عادة لا حيلة.

هنا مثال:

Expires: Wed, 15 Nov 1995 04:58:08 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, must-revalidate

على PHP وثائق وظيفة رأس بدلا من كاملة سبيل المثال (ساهم من قبل طرف ثالث):

    header('Pragma: public');
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");                  // Date in the past   
    header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');     // HTTP/1.1
    header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);    // HTTP/1.1
    header ("Pragma: no-cache");
    header("Expires: 0", false);

إذا كنت تواجه مشاكل تحميل مع IE6-IE8 عبر SSL و ذاكرة التخزين المؤقت:لا توجد ذاكرة التخزين المؤقت رأس (و قيم مماثلة) مع ملفات مايكروسوفت أوفيس يمكنك استخدام ذاكرة التخزين المؤقت:خاص no-store رأس والعودة الملف على طلب POST.أنه يعمل.

في حالتي أنا حل المشكلة في متصفح chrome مع هذا

<form id="form1" runat="server" autocomplete="off">

حيث كنت بحاجة لمسح محتوى previus شكل البيانات عند المستخدمين انقر فوق الزر مرة أخرى لأسباب أمنية

لقد كان الأفضل والأكثر نتائج متسقة عبر جميع المتصفحات من خلال وضع Pragma:no-cache

رؤوس في الإجابة التي تقدمها BalusC لا يمنع سفاري 5 (وربما الإصدارات القديمة أيضا) من عرض المحتوى من ذاكرة التخزين المؤقت في المتصفح عند استخدام زر رجوع في متصفح الإنترنت.طريقة لمنع هذا إضافة فارغة onunload معالج الحدث تنسب إلى الجسم الوسم:

<body onunload=""> 

هذا الإختراق على ما يبدو يكسر الظهر إلى الأمام ذاكرة التخزين المؤقت في سفاري: هل هناك عبر متصفح onload الحدث عند النقر على الزر مرة أخرى ؟

الجواب المقبول لا يبدو أن العمل بالنسبة IIS7+ الذهاب قبل عدد كبير من الأسئلة حول رؤوس ذاكرة التخزين المؤقت لا يتم إرسالها في II7:

وهلم جرا

الجواب المقبول هو الصحيح الذي يجب أن تكون الرؤوس ولكن ليس في الطريقة التي يجب أن يتم تعيين.هذه الطريقة تعمل مع IIS7:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

السطر الأول مجموعات Cache-control إلى no-cache, و السطر الثاني يضيف سمات أخرى no-store, must-revalidate

أيضا, فقط لحسن التدبير ، تأكد من تعيين ExpiresDefault في .htaccess الملف إذا كنت تستخدم هذا إلى تمكين التخزين المؤقت.

ExpiresDefault "access plus 0 seconds"

بعد ذلك يمكنك استخدام ExpiresByType إلى مجموعة محددة من القيم الملفات التي تريد ذاكرة التخزين المؤقت:

ExpiresByType image/x-icon "access plus 3 month"

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

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

//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>

لاستكمال BalusC -> الجواب إذا كنت تستخدم بيرل يمكنك استخدام CGI لإضافة رؤوس صفحات HTTP.

باستخدام بيرل:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

باستخدام أباتشي httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

ملاحظة: عندما حاولت استخدام html META ، المتصفحات تجاهل لهم مؤقتا الصفحة.

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

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

هذا واضح تماما, ومع ذلك لا يزال يستحق الذكر.

و آخر الحذر.كن حذرا باستخدام ClearHeaders طريقة من HttpResponse الدرجة.قد تعطيك بعض الكدمات إذا كنت تستخدم بتهور.كما أنه أعطاني.

بعد إعادة توجيه على ActionFilterAttribute الحدث نتائج مسح جميع رؤوس تفقد جميع بيانات الدورة البيانات في TempData التخزين.انها أكثر أمانا إلى إعادة توجيه من عمل أو لا واضح رؤوس عندما توجيه يجري.

على أساس عدم تشجيع استخدام ClearHeaders الأسلوب.فمن الأفضل لإزالة الرؤوس بشكل منفصل.ووضع رأس Cache-Control صحيح أنا باستخدام هذا الكود:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");

لم يكن لدي أي حظ مع <head><meta> عناصر.مضيفا HTTP ذاكرة التخزين المؤقت المعلمات المتعلقة مباشرة (خارج HTML doc) لا بل العمل بالنسبة لي.

نموذج التعليمات البرمجية في بيثون باستخدام web.py web.header المكالمات على النحو التالي.أنا هادف حجب الشخصية ذات صلة الأداة البرمجية.

    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

    main = web.application(urls, globals())

    render = web.template.render("templates/", base="layout", cache=False)

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.main_form()

        def POST(self):
            msg = "POSTed:"
            form = web.input(function = None)
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()

انظر هذا الرابط دراسة حالة التخزين المؤقت:

http://securityevaluators.com/knowledge/case_studies/caching/

ملخص وفقا للمادة فقط Cache-Control: no-store يعمل على كروم, فايرفوكس وإنترنت إكسبلورر.أي يقبل ضوابط أخرى ، ولكن كروم و فايرفوكس لا.الرابط هو قراءة جيدة كاملة مع تاريخ التخزين المؤقت وتوثيق إثبات المفهوم.

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