در این مقاله داریم درباره مشکل رایج Specify a cache validator و حل آن در جی تی متریکس صحبت کنیم.
نام: Specify a cache validator
نوع: سرور
اولویت: زیاد
میزان سختی: راحت
میانگین امتیاز: 92%
زمانی که با ارور Specify a cache validator روبه رو میشوید نمایانگر این موضوع است که تنظیمات کش سرور شما به خوبی تنظیم نشده، حال منظور از اینکه کش وب سرور به خوبی تنظیم نشده است را در ادامه خواهیم گفت.
هر سروری که به خوبی تنظیم شده باشد یک سری محتوای هدر HTTP برای کش کردن فایلها سمت کاربران در جهت بهینه سازی سایت ارسال میکند این هدرهای کش اصولا دو عمل اصلی را انجام میدهند، یکی Cache Validate یعنی معتبرسازی فایلهای کش و دیگری Cache Length به معنای طول کش یا مقدار زمان کش است. و هر کدام از این موارد نباشند مشکلاتی برای طراحی سایت (طراحی سایت شرکتی، طراحی سایت فروشگاهی) ایجاد میکنند. در ادامه این عبارات را تشریح میکنیم.
این دو هدر تعیین میکنند که چه مدت یک فایل باید نگه داشته شود و اگر این دو هدر تنظیم نشده باشند خطای Leverage browser caching رخ میدهد و اگر چنین خطایی را دارید میتوانید به کمک این پست رفع کنید. ولی اگر چنین مشکلی ندارید به شکل خلاصه بدانید که در هدر Cache-Control مدت زمان انقضا مشخص میشود به این منظور که یک عدد بر حسب ثانیه برای کش کردن فایل در نظر میگیرد ولی در هدر Expires تاریخ زمان انقضا درج میشود و یک تاریخ مشخص میشود که مثلا تا فعلان تاریخ فایل کش شود. استفاده از هر دو هدر Expires و Cache-Control لازم نیست، ولی حداقل استفاده از یکی در جهت افزایش سرعت سایت لازم و ضروری است ولی اگر هر دو را اضافه کنید جز محکمکاری در جهت کش شدن فایلها کار خاص دیگری نکردهاید ولی به شکل کلی هدر Cache-Control نسبت به هدر Expires اولویت بالاتری دارد. Cache-Control جدیدتر و معمولا این متد توصیه میشود ولی با این حال هنوز برخی سایتهای آنالیز سرعت مثل Gtmetrix هدر Expires را چک میکنند.
دو هدر HTTP داریم که Cache Validate را تعیین میکند Last-Modified و Etag
این دو هدر تعیین میکنند که فایل کش شده برای چه تاریخی و ورژنی است و اگر به خوبی تنظیم نشده باشد خطای Specify a cache validator رخ میدهد. به این نکته توجه داشته باشید که شما فقط فایلهایی را میتوانید رفع خطا کنید که در سرور شما باشد پس اگر فایلی در طراحی سایت شما از طریق یک سرور دیگری لود میشود به علت دسترسی نداشتن به آن سرور و فایل، نمیتوان کاری انجام داد.
ما قرار هست در این پست درباره هدرهایی که Cache Validate را تعیین میکنند صحبت کنیم و همانطور که گفتیم این هدرها نشان میدهد که فایل کش شده چه ورژنی دارد و اخرین ورژن کش شده برای چه تاریخی است، هر دو هدر Last-Modified و Etag چنین عملی را انجام میدهند، به این دو هدر درخواستی اسم دیگری هم دارند و به آنها Conditional requests یا درخواستهای شرطی هم گفته میشود، در ادامه بیشتر در این باره صحبت خواهیم کرد.
مقدار Last-Modified یک تاریخ خاصی را نشان میدهد، Last-Modified تاریخ آخرین ورژن فایل یا تاریخ اخرین ویرایش یک عکس یا صفحه است، همانند کد زیر:
زمانی که فایلی یا صفحهای را تغییر و ویرایش دهید، باید این تغییرات نیز سمت کاربر هم اعمال شود تا به درستی سایت کار کند، بنابراین وقتی کاربر دوباره وارد سایت شما میشود یک درخواست شرطی توسط هدری مجزا با عنوان If-Modified-Since ارسال میکند، مقدار این هدر مجرا از Last-Modified گرفته شده است، هدر If-Modified-Since زمانی که سمت سرور ارسال میشود بررسی میکند تا ببیند آیا تاریخ سمت سرور به روز شده است یا خیر، و منتظر پاسخ وب سرور میشود، اگر پاسخ با کد 200 ارسال شود به معنای جواب مثبت است و تاریخ تغییر کرده است و ولی اگر وب سرور کد 304 یا همان 304 Not Modified را ارسال کند به این معنا است که فایل مورد نظر به روز نشده است و از فایل موجود در کش مرورگر کاربر استفاده شود.
اگر توضیحات قسمت Cache Length را مطالعه کرده باشید اشاره کردیم که هدر Cache-Control
نسبت به هدر Expires
اولویت بالاتری دارد و اگر فرض بگیریم وب سرور در پاسخ به درخواست If-Modified-Since کد 200 را ارسال کند سر انجام تاریخ Last-Modified تغییر خواهد کرد و سر انجام باعث میشود مقادیر دو هدر Cache-Control
و Expires
تغییر کند و فایل جدید با اخرین ویرایش موجود در کش کاربر ذخیره شود.
هدر ETag با اسم کامل Entity Tag به معنای “برچسب هویتی” همانند هدر Last-Modified تغییرات صفحه یا فایل را به مرورگر کاربر اطلاع میدهد، با این تفاوت که به جای تاریخ و زمان آخرین ویرایش صفحه یا فایل از محتوای متنی منحصر به فردی برای هر صفحه یا فایل (مثل یک MD5 Hash) برای شناسایی آن صفحه توسط سرور استفاده میشود
و از طرفی مرورگر کاربر به جای درخواست هدر قبلی If-Modified-Since که در حالت Last-Modified ارسال میکرد این بار هدر مجزایی با عنوان If-None-Match که مقدار آن از هدر ETag گرفته شده است به سمت وب سرور ارسال میکند و دوباره همانند قبل وب سرور با ارسال کد 200 یا 304 تعیین میکند که آیا فایل یا صفحه نیاز به آپدیت شدن در سمت کش کاربر را دارد یا خیر.
نکته: در بخش YSlow سایت GTMetrix خطای (Configure entity tags (ETags موجود است که اشاره به نبودن هدر ETags میکند که با رفع خطای Specify a cache validator آن هم رفع میشود.
برای رفع این ارور باید هدرهای Last-Modified یا Etag یا هر دو با هم از سمت وب سرور ارسال شود، هدر درخواست Last-Modified به شکل کلی از سمت وب سرورها فعال است و نیازی به تنظیمات دستی آن نیست، هدر Etag در وب سرورهای Apache ورژن 2.4 به بالاتر به شکل اتوماتیک فعال است و سمت کاربران این هدر ارسال میشود و در وب سرور NGINX از 2016 به بعد به شکل پیش فرض هدر Etag در آن فعال است.
اول توجه داشته باشید با هاست مناسب از شرکتهای معتبر، بعید است با مشکل Specify a cache validator روبهرو شوید به هر حال با برخورد این خطا به پشتیبانی هاست خود تیکت زده و درخواست دو هدر یا حداقل یک هدر را ارسال کنید، و راه بعدی برای این مشکل رفع خطای Leverage browser caching است، گاهی تنظیمات وب سرور به شکلی است که با رفع ارور Leverage browser caching مشکل موجود در Specify a cache validator هم رفع میشود، و اگر دقت کرده باشید اکثر سایتهای ایرانی برای رفع خطای Specify a cache validator کد مربوط به Leverage browser caching را قرار میدهند.
البته محوریت تمام صحبتهای ما فقط بر روی فایلهایی هست که در هاست خود داریم، اگر شما فایلی را از سایت دیگری در وب خود فراخوانی میکنید و مشکلات این چنینی داشته باشید، دیگر قابل حل نخواهید بود، مگر آن فایلها را حذف کنید.