تخزينُ الملفّات الساكنة أرخصُ سرعةٍ موجودة: فالمتصفّح لا يسأل أصلًا. والخطرُ هو النقيض — ملفُّ أنماطٍ مخزَّن سنةً ثمّ تحتاج إلى تغييره، على جهازٍ لا تصل إليه.

القاعدة التي تجعل التخزين الطويل آمنًا

خزّن بشراسةٍ الملفّاتِ التي يتغيّر اسمها حين يتغيّر محتواها، دون سواها. فيكون التغييرُ اسمًا جديدًا، ويصير التخزينُ القديم بلا معنى، ولا يمسك زائرٌ الملفَّ الخطأ أبدًا.

/css/site.a1b2c3.css        <- safe to cache for a year
/css/site.css?v=1788541047   <- the same idea, from the file mtime

ماذا تضبط

location ~* \.(css|js|woff2|jpg|png|webp|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

location ~* \.(html|php)$ {
    add_header Cache-Control "no-cache";
}

الخيار immutable يقول للمتصفّح ألّا يعيد التحقّق أصلًا. وno-cache على HTML لا يعني «لا تخزّن» — بل يعني «راجعني أوّلًا»، وذلك هو الصواب تمامًا لصفحةٍ يتغيّر محتواها دون أن يتغيّر عنوانها.

لا تخزّن أبدًا ملفًّا باسمٍ ثابت مدّةً طويلة. فملفُّ /css/site.css مخزَّنًا سنةً يعني سنةً من الزوّار على التصميم القديم، ولا شيء تفعله من جهتك ليقصر ذلك.

افحص ما ترسله

curl -sI https://yourdomain.com/css/site.css | grep -iE "cache-control|expires|etag"

ETag وLast-Modified

هذان يجعلان المراجعةَ رخيصة لا الطلبَ مستغنًى عنه: فالمتصفّح يسأل، والخادم يجيب 304 Not Modified، ولا يُرسَل متن. وهو جيّدٌ لصفحات HTML، وثانٍ بعد ألّا تُسأل أصلًا في الأصول.

وخلف شبكة توزيعٍ تذكّر أن هناك تخزينين. فتفريغُ الشبكة لا يبلغ متصفّحًا يحمل الملفَّ سنةً — ولهذا وجب أن يتغيّر الاسم.