في هذا الدرس 10تصفّح المواضيع
بعد أن تعرّفنا في الدروس السابقة على آليات المصادقة وإدارة الجلسات، يبرز سؤال هندسي جوهري: هل يعقل أن يعيد المتصفح تنزيل شعار الموقع وملفات التنسيق والخطوط من الخادم الأصلي في كل مرة ينتقل فيها المستخدم من صفحة إلى أخرى؟ هنا يأتي دور التخزين المؤقت في HTTP (HTTP Caching الموثق في المعيار RFC 9111)، وهو الآلية التي تحتفظ بنسخ صالحة لإعادة الاستخدام من استجابات الخادم داخل ذاكرة المتصفح أو الخوادم الوسيطة لتقديمها فوراً دون استهلاك الشبكة من جديد.
قبل الغوص في التفاصيل الهندسية، استعرض جدول المصطلحات التقنية الأساسية لهذا الدرس:
تعتمد دورة عمل الكاش في بروتوكول HTTP على البحث عن استجابة محفوظة تطابق طريقة الطلب والرابط (وخاصة طلبات GET):
- عدم وجود نسخة في الكاش (
Cache Miss— الزيارة الأولى): يطلب المتصفح الملف/assets/logo.svg، فلا يجده في ذاكرته، فيرسله إلى الخادم الأصلي ويستلم الرد200 OKمرفقاً بحقول رأس التحكم بالكاش، فيعرضه ويحفظ نسخة منه. - إصابة الكاش بنجاح (
Cache Hit— الزيارات التالية): عند الانتقال لصفحة أخرى تطلب الشعار نفسه، يجد المتصفح النسخة الصالحة في ذاكرته المحلية فيعرضها خلال أجزاء من المللي ثانية دون إرسال أي حزمة عبر الشبكة.
لاحظ في المثال الآتي كيف يرفق الخادم الأصلي قواعد التخزين المؤقت داخل رؤوس الرسالة:
HTTP/1.1 200 OKDate: Thu, 05 Nov 2026 10:00:00 GMTContent-Type: image/svg+xmlContent-Length: 4120Cache-Control: public, max-age=86400ETag: "v2-8f9d1a"<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30">...</svg>
مخطط هرمية طبقات الكاش في الويب
يحقق تطبيق سياسة تخزين مؤقت دقيقة أربع فوائد هندسية ملموسة على مستوى الشبكة والخادم وتجربة المستخدم:
- 1. إلغاء زمن تأخير الشبكة وتسريع العرض (
Zero Network Latency): عندما تُقرأ الملفات مباشرة من ذاكرة المتصفح، يتجاوز الموقع زمن رحلة الحزم عبر الشبكة بالكامل، مما يرفع مؤشرات سرعة الصفحة مثلLargest Contentful Paint (LCP). - 2. توفير استهلاك البيانات وعرض النطاق (
Bandwidth Savings): يمنع الكاش إعادة تنزيل الخطوط والصور والملفات الثابتة ذات الأحجام الكبيرة في كل صفحة، مما يوفر باقات الإنترنت لمستخدمي الهواتف ويقلل فاتورة نقل البيانات على الخادم. - 3. تخفيف العبء عن الخادم الأصلي وقاعدة البيانات (
Origin Offloading): كل طلب يلبيه الكاش المحلي أو خادمCDNيزيل عبء معالجة طلب كامل عن وحدة المعالجة المركزية وقاعدة البيانات في الخادم الأصلي، مما يحمي الموقع من الانهيار أوقات الذروة. - 4. تعزيز استقرار الخدمة عند تذبذب الشبكة (
Resilience): تتيح النسخ المخزنة استمرار عمل الواجهة الرسومية بسلاسة حتى لو واجه الاتصال بالخادم الأصلي بطئاً لحظياً.
تمر كل نسخة محفوظة داخل الكاش بحالتين زمنيتين تحددهما معادلة عمر النسخة الحالي (Age) مقابل مدة الصلاحية الكلية (Freshness Lifetime):
- حالة النسخة الطازجة (
Fresh): عندما يكون الوقت المنقضي منذ إصدار الاستجابة أقل من مدة الصلاحية المحددة (مثلاًmax-age=3600ثانية ولم يمر سوى500ثانية). هنا يستخدمها المتصفح فوراً دون أي اتصال بالخادم. - حالة النسخة المنتهية (
Stale): عندما يتجاوز عمر النسخة مدة الصلاحية. من المهم معرفة أن المتصفح لا يحذف النسخة المنتهية فوراً، بل يحتفظ بها في الذاكرة ويرسل طلباً شرطياً صغيراً لسؤال الخادم إن كانت لا تزال صالحة.
يحسب المتصفح والخادم الوسيط زمن الصلاحية عبر حقول الرأس القياسية الآتية (حيث تتفوق تعليمة max-age دائماً على حقل Expires القديم عند وجودهما معاً):
HTTP/1.1 200 OKDate: Thu, 05 Nov 2026 12:00:00 GMTCache-Control: public, max-age=3600Expires: Thu, 05 Nov 2026 13:00:00 GMTAge: 1200
يُعدّ حقل الرأس Cache-Control مركز القيادة الرئيسي للتخزين المؤقت في HTTP؛ إذ يقبل مجموعة من التوجيهات (Directives) المفصولة بفواصل لضبط السياسة بدقة:
- التوجيه
max-age=N: يحدد عدد الثواني التي تظل فيها النسخة صالحة (Fresh) بدءاً من وقت إصدار الاستجابة. - التوجيه
s-maxage=N: يحدد مدة صلاحية خاصة بالكاش المشترك (Shared Caches / CDN) تتجاوز قيمةmax-ageالعادية. - التوجيهان
publicوprivate: يسمحpublicبتخزين النسخة في كلٍّ من المتصفح وشبكاتCDN، بينما يحصرprivateالتخزين داخل متصفح المستخدم وحده. - التوجيه
must-revalidate: يلزم الكاش بعدم استخدام النسخة بعد انتهاء صلاحيتها (Stale) إلا بعد نجاح التحقق الشرطي من الخادم الأصلي. - التوجيه
immutable: يخبر المتصفح أن هذا الملف ثابت ولن يتغير أبداً طوال مدة صلاحيته، مما يمنع المتصفح من إرسال طلبات تحقق شرطية حتى لو ضغط المستخدم زر تحديث الصفحة.
من أكثر الأخطاء شيوعاً في هندسة الويب الخلط بين التوجيهين no-cache وno-store؛ فبرغم تقارب الاسمين، يختلف سلوكهما الفعلي اختلافاً جذرياً:
- التوجيه
Cache-Control: no-cache(خزّن النسخة ولكن تحقق من الخادم قبل كل استخدام): على عكس ما يوحي به اسمه الحرفي، فإنno-cacheيسمح للمتصفح بحفظ النسخة في الكاش! لكنه يشترط عدم عرضها للمستخدم في أي زيارة تالية إلا بعد إرسال طلب تحقق شرطي سريع للخادم الأصلي للتأكد من عدم تغيرها. وهو مثالي لصفحاتHTMLالمتجددة. - التوجيه
Cache-Control: no-store(منع التخزين تماماً في أي ذاكرة): يمنع المتصفح وجميع الخوادم الوسيطة منعاً قاطعاً من كتابة أي بايت من الاستجابة في القرص أو الكاش. وهو الخيار الإلزامي للبيانات شديدة الحساسية مثل كشوف الحسابات البنكية ورموز الاسترداد السرية.
جرّب المختبر التفاعلي الآتي لمقارنة سلوك المتصفح مع التوجيهات الأربعة على السلك:
Cache Control Directives Comparisonمقارنة توجيهات التحكم بالكاش
مقارنة توضح الفارق الحاسم بين no-cache لإعادة التحقق الشرطي و no-store لمنع التخزين نهائياً.
# no-cache: Caches resource, but MUST revalidate with server:
Cache-Control: no-cache, must-revalidate
ETag: "v3a1b2"
# no-store: NEVER write to cache/disk (for sensitive data):
Cache-Control: no-store, private
Cache Revalidation Status Previewمعاينة إعادة التحقق 304
معاينة توضح توفير البيانات باستجابة 304 مع no-cache مقابل المنع التام للتخزين مع no-store.
ماذا يحدث عندما تنتهي مدة صلاحية ملف مخزن في الكاش ويصبح في حالة Stale؟ بدلاً من إعادة تنزيل الملف بالكامل وإهدار البيانات، ينفذ المتصفح عملية التحقق الشرطي (Conditional Revalidation) باستخدام ثنائيات التحقق:
- 1. التحقق ببصمة الكيان (
ETag → If-None-Match— الأدق والأحدث): يرسل الخادم مع الملف في المرة الأولى حقل الرأسETag: "v2-8f9d1a"الذي يمثل بصمة فريدة لمحتوى الملف. وعند انتهاء الصلاحية، يرسل المتصفح طلبGETمرفقاً بحقل الرأس الشرطيIf-None-Match: "v2-8f9d1a". - 2. التحقق بتاريخ آخر تعديل (
Last-Modified → If-Modified-Since): يرسل الخادم تاريخ آخر تعديل للملف، فيعيد المتصفح إرساله في حقل الرأسIf-Modified-Since.
إذا تطابقت البصمة ولم يتغير الملف، يرد الخادم بكود الحالة 304 Not Modified وبدون جسم رسالة إطلاقاً (فتوفر نقل الملف بالكامل) ويجدد المتصفح صلاحية النسخة المحفوظة لديه. أما إذا تغير الملف فيرد الخادم بكود 200 OK مع النسخة الجديدة.
GET /assets/bundle.css HTTP/1.1Host: www.closetag.comIf-None-Match: "v2-8f9d1a"If-Modified-Since: Wed, 04 Nov 2026 08:00:00 GMTHTTP/1.1 304 Not ModifiedDate: Thu, 05 Nov 2026 11:05:00 GMTCache-Control: public, max-age=86400ETag: "v2-8f9d1a"
عند فحص حركة الشبكة داخل أدوات المطورين (DevTools → Network) أو عبر أداة سطر الأوامر curl -I، راقب عمودي الحالة (Status) والحجم (Size) لتمييز مصدر كل ملف:
- العبارة
200 OK (from memory cache): جُلبت النسخة فوراً من الذاكرة العشوائيةRAMفي التبويب الحالي بزمن0 ms. - العبارة
200 OK (from disk cache): جُلبت النسخة من الكاش المحفوظ على القرص الصلب دون إرسال أي طلب عبر الشبكة. - الكود
304 Not Modified: أرسل المتصفح طلباً شرطياً عبر الشبكة وأكد الخادم صلاحية النسخة المحلية دون إعادة إرسال جسم الملف. - خيار تعطيل الكاش أثناء البرمجة (
Disable cache): تفعيل مربعDisable cacheأعلى تبويبNetworkيوقف استخدام الكاش المحلي طالما بقيت نافذةDevToolsمفتوحة، ليضمن لك رؤية تعديلاتك البرمجية فوراً.
curl -I https://www.closetag.com/assets/app.csscurl -i -H 'If-None-Match: "v2-8f9d1a"' https://www.closetag.com/assets/app.css
تواجه هندسة الويب معضلة كلاسيكية عند ضبط الكاش: نحن نريد تخزين ملفات CSS وJavaScript لمدة سنة كاملة (max-age=31536000, immutable) لأقصى سرعة ممكنة، لكننا نريد في الوقت ذاته أن يصل أي تحديث برمجي جديد إلى جميع المستخدمين في اللحظة نفسها التي ننشره فيها! فكيف نجمع بين الأمرين؟
الحل الهندسي القياسي هو كسر الكاش بالبصمة الرقمية (Cache Busting / Content Fingerprinting)؛ حيث تضيف أدوات البناء الحديثة (مثل Vite وWebpack) بصمة محتوى الملف إلى اسمه مباشرة (مثل app.8f9d1a.css):
- الملفات الثابتة المختومة بالبصمة (
.cssو.js): تُعطى صلاحية سنة كاملة معimmutable. - صفحة المستند الرئيسية (
HTML): تُضبط بالتوجيهCache-Control: no-cacheليتحقق المتصفح منها دائماً. وفور تعديل كود التنسيق، يتغير اسم الملف في البناء الجديد إلىapp.c4e29b.cssداخل صفحةHTML، فيتعامل معه المتصفح كرابط جديد تماماً ويجلبه على الفور!
Static Asset Versioning Headerرأس إصدار الملفات الثابتة
تخزين الملفات الثابتة لعام كامل مع ربط أسماء الملفات ببصمة المحتوى للتحديث الفوري.
<link rel="stylesheet" href="/css/app.a8f2c1.css">
# Server response header for hashed assets:
HTTP/1.1 200 OK
Cache-Control: public, max-age=31536000, immutable
Immutable Cache Busting Previewمعاينة تخزين الموارد الثابتة
معاينة تفاعلية توضح سرعة استرجاع الملفات الثابتة فورياً من الذاكرة المحلية دون اتصال شبكي.
لبناء سياسة تخزين مؤقت احترافية تجمع بين السرعة القصوى وحماية خصوصية المستخدمين من تسرب البيانات في الخوادم الوسيطة، طبّق القواعد الهندسية الثلاث الآتية:
- الفئة الأولى — الملفات الثابتة المختومة بالبصمة (
app.8f9d1a.jsوالخطوط والصور): استخدم التوجيهCache-Control: public, max-age=31536000, immutable؛ فهي عامة وآمنة للتخزين لمدة عام كامل لأن أي تعديل سيغير رابطها تلقائياً. - الفئة الثانية — صفحات
HTMLالعامة والملفات غير المختومة: استخدم التوجيهCache-Control: no-cacheمع حقل البصمةETagليضمن المتصفح عرض أحدث نسخة دائماً مع توفير البيانات عبر الكود304 Not Modified. - الفئة الثالثة — صفحات الحسابات الشخصية والعمليات المالية (
/accountو/checkout): استخدم دائماً التوجيه الصارمCache-Control: no-store, privateلمنع حفظ أي بيانات خاصة في شبكاتCDNأو على الأقراص المشتركة.
Cache-Control: public, max-age=31536000, immutableCache-Control: no-cacheETag: "page-v14-9c2a"Cache-Control: no-store, private
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
تعلّمنا في هذا الدرس آلية عمل التخزين المؤقت في HTTP ودوره في تسريع المواقع وتخفيف الحمل عن الخوادم، والفرق المعماري بين الكاش الخاص (Private) والكاش المشترك (Shared)، وحساب عمر النسخة بين الحالتين Fresh وStale، والفرق الدقيق بين no-cache وno-store، وآلية التحقق الشرطي عبر ETag وكود 304 Not Modified، واستراتيجية كسر الكاش (Cache Busting). الخطوة التالية: انتقل الآن إلى الدرس التالي أساسيات أمان HTTP (HTTP Security Basics) لنستكشف المخاطر الأمنية في اتصالات الويب وكيف نحصّن تطبيقاتنا عبر حقول الرأس الأمنية الدفاعية!
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات12
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 HTTP Caching التخزين المؤقت في HTTP
- الاحتفاظ بنسخ صالحة لإعادة الاستخدام من استجابات الخادم في ذاكرة المتصفح أو الخوادم الوسيطة لتسريع تلبية الطلبات المتكررة.
- للمراجعة
- 02 Private Cache الكاش الخاص
- ذاكرة تخزين مؤقت مخصصة لمستخدم واحد داخل متصفحه الشخصي وتُضبط عبر التوجيه Cache-Control: private.
- للمراجعة
- 03 Shared Cache الكاش المشترك
- ذاكرة تخزين مؤقت في خادم وسيط أو شبكة CDN تخدم آلاف المستخدمين المشتركين وتُضبط عبر public وs-maxage.
- للمراجعة
- 04 Fresh Response النسخة الطازجة (الصالحة)
- استجابة مخزنة لم يتجاوز عمرها الحالي مدة الصلاحية المحددة في max-age ويمكن استخدامها فوراً دون الاتصال بالخادم.
- للمراجعة
- 05 Stale Response النسخة المنتهية الصلاحية
- استجابة مخزنة انتهت مدة صلاحيتها الزمنية وتتطلب إعادة التحقق الشرطي مع الخادم الأصلي قبل إعادة استخدامها.
- للمراجعة
- 06 Cache-Control: no-cache توجيه التحقق الإلزامي no-cache
- يسمح بحفظ الاستجابة في الكاش، لكنه يلزم المتصفح بالتحقق الشرطي من الخادم الأصلي قبل استخدامها في كل مرة.
- للمراجعة
- 07 Cache-Control: no-store توجيه منع الحفظ النهائي no-store
- يمنع المتصفح وأي خادم وسيط منعاً باتاً من حفظ أي جزء من الاستجابة في الذاكرة أو القرص الصلب.
- للمراجعة
- 08 ETag (Entity Tag) بصمة الكيان ETag
- معرّف نصي أو بصمة رقمية يضعها الخادم في رأس الاستجابة لتمييز كل إصدار محدد من محتوى الملف بدقة.
- للمراجعة
- 09 If-None-Match Header حقل الرأس الشرطي If-None-Match
- حقل رأس شرطي يرسله المتصفح متضمناً قيمة ETag المحفوظة لديه لسؤال الخادم إن كان الملف قد تغير.
- للمراجعة
- 10 304 Not Modified كود الحالة 304 Not Modified
- كود استجابة بدون جسم رسالة يؤكد للمتصفح أن النسخة المخزنة لديه لا تزال مطابقة للأصل ويجدد صلاحيتها.
- للمراجعة
- 11 Cache Busting كسر الكاش بالبصمة
- تضمين بصمة محتوى الملف في اسمه ورابطه لإجبار المتصفح على جلب النسخة المحدثة فوراً عند نشر تعديل جديد.
- للمراجعة
- 12 Vary Header حقل الرأس Vary
- حقل رأس يوجّه ذواكر الكاش المشتركة لحفظ نسخ منفصلة بحسب خصائص الطلب مثل نوع الضغط في Accept-Encoding.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات5
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 CDN CDN
- Content Delivery Network
- شبكة توصيل المحتوى المكونة من خوادم كاش مشتركة موزعة جغرافياً لتقديم الملفات من أقرب نقطة للمستخدم.
- للمراجعة
- 02 TTL TTL
- Time To Live
- مدة البقاء أو الصلاحية بالثواني التي تظل خلالها النسخة المخزنة صالحة للاستخدام المباشر.
- للمراجعة
- 03 ETag ETag
- Entity Tag
- وسم الكيان الذي يمثل البصمة الفريدة لإصدار الملف والمستخدم في التحقق الشرطي.
- للمراجعة
- 04 LCP LCP
- Largest Contentful Paint
- مؤشر قياس سرعة رسم أكبر عنصر مرئي في الصفحة، ويتحسن بشكل كبير بفضل التخزين المؤقت.
- للمراجعة
- 05 RFC RFC
- Request for Comments (RFC 9111)
- سلسلة وثائق المعايير القياسية للإنترنت، ويختص المعيار RFC 9111 بتوثيق قواعد التخزين المؤقت في HTTP.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
افتح تبويب Network في أدوات المطورين مع إلغاء تفعيل Disable cache، وحمّل الصفحة مرتين لملاحظة الملفات التي تُجلب من memory cache أو disk cache أو تُرجع 304 Not Modified.
-
نفّذ الأمر curl -I على رابط ملف ثابت لنسخ قيمة ETag الخاصة به، ثم أرسل طلباً شرطياً عبر curl -i -H 'If-None-Match: "<etag>"' وتحقق من استلام استجابة 304 Not Modified بدون جسم رسالة.
-
اكتب الصيغة القياسية لحقل الرأس Cache-Control لكلٍّ من: (1) ملف ثابت مختوم بالبصمة app.9a8b.js، و(2) صفحة عامة /index.html، و(3) صفحة بيانات مالية خاصة /account/billing.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.