بررسی دقیق Cache-Control در کش شرطی
کلا ما دو روش منطقی برای افزایش سرعت یک صفحه اینترنتی داریم
1- کم کردن تعداد درخواستها از سرور (مثلا با کم کردن عکس ها و کدهای الحاقی جاوا اسکریپت و css ها و...)
2- کم کردن حجم داده هایی که باید از سرور به مرورگر منتقل شود (مثل فشردهسازی محتوا با gzip یا کامپرس کردن عکس ها)
با کش استاتیک یا cache static ما به هر دو خواسته می رسیم و با کش شرطی با ETAGS خواسته دوم حاصل میشود
اهدافی که ما از کش کردن محتوا داریم عبارتند از
1- پایین نگهداشتن لود سرور
2-لود شبکه
3- زمان تاخیر کاربر
به عنوان مثال مرورگر اینترنت اکسپلور برای تاعمل کش با سرور به صورت زیر ارسال هدر دارد
Pragma:
no-cacheبا این هدر مرورگر به سرور می فهماند که تمایلی به استفاده از کش موجود ندارد و ترجیح می دهد از نسخه سرور استفاده کند (این هدر با ctrl+F5 ایجاد می شود)
If-Modified-Since:
datetimeمرورگر منتظر پاسخ سرور است که آیا از این تاریخ فایل تغییر داشته است یا خیر
If-None-Match:
etagvalueمرورگر به سرور اعلام می کند مشخصه فایل(ETAG) که من در اختیار دارم به صورت زیر است اگر نسخه جدیدتری داری اطلاع بده
هر دو هدر If-Modified-Since یا If-None-Match حالت کش شرطی را به وجود می آورند
در حالت کش استاتیک ارسال هدر از هیچ نوع را نداریم
در حالت شرطی سرور یا مجددا فایل را با کد 200 ارسال می کند و یا تنها هدر 304 را بصورت زیر می فرستد
HTTP/304 Not Modified
حال با این مقدمه برویم سر اصل مبحث یعنی
بررسی دقیق Cache-Control در کش شرطی
در حالت شرطی ما هدری داریم به نام Cache-Control
که انتخاب های (یکی یا برخی ) زیر را برای آن داریم
no-store, no-cache, must-revalidate, pre-check, post-check
حالت no-store به معنی این است که مرورگر کش نمی کند
no-cache به معنی این است که مرورگر کش می کند ولی تغییرات را با هربار رفرش جویاست
must-revalidate به معنی لازم اجرا دانستن سوال از سرور برای کش است
و اما دو حالت دیگر یعنی pre-check, post-check ویژه اینترنت اکسپلور هست
post-check یعنی تا این زمان نیازی به استعلام برای تغییر کش نیست
pre-check یعنی تا قبل از این زمان حتما از تغییر نکردن کش مطمئن شو
مثلا اینطور می شود گفت که با کد زیر
Control: post-check=10; pre-check=120
مکالمه مرورگر با سرور اینگونه است که
تا ثانیه 10 ام که هیچ مکالمه ای انجام نمی شود و مانند کش استاتیک برخورد می شود
از ثانیه 10 تا 120 برای کش سوال میشود
بعد از ثانیه 120 کش منقضی است و مرورگر وجود آن را نادید می گیرد
با این توضیحات معلوم میشود که pre-check شباهت بسیاری به max-age دارد
با این تفاوت که ie تا زمانیکه به زمان post-check نرسیده باشد از هدر استفاده نمی کند (کش استاتیک)
این دو حتما باید با هم مقدار دهی شوند و در صورتیکه یکی از آنها مقدار دهی نشود خطا می باشد
مقدار داده شده عدد و به معنای ثانیه است مثلا عدد 60 یعنی یک دقیقه
اگر هر دو صفر باشند هیچکدام در نظر گرفته نمی شوند
post-check همیشه باید کوچکتر یا مساوی با pre-check باشد در غیر اینصورت خطا است
اگر post-check صفر باشد و pre-check عددی بزرگتر از صفر باشد تنها اتفاقی که می افتد محتوای صفحه دوبار دانلود می شود
پس اگر می خواهید بدون دلیل صفحه اتان دو بار در مرورگر بار گذاری شود از کد زیر استفاده نمایید
Control: post-check=0; pre-check=1
اما حالت منطقی این است که همیشه به post-check عددی بدهید که موجب دانلود بی دلیل صفحه در هربار نشود مثلا می توانید 10 بدهید
مطلب برداشت آزادی بود از مطلب:
Internet Explorer"s Cache-Control Extensions