کش یعنی نگهداری یک نسخه از پاسخ نزدیکتر به کاربر تا درخواست بعدی سریعتر و بدون مراجعه به سرور اصلی پاسخ داده شود. سه لایهٔ اصلی وجود دارد: کش مرورگر، کش CDN و کش سمت سرور. اینکه هر فایل چقدر و کجا کش شود را هدر Cache-Control تعیین میکند. قانون طلایی: فایلهای ثابت نسخهدار (CSS، JS، تصاویر) کش طولانی، صفحات HTML کش کوتاه یا بدون کش.
یک مثال ساده
تصور کنید لوگوی سایت شما ۵۰ کیلوبایت است و هر بازدیدکننده در هر صفحه آن را دانلود میکند. بدون کش، ۱۰ هزار بازدید صفحه یعنی ۱۰ هزار بار ارسال همان فایل از سرور. با کش مرورگر، هر کاربر فقط یکبار آن را دانلود میکند؛ با کش CDN، حتی همان یکبار هم از لبهٔ نزدیک کاربر ارسال میشود نه از سرور شما. نتیجه: بارگذاری سریعتر، بار کمتر سرور و ترافیک کمتر.
سه لایهٔ کش
| لایه | کجاست | چه چیزی را کش میکند | کنترل با |
|---|---|---|---|
| مرورگر | دستگاه کاربر | فایلهای ثابت، گاهی صفحات | Cache-Control، ETag |
| CDN | لبههای نزدیک کاربر | فایلهای ثابت، صفحات قابل اشتراک | Cache-Control، s-maxage، تنظیمات CDN |
| سرور | خود سرور | نتیجهٔ پردازش صفحه، کوئریهای دیتابیس | افزونههای کش، Redis، FastCGI cache |
هدر Cache-Control
مهمترین ابزار کنترل کش، هدر Cache-Control در پاسخ سرور است:
| مقدار | معنی |
|---|---|
public, max-age=31536000, immutable |
همه (مرورگر و CDN) تا یک سال کش کنند و دوباره بررسی نکنند |
public, max-age=300 |
تا ۵ دقیقه کش شود |
no-cache |
کش شود اما پیش از هر استفاده با سرور اعتبارسنجی شود |
no-store |
اصلاً ذخیره نشود (اطلاعات حساس) |
private |
فقط مرورگر کاربر کش کند، نه CDN |
s-maxage=600 |
مدت کش برای کشهای مشترک مثل CDN |
بررسی هدرهای یک آدرس:
curl -I https://www.example.com/style.css
$ curl -sI https://example.com/app.css | grep -i cachecache-control: public, max-age=31536000, immutable$ curl -sI https://example.com/ | grep -i cachecache-control: no-cache$
TTL مناسب برای هر نوع محتوا
| نوع محتوا | پیشنهاد | دلیل |
|---|---|---|
CSS و JS با نام نسخهدار (app.3f9a.js) |
یک سال، immutable | با تغییر فایل، نامش عوض میشود |
| تصاویر و فونتها | ۳۰ روز تا یک سال | بهندرت تغییر میکنند |
| صفحات HTML عمومی | چند دقیقه یا no-cache | محتوا بهروز بماند |
| صفحات شخصی (پنل، سبد خرید) | private یا no-store |
نباید بین کاربران مشترک شود |
| پاسخهای API | بسته به داده؛ معمولاً no-store |
دادههای لحظهای |
نسخهگذاری فایلها: کش طولانی بدون دردسر
مشکل کش طولانی این است که اگر CSS را تغییر دهید، کاربران تا مدتی نسخهٔ قدیمی را میبینند. راهحل استاندارد، تغییر آدرس فایل با هر تغییر محتوا است:
style.css?v=14842b(پارامتر نسخه)style.14842b.css(هش در نام فایل؛ ابزارهای build مانند Vite و Webpack خودکار انجام میدهند)
به این ترتیب HTML (که کش کوتاه دارد) همیشه به نسخهٔ جدید اشاره میکند و فایلهای قدیمی بیخطر در کش میمانند.
تنظیم در Nginx
location ~* \.(css|js|woff2|png|jpg|jpeg|webp|svg)$ {
add_header Cache-Control "public, max-age=2592000";
}
location / {
add_header Cache-Control "no-cache";
try_files $uri $uri/ /index.html;
}
راهنمای نصب Nginx: نصب Nginx و SSL رایگان.
پاکسازی (Purge) کش
- مرورگر: Ctrl+Shift+R یا پنجرهٔ ناشناس برای دیدن نسخهٔ تازه.
- CDN: از گزینهٔ پاکسازی کش در پنل CDN (اگر ارائه شده) یا تغییر آدرس فایل (نسخهگذاری).
- کش سرور: از افزونهٔ کش CMS یا با پاک کردن پوشه/کلیدهای کش.
بهترین استراتژی این است که با نسخهگذاری، نیاز به پاکسازی دستی را تقریباً حذف کنید.
کش و ترافیک: اثر مالی
در سرویسهایی که ترافیک مصرفی هزینه دارد، کش مستقیماً هزینه را کم میکند: هر درخواستی که از کش مرورگر پاسخ داده شود، اصلاً ترافیکی ایجاد نمیکند. فایلهای بزرگ (تصاویر، ویدیو، فایلهای دانلودی) بیشترین سهم را دارند؛ فشردهسازی تصاویر (WebP) و کش درست، بزرگترین صرفهجویی را ایجاد میکند. دربارهٔ تفاوت ترافیک و پهنای باند: پهنای باند و ترافیک.
خطاهای رایج
| مشکل | علت | راهحل |
|---|---|---|
| کاربران تغییرات CSS را نمیبینند | کش طولانی بدون نسخهگذاری | نسخهگذاری فایلها |
| کاربر اطلاعات کاربر دیگر را میبیند | کش صفحهٔ شخصی در CDN | private/no-store برای صفحات شخصی |
| کش اصلاً کار نمیکند | هدر Set-Cookie یا no-store روی فایلهای ثابت |
هدرهای فایلهای ثابت را اصلاح کنید |
| صفحهٔ خطا کش شده | کش شدن پاسخهای 5xx | فقط پاسخهای 200 را کش کنید |
سؤالات متداول
کش و CDN یکی هستند؟
خیر؛ CDN شبکهای از سرورهای لبه است و کش یکی از کارهایی است که انجام میدهد. CDN چیست؟
ETag چیست؟
شناسهٔ نسخهٔ یک فایل است؛ مرورگر با آن از سرور میپرسد «آیا فایل تغییر کرده؟» و اگر نه، پاسخ کوتاه 304 میگیرد.
کش برای سئو مهم است؟
بهطور غیرمستقیم بله؛ سرعت بارگذاری بخشی از تجربهٔ کاربری و معیارهای Core Web Vitals است.
صفحات پویا را هم میتوان کش کرد؟
بله، برای کاربران مهمان و با مدت کوتاه (مثلاً یک دقیقه)؛ این کار بار سرور را در ترافیک بالا بهشدت کم میکند.
از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی



