مشکلات عجیب در به روز نشدن سایت یا ورود و خروج به سایت
در موارد زیادی با مشکلاتی رو به رو می شویم شبیه به این موارد:
- هنگامی که وارد حساب کاربری میشوم و خروج را میزنم از حساب کاربری خارج نمی شود.
- هنگامی که وارد حساب کاربری می شوم بلافاصله از حساب خارج می شوم.
- وقتی محصولی به سایت اضافه میکنم و آن را روی صفحه اصلی هم تنظیم کرده ام ولی سایت به روز نمی شود.
- وقتی با فیلترشکن وارد سایت میشوم محتوای سایت تفاوت می کند.
- وقتی با سیستم دیگری وارد سایت می شوم نام کاربری شخص دیگری را میبینم.
- وقتی تغییراتی در سایت اعمال میکنم این تغییرات برای من نمایش داده نمیشود حتی با پاک کردن کش سایت
بنابراین تصمیم گرفتم تا این مشکل را بررسی کنم و دلیل اصلی این مشکلات را پیدا کنم. از ابتدا تقریبا مطمئن بودم که این مشکلات نمی تواند از پرستاشاپ و به طور کل از CMS باشد، با این حال همه احتمالات را در نظر گرفتم. بنابراین با بررسی تیکت ها و درخواست از کاربران در گروه تلگرامی آی پرستا چند سایت با این مشکلات را پیدا کردم و مشغول بررسی مشکل شدم.
ابتدا با بررسی یک سایت متوجه شدم که از وب سرورهای لایت اسپید استفاده شده و حدس زدم شاید کش لایت اسپید باعث این مشکلات است. اما وقتی سایت های دیگری را با مشکلات مشابه بررسی کردم متوجه شدم مشکلات یکسان در وب سرورهای Apache هم وجود دارد. بنابراین این فرضیه به صورت عام رد شد، هرچند پیشتر مشکلات مشابهی با فعال شدن لایت اسپید در یک فروشگاه اینترنتی را بررسی کرده بودم و معتقدم که لایت اسپید هم ممکن است باعث مشکلات مشابه باشد.
احتمال استفاده از CDN ها از جمله Cloudflair هم با توجه به این که یکی از سایت ها از کلودفلیر استفاده میکردن بررسی شد که مطابق پیش بینی مشخص بود که کلودفلیر روی محتوای استاتیک مانند تصاویر و فایل های CSS یا JS اثرگذار است و در محتوای داینامیک تغییری ایجاد نمی کند.
تصمیم گرفتم Header سایت هایی که دچار مشکل هستند را بررسی و با هدر سایت هایی که دچار مشکل نیستند مقایسه کنم که به محض بررسی Header سایت ها مشکل نمایان شد. مشخص شد که هاستینگ Cache-Control را روی سرور به صورت زیر تنظیم کرده اند:
Response Headers
Cache-Control:max-age=604800
Connection:Keep-Alive
Content-Type:text/html; charset=utf-8
Date:Sat, 20 Jan 2018 20:33:08 GMT
Expires:Sat, 27 Jan 2018 20:33:08 GMT
Keep-Alive:timeout=2, max=99
P3P:CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"
Server:Apache/2
Transfer-Encoding:chunked
Vary:Accept-Encoding,User-Agent
تنظیم Cache-Control:max-age=604800 به این معنی است که به مدت یک هفته کش (حافظه نهان) روی مرورگر کاربر را معتبر میکند و به جای فراخوانی داده ها از وب سایت آن را از نسخه ذخیره شده در حافظه نهان مرورگر نمایش می دهد. به ای ترتیب سایت از حالت زنده خارج شده و از دفعات دوم به بعد از روی مرورگر کاربر لود شده و مشکلات پیش بینی نشده مانند مشکلات ورود و خروج از سایت را به وجود می آورد!
حتی در مواردی مشاهده شد که Cache-Control: public max-age=604800 تنظیم شده که public بودن میتواند سایت را در ISP کش کند و باعث مشکلات عجیب تری مانند لاگین بودن کاربران با نام کاربری افراد دیگر و نمایش اطلاعاتی که فقط برای افرادی خاصی میبایست نمایش داده شود برای همه کاربران است.
آیا این تغییرات استاندارد است؟
می توان از این قابلیت برای برخی صفحات و برخی محتوای استاتیک برای افزایش سرعت نمایش سایت در دفعات دوم به بعد استفاده کرد. اما تنظیم آن به صورت عمومی و روی محتوای داینامیک (متغیر) اشتباه و غیراستاندارد است.
اگر این تنظیم غیر استاندارد است چرا هاستینگ این تغییرات را اعمال می کند؟
شاید به اشتباه این تنظیمات اعمل شده باشد و شاید این کار برای افزایش رضایت شما از سرعت وب سایت باشد، البته به شکل غیرواقعی! در این مورد با پشتیبانی یکی از هاستینگ ها صحبتی داشتم که با توجه به توضیحاتی که دادم، غیراستاندارد بودن آن را رد نکرده ولی از بازگرداندن تنظیمات خودداری کردند. به جای آن اعلام کردند که از طریق فایل htaccess آن را کنترل کنید تا مشکل حل شود.
نمونه ای از پاسخ های هاستینگ که موفق به قانع کردن آن ها نشدم:
کاربر گرامی
احتراما به اطلاع می رساند با توجه به این که کاربران زیادی از این قابلیت در وب سرور در حال استفاده هستند امکان اعمال تغییر در cache-control نمی باشد. با توجه به این که راهکار جهت اعمال تغییرات دلخواه خدمت شما ارائه شده است لطفا برای وبسایت هایی که نیاز به این قابلیت ندارید از قطعه کد htaccess ارائه شده استفاده نمایید.
راه حل چیست؟
اگر هاستینگ تغییرات مورد نظر شما را اعمال نکرد می توانید با افزودن قطعه کدهایی به ابتدای فایل htaccess آن را اصلاح نمایید.
قطعه کد زیر برای محتوای تولید شده توسط فایل php کش را صفر میکند اما برای محتوای ایستا (Static) مثل تصاویر و سایر موارد همچنان کش باقی میماند. این باعث می شود که چنانچه تصویری را تغییر دهید یا فایل های css را ویرایش نمایید تا زمانی که کش مرورگر را پاک نکنید نمی توانید تغییرات را ببینید.
<IfModule mod_headers.c>
<Files *.php> Header set Cache-Control max-age=0
</Files>
</IfModule>
قطعه کد زیر یک قطعه کد کامل تر است که می توانید برای گروهی از فایل های مختلف زمان کش را جداگانه تعیین کنید. توجه کنید که در این قطعه که باید به ابتدای فایل htaccess اضافه کنید زمان کش برای تصاویر حداکثر 2 ساعت تعیین شده. علت آن این است که ممکن است در برخی ماژول ها شما تصاویر را تغییر دهید ولی این تصویر تغییر نکند. به طور مثال بنری را تغییر دهید که تخفیف روز در آن است. اگر احساس میکنید این نکته را رعایت خواهید کرد که تصویری را ویرایش نکنید و همیشه تصویر جدید با نام جدید قرار خواهید داد می توانید مقدار آن را به دلخواه حتی تا 2 هفته افزایش دهید.
<IfModule mod_headers.c>
Header set Connection keep-alive
# Cache-control headers
# no cache
#<filesMatch "*">
Header set Cache-Control "no-cache"
#</filesMatch>
# 2 Hours
<filesMatch ".(jpg|jpeg|png)$">
Header set Cache-Control "max-age=7200"
</filesMatch>
# 2 WEEKS
<filesMatch ".(ico|pdf|flv|gif|js|swf)$">
Header set Cache-Control "max-age=1209600"
</filesMatch>
# 1 DAY
<filesMatch ".(css)$">
Header set Cache-Control "max-age=86400, must-revalidate"
</filesMatch>
# 2 DAYS
<filesMatch ".(xml|txt)$">
Header set Cache-Control "max-age=172800, must-revalidate"
</filesMatch>
# 1 HOURS
<filesMatch ".(html|htm)$">
Header set Cache-Control "max-age=3600, must-revalidate"
</filesMatch>
</IfModule>