یکی از خطاهای رایجی که هنگام تست سرعت سایت با GTmetrix بهش بر میخوریم با عنوان Specify a cache validator و Configure entity tags نمایش داده میشه که در بخش Yslow جی تی متریکس نمایش داده میشه و مربوط به کش سرور میشه. فایلهایی که در سرور کش میشن بستگی به نوع کش سرور هم بستگی داره که به چه شکلی بتونه به مرورگر اعلام بکنه که فایلها در حالت کش هستند. یعنی وقتی شما فایلهای یک صفحه که شامل چندین فایل مختلف هست رو کش میکنید، باید از طریق مرورگر به صورت صحیح در بازدیدهای بعدی اعلام کنید که آیا تغییری روی فایلها یا این صفحه که کاربر در اون قرار داره صورت گرفته یا خیر؟ اگر تغییری صورت گرفته مربوط به چی بوده و چه فایلهایی باید از نو از سرور درخواست بشن تا با نسخهای که به صورت کش شده داخل سیستم کاربر قرار داره آپدیت بشن.
در این آموزش قصد دارم به نحوه برطرف کردن خطای Specify a cache validator و Configure entity tags در GTmetrix بپردازم که با استفاده از اون میتونید با ساختار درست کش سرور آشنا شده و به صورت بهینه از کش سرور سایت برای بهبود سرعت سایت استفاده کنید.
هنگام کش شدن چه اتفاقی در سرور رخ میدهد؟
همونطور که در چند مورد از مقالههای آموزش GTmetrix که در مورد کش بودند عنوان کردم، فرآیند کش درخواستی هست که تحت HTTP بین سرور و مرورگر رد و بدل میشه و در اون مشخص میشه که چه فایلهایی برای چه مدتی کش بشن. این مدت زمان کش شدن رو با استفاده از Expires و فرآیندی که در هر بازدید بررسی میکنه ببینه آیا تغییری در فایلها ایجاد شده یا نه رو Cache-Control مشخص میکنه. این دو مورد درواقع درخواستی هستند که در هدر اجرا میشن و در نهایت وضعیت Cache Length رو مشخص میکنند.
Cache Length چیست؟
دو هدر Cache-Control که برای تعیین مدت زمان انقضا مورد استفاده میگیره و بر حسب ثانیه مدت زمانی رو برای انقضا فایلهای کش در نظر میگیره و Expires که برای تعیین تاریخ انقضا هست و بر اساس یک زمان دقیق انتخاب میشه، مشخص میکنند که یک فایل باید چه مدت زمانی به عنوان کش در مرورگر نگهداری بشه و اگه این وضعیت رو مشخص نکنید با خطای Leverage browser caching مواجه میشید. استفاده از این دو درخواست در هدر ضروری نیست، اما حتما باید حداقل از یکی از اینها استفاده کنید تا وضعیت کش رو در سرور برای مرورگر مشخص کنید. استفاده از هر دو گزینه هم میتونه مفید باشه و در جهت بهبود سرعت سایت یک گام جلوتر بردارید.
Cache Validate چیست؟
بعد از اینکه وضعیت Cache Length توسط دو درخواست هدر Cache-Control و Expires مشخص شد، حالا باید توسط Cache Validate که اینم توسط دو هدر HTTP با نامهای Last-Modified و Etag مشخص میشه تعیین کنید که فایل کش شده برای چه تاریخ و چه ورژنی هست. اگر این دو مورد هم مشخص نشده باشند در این صورت با خطای Specify a cache validator در GTmetrix «واجه خواهید شد. این دو درخواست رو به عنوان درخواست شرطی میشناسیم که بر اساس یک سری شروط باید وضعیت کش صفحات رو مشخص کنند.
درخواست شرطی Last-Modified
توی این مدل بررسی برای اینکه فایلها و صفحات کش شده آخرین بار چه زمانی تغییر کردن بر اساس یک تاریخ دقیق با استفاده از Last-Modified مشخص میشه و در هدر مرورگر قرار میگیره. بنابراین وقتی وارد یک صفحه از سایت میشید مرورگر ابتدا Last-Modified رو بررسی میکنه که ببینه وضعیت کش به چه صورتی هست و سپس بر اساس پاسخی که براش مشخص میشه، شروع به ادامه لود صفحه با استفاده از فایلهای کش شده یا اینکه درخواست مجدد از سرور(بخاطر تغییر فایلها) میکنه. این درخواست در مرورگر به شکل زیر مشخص خواهد شد.
Last-Modified: Mon, 11 Jan 2017 13:17:22 GMT
حالا که این تاریخ در اولین بازدید به صورت کش شده مشخص شد، در بازدید بعدی کاربر از این صفحه ابتدا درخواستی ارسال میشه که مشخص بکنه این صفحه تغییراتی داشته یا نه. این تغییرات میتونه همون ویرایش محتوای صفحه یا فایلها باشه که با استفاده از Last-Modified مشخص میشه. پس وقتی شما مثلا بعد از 3 روز تغییری در صفحه بدین، مقدار بالا به صورت زیر در هدر مرورگر نمایش داده میشه.
Last-Modified: Mon, 14 Jan 2017 10:55:14 GMT
در این صورت وقتی بازدید کننده وارد سایت میشه ابتدا درخواستی به سرور ارسال میکنه که ببینه صفحه تغییر داشته یا نه. اینجا چون صفحه ما ویرایش شده و تغییراتی رو داشته، در این صورت پاسخ مثبت با کد 200 به مرورگر ارسال میشه و مرورگر میفهمه که این صفحه نسبت به بازدید قبلی که مربوط به سه روز پیش بوده تغییراتی رو به خودش گرفته. بنابراین مجددا فایلهایی که تغییر کردن با نسخه جدید از سرور دانلود و جایگزین میشن و دوباره در کش مرورگر قرار میگیرند. اگر در پاسخ ارسالی صفحه تغییری نکرده باشه به جای کد 200 کد 304 یا 304 Not Modified ارسال خواهد شد.
درخواست شرطی Etag
این درخواست شرطی هم دقیقا مشابه Last-Modified هست، با این تفاوت که در اینجا با تاریخ سر و کار نداریم. در این حالت وضعیت کش توسط قطعه کد هش شده توسط MD5 مشخص خواهد شد. به عنوان مثال در اولین بازدید با استفاده از کد MD5 مشابه نمونه زیر که برای مرورگر قابل خوندن هست مشخص میشه که آخرین تغییرات با این کد هش شده هست.
ETag: "15f0fff99ed5aae4edffdd6496d7131f"
حالا اگه محتوای صفحه رو تغییر بدین و ویرایش کنید در این صورت کد هش شده بالا هم تغییر خواهد کرد و در این صورت مشابه نمونه قبلی توسط کد 200 یا 304 مشخص میشه که صفحه تغییری داشته یا خیر. تفاوتی که در اینجا وجود داره این هست که اگر تغییری صورت نگیره به صورت زیر مشخص خواهد شد.
If-None-Match: "15f0fff99ed5aae4edffdd6496d7131f"
حالا که با انواع هدر cache validator و entity tags آشنا شدید، برای اینکه ارور Specify a cache validator و Configure entity tags رو در جی تی متریکس برطرف کنید، باید هر دو یا حداقل یکی از درخواستهای Last-Modified یا Etag رو از سمت وب سرور برای مرورگر ارسال کنید. معمولا درخواست Last-Modified به صورت عمومی در همه وب سرورها فعال هست و مشکلی از این بابت وجود نخواهد داشت. درخواست Etag هم در سرورهای نوع آپاچی با ورژن بالاتر از 2.4 و برای وب سرور NGINX که از نسخه 2016 به بعد ارائه شده فعال هست که برای این نوع سرورها نیازی به فعال کردن دستی ندارید.
حالا شاید این سوال براتون پیش بیاد که با این شرایط سرور که توضیح داده شد، پس چرا با خطا Specify a cache validator و Configure entity tags مواجه شدید؟
این مورد کاملا به کانفیگ سرور توسط شرکت هاستینگ شما بستگی داره و اگه با دو خطای Specify a cache validator و Configure entity tags در جی تی متریکس مواجه شدید باید از شرکت هاستینگ خودتون بخواین که این وضعیت رو اصلاح بکنند. چرا که شما دسترسی لازم رو برای تغییرات سرور ندارید و تنها در صورتی خودتون میتونید این خطاها رو برطرف کنید که به سرور دسترسی داشته باشید. اگر پاسخی از سمت هاستینگ برای اصلاح این موارد نگرفتید هم باید از هاست شرکت معتبری استفاده کنید که این موارد رو رعایت کرده باشه.
امیدوارم این آموزش هم مورد توجه و پسند شما قرار گرفته باشه و با استفاده از اون تونسته باشید نسبت به رفع خطای Specify a cache validator و Configure entity tags در جی تی متریکس اقدام کنید. در صورتی که در رابطه با این آموزش سوال یا مشکلی داشتید در بخش دیدگاهها اعلام کنید تا در کوتاهترین زمان ممکن پاسخگوی شما باشم.