طبّق السياسة حسب المورد، لا حسب الخادم
أحصِ عيّنات ممثلة من عناوين URL قبل تغيير الترويسات: صفحة رئيسية، صفحة محتوى، شِل التطبيق، CSS، JavaScript، صور، خطوط، واجهات برمجة التطبيقات (APIs)، تسجيل الدخول، الحساب، الدفع، والتنزيلات. لكل منها، سجّل ما إذا كانت الاستجابة عامة أم مخصصة، وما إذا كان عنوانها يتغير عندما تتغير بايتاتها، ومدى سرعة وصول تصحيح إلى الزوار.
صُنّف سياسة على شكل مصفوفة بناءً على هذه الجرد. يحتاج الأصل العام المعتمد على المحتوى (content-addressed) إلى قاعدة مختلفة عن HTML في عنوان ثابت. يمكن للردود دون `Cache-Control` أن تُخزّن أيضًا بطريقة تخمينية، لذلك القواعد الصريحة أسهل للاختبار.
الفترة التي يمكن خلالها إعادة استخدام استجابة مخزنة؛ يحدد `max-age` هذه الفترة بالثواني.
استخدم مصطلحات Cache-Control بدقّة
`Cache-Control` يخبر المتصفحات والذاكرات المشتركة كيف تخزن وتعيد استخدام الاستجابة. `max-age=N` يسمح بإعادة الاستخدام طالما النتيجة طازجة. `s-maxage=N` يضبط صلاحية الذاكرة المشتركة ويتجاوز `max-age` هناك، لكن المتصفحات تتجاهل `s-maxage`. `public` يسمح لأي ذاكرة مؤقتة بالتخزين؛ `private` يسمح بتخزين المتصفح ولكنه يمنع التخزين في الذاكرات المشتركة.
`no-cache` يسمح بالتخزين لكنه يتطلّب التحقق من الأصل قبل إعادة الاستخدام. `no-store` يعني أنه لا يجوز للذاكرات تخزين الاستجابة، لكنه ليس ضابط خصوصية كاملًا. استخدم `must-revalidate` عندما يكون تقديم محتوى منتهي الصلاحية غير مقبول؛ عندها قد يؤدي عدم توفر الأصل إلى إرجاع 504 بدلًا من تقديم نسخة منتهية.
هو يزيل التخزين بدلًا من مجرد طلب تحقق؛ احتفظ به للردود التي يجب حقًا ألا تُخزّن.
وسّم الأصول غير القابلة للتغيير قبل إعطائها عمرًا طويلًا
يتضمن عنوان الأصل المُوسَّم بصمة محتوى أو إصدار الإصدار، مثل `app.4f2c.js`. عندما تتغير بايتات الأصل، انشر عنوان URL مختلفًا وحدث إشارة HTML. ترى الذاكرة المؤقتة موردًا جديدًا، لذا يجلب الزائرون الأصل الجديد دون أن تصل عملية إبطال إلى كل متصفح.
لتمثيل لن يتغير خلال فترة صلاحيته، نمط عملي هو `Cache-Control: max-age=31536000, immutable`. تشير `immutable` إلى أن العملاء الداعمين لا يحتاجون لإعادة التحقق شرطيًا أثناء الصلاحية. لا تطبّقها أو `max-age` لسنة على ملف قابل للتعديل بنفس العنوان. احتفظ بالأصول الموقّعة السابقة بينما قد تواصل HTML المخزنة مؤقتًا الإشارة إليها.
يختار HTML عناوين الأصول، لذا يجب أن يحتفظ تسلسل الإصدارات بالجيل المشار إليه.
اجعل HTML حديثًا عن طريق التحقق، لا عن طريق التخزين الطويل
عادةً ما يكون لـ HTML عنوان قابل للعرض من قِبَل البشر ويتغيّر مع المحتوى ومراجع الأصول وعلامات الميزات أو الإشعارات الأمنية. نمط محافظ لصفحات HTML العامة هو `Cache-Control: no-cache` مع `ETag` و`Last-Modified` عندما تستطيع منصتك إنتاجهما بشكل صحيح. يخزن المتصفح الجسم لكنه يستخدم طلبًا شرطيًا قبل إعادة الاستخدام؛ يمكن أن تعود استجابة دون تغيير بـ `304 Not Modified` دون جسم.
`ETag` يحدّد نسخة المورد. على استجابة منتهية الصلاحية، يمكن للمتصفح إرسالها في `If-None-Match`; إذا طابقت، يرد الخادم بـ `304`، وإلا يرسل التمثيل الجديد. توصي الإرشادات في المواصفات بتوفير كلٍ من `ETag` و`Last-Modified` على استجابة 200 عندما يكون ذلك ممكنًا. لا يضمن `no-cache` تحققًا عند التنقّل للخلف أو للأمام لأن المتصفح قد يستعيد لقطة من سجل الجلسة.
يجب أن يتغير `ETag` عندما يتغير التمثيل؛ اختبره عبر الأصول والنشر.
فصّل التسليم العام عن الردود المخصصة والحساسة
قد تعيد ذاكرة مشتركة مثل CDN استخدام استجابة واحدة لعدة مستخدمين. لا تسمح لها بإعادة استخدام HTML أو بيانات API الخاصة بالحساب عبر المستخدمين. للبيانات المخصصة التي قد تبقى في المتصفح، يكون `private, no-cache` نقطة بداية معقولة: يمنع التخزين المشترك ويتطلب التحقق. وجود `Set-Cookie` وحده لا يمنع التخزين.
لردود لا ينبغي تخزينها، استخدم `no-store` وراجع كود التطبيق، وقواعد CDN، وعاملات الخدمة (service workers)، وتخزين المتصفح، والسجلات، وصفحات الأخطاء. الترويسات وحدها ليست برنامجًا للخصوصية أو الامتثال أو أمان المدفوعات. اجعل مراجعي الأمان والخصوصية والمدفوعات المؤهلين يقيمون التدفقات الحساسة والمتطلبات المطبقة.
اختبر التسجيل، وتسجيل الخروج، وتبديل الحساب، وتغيّر الأذونات مع ذاكرات متصفح وCDN دافئة.
نَشِّر تغييرات التخزين كإصدار قابل للرجوع
التقط ترويسات خط الأساس وسلوك الجسم للطلبات غير المخزنة والمتكررة. في بيئة تحضيرية، انشر الأصول الموقّعة أولًا، ثم HTML الذي يشير إليها، واختبر HTML المخزّن القديم مقابل الأصل الجديد. افحص مسارات الأصل المباشر وCDN إن وُجدتا. يجب أن تظهر ترويسات أدوات المطور (DevTools Network) السياسة المقصودة وسلوك التكرار.
احتفظ بمخطط إصدار (release manifest) لعناوين الأصول، وقواعد الترويسات، وإصدار التكوين. إذا جمع إصدار أحجام ملفات غير متوافقة للعملاء، استعد HTML المتوافق أولًا؛ لكن لا تُعدِّل ملفًا موقّعًا ثابتًا منشورًا. أعد توجيه HTML إلى الجيل المعروف بأنه يعمل واحتفظ بكلا الجيلين طالما قد تطلب HTML المخزّن الأصول الأقدم. لا يمكن لعملية تطهير الذاكرة المشتركة أن تُجبر المتصفحات على التخلص من استجابة لا تزال طازجة.
حوّل فشل اختبارات الترويسات، و404 للأصول، وعدم تطابق الإصدارات إلى عناصر في قائمة فحص الإصدار التالية.
