چگونه از شر Cache Server لعنتی آسوده شویم؟ یا من چگونه Cache Server را کشتم؟

اگر طراح وب باشید حتما با مشکلاتی که Cache Serverها درست می‏کنند درگیر شده‏اید. دارید روی یک پروژه وب کار می‏کنید. همه تغییرات را در کامپیوتر محلی خودتان انجام می‏دهید و آماده فرستادن تغییرات می‏شوید. Style.css، تصاویر و فایلهای دیگر خود را می‏فرستید و سپس با خیال آسوده می‏خواهید بروید نتیجه را آنلاین ببینید. F5 را می‏زنید گررررررر تغییرات جدید نشان داده نمی‏شود. Ctrl + F5 را می‏زنید. افاقه نمی‏کند. Cache مرورگر را خالی می‏کنید. باز هم افاقه نمی‏کند. از یک مرورگر دیگر استفاده می‏کنید. باز هم، همان نسخه پیشین نشان داده می‏شود.
و این جاست که بر پدر و مادر تمامی کسانی که Cache Server را ساخته‏اند، درود می‏فرستید.

Cache Server چیست و چرا مشکل ایجاد می‏کند؟

Cache Server خدمات‏دهنده‏ای است که در مراکز خدمات‏دهنده اینترنت نصب شده و صفحات وب یا فایلهای جانبی صفحات وب را بر روی خود ذخیره می‏کند تا در صورت درخواستِ دوباره کاربران به مشاهده آن صفحات، آنها را دوباره از سرور اصلی بارگزاری نکرده و آنها را از محل ذخیره خود برای کاربر بفرستد تا سبب کاهش هزینه پهنای باند گردد.
Cache Serverها بر پایه این اصل بنا شده‏اند که چند کاربر ممکن است نیاز به مشاهده پایگاهها یا منابع یکسان داشته باشند (برای نمونه ممکن است 30% کاربران یک خدمات‏دهنده اینترنت، سایتهای یکسانی را مشاهده می‏کنند؛ برای نمونه یک سایت خبری یا یک سایت عمومی)
Cache Server اولین تقاضایی که برای مشاهده یک سایت (برای نمونه isna.ir) شد را در خود ذخیره می‏کنند. از این به بعد هر کاربر دیگری که مایل به دیدن این صفحه باشد، نسخه ذخیره شده بر روی Cache Server را دریافت کرده و دوباره سایت از سرور اصلی دریافت نمی‏شود.

اگر چه باید گفت که Cache Server مکانیزم‏هایی برای تشخیص ایجاد تغییر در نسخه ذخیره شده بر روی سرور خود و نسخه اصلی روی سرور را دارند؛ ولی در هنگام طراحی یک سایت، این مکانیزم‏ها به درستی پاسخ نمی‏دهد. زیرا تغییراتی که طراح در سایت می‏دهد لحظه به لحظه است و Cache Server این احتمال را نمی‏دهد که این سایت به این سرعت تغییر کرده باشد، بنابراین فایلهای style.css و فایلهای تصویری را که در درون خود ذخیره کرده است (که قدیمی بوده و نسخه‏های جدیدی که شما به تازگی ارسالی کرده‏اید را شامل نمی‏شود) را برای کاربر می‏فرستد و از این رو شما تغییرات انجام شده خود را نمی‏بینید.

شاید برایتان این پرسش پیش بیاید که چرا سرویس‏دهندگان خدمات وب Cache Server نصب می‏کنند؟ پاسخ ساده است، خدمات‏دهندگان اینترنت برای پهنای باند هزینه می‏کنند و از این طریق می‏توانند سبب کاهش هزینه‏های خود در زمینه پهنای باند باشند.

با کدام Cache Server می‏جنگیم؟

باید بدانیم که ما همیشه با توجه به اینترنتی که از آن استفاده می‏کنیم با چند Cache Server برابر هستیم. برای نمونه اگر در سازمان شما اینترنت از طریق ISA Server برای کاربران Share شده باشد و Cache Server در آن فعال شده باشد، در این صورت شما در نخستین گام با Cache Server داخلی سازمان خود برابر هستید. همچنین اگر سازمان شما از سرویس‏دهنده اینترنت x سرویس گرفته باشد و این سرویس‏دهنده اینترنت، Cache Server نصب کرده باشد یا شاید حتی ماژول سخت‏افزاری Cache داشته باشد، شما در گام دوم با Cache Server سرویس‏دهنده خود برابر هستید.

همچنین همه می‏دانیم که همه مرورگها نیز به نوعی دارای یک Cache Server هستند که فایلها را در آن ذخیره می‏کنند. این Cache Server در IE با نام Temporary Internet Files و در FireFox با نام Browsing History شناخته می‏شود.

راههای مبارزه با Cache Server

  • استفاده از کلید Ctrl + F5: این راه تنها به درد مبارزه با Cache Server مرورگر می‏خورد. در واقع شما به جای این که هر بار Cache مرورگر را خالی کنید، می‏توانید با زدن کلید Ctrl + F5 از مرورگر بخواهید که فایلها را دوباره از خدمات‏دهنده اینترنت دریافت کند. این راه برای مبارزه با Cache Server خدمات‏دهنده اینترنت کارا نیست.
  • فریب Cache Server با تغییر ظاهری URL: برخی پیشنهاد می‏کنند که با حذف www یا اضافه کردن چند کاراکتر Slash الکی در پایان آدرس Cache Server را فریب داد. یعنی اگر دفعه اول سایت خود را به صورت http://www.sample.com دیده‏اید این بار به صورت http://sample.com یا به صورت http://sample.com/// ببینید. زیرا هر بار Cache Server فکر می‏کند که با سایت تازه‏ای روبرو است و از این رو سایت را دوباره از سرور اصلی دریافت می‏کند. اما این روش با Cache Serverهای پیشرفته امروزی جواب نمی‏دهد. به عبارت دیگر Cache Serverهای امروزی (برای نمونه در Cache Server موجود در ISA Server همه آدرسهای بالا یکسان هستند) افزون بر این، حتی اگر Cache Server این دو آدرس را یکسان تشخیص ندهد، باز یک مشکل اساسی باقی است. منابعی که در صفحات شما به کار رفته است (برای نمونه یک فایل CSS) هنوز با آدرس پیش‏فرضی که شما آنجا نوشته‏اید فراخوانی می‏شود و باز هم Cache Server جلوی آن را می‏گیرد.
  • استفاده از فی.لت.ر شکن: این روش اگر چه پاسخ می‏دهد ولی یک مشکل اساسی دارد. سرویس‏دهنده از این به بعد آدرسی صفحه‏ای را که فی.لت.رشکن دریافت کرده است Cache می‏کند و باز روز از نو روزی از نو.
  • استفاده از دامین جایگزین: برخی پیشنهاد می‏کنند که از دامینهای جایگزین استفاده شود. این روش نیز چندان عملی نیست. مگر سایت ما چند تا دامین جایگزین دارد؟ بالاخره آنها هم Cache می‏شوند و سایت ما این وسط گرفتار می‏ماند.
  • تنظیم Cache-Cotnrol در HTML به صورت زیر:
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

این روش هم پاسخ نمی‏دهد؛ زیرا بیشتر Cache Serverها جوری تنظیم شده‏اند که به این Tag اهمیتی نمی‏دهند. در واقع تمام اینترنتهای متخلفی که من در این چند سال در ایران دیده‏ام به این تگ کاملا بی‏اهمیت هستند.

بهترین و عملی‏ترین راه برای مبارزه با Cache Server چیست؟


روند کار Cache Serverها این گونه است:
1- کاربری درخواست دیدن سایت http://isna.ir را کرده است. اگر این سایت در Cache هست برو به 2 و اگر نیست برو به 3.
2- صفحه http://isna.ir را از روی Cache Server برای کاربر بفرست. برو به 4.
3- صفحه http://isna.ir را از روی سرور اصلی دریافت کن و آن را در Cache Serve ذخیره کن تا وقتی که کاربر بعدی یا همین کاربر در بار دوم درخواست دیدن این صفحه را کرد، از Cache Server برای او فرستاده شود.
4- پایان

خوب با توجه به این که بر اساس پروتوکل HTTP به همراه هر درخواستی می‏توان یک Query String فرستاد، آدرس http://sample.com/index.php?keyword=iran و http://sample.com/index.php?keword=qom دو نشانی متفاوت به حساب می‏آیند؛ اگر چه هر دو در حال بارگزاری یک فایل مشترک (index.php) هستند. Cache Server هم این دو نشانی را یکسان در نظر نگرفته و هر دو را مجددا از روی سرور بارگزاری می‏کند. بر این اساس دو نشانی http://sample.com/style.css?q=1 با http://sample.com/style.css?q=2 متفاوت است، اگر چه هر دو در واقع از یک فایل استفاده می‏کنند.

برای همین من برای جلوگیری از Cache شدن فایل Style.css از کدی شبیه به این استفاده می‏کنم تا هر بار یک عدد Random تولید شده و Cache Server گول بخورد. (:

<link rel=stylesheet href="http://sample.com/style.css <?php echo "?q=".mt_rand(1, 1000000) ?>" type="text/css">

شما همین طور برای جلوگیری از Cache شدن فایل HTMLتان می‏تواند پس از فایل HTML یک Query String الکی وارد کنید و این طوری بود که من توانستم Cache Server را بکشم.

توجه داشته باشید که وقتی Development سایتتان تمام شد و دیگر نخواستید تغییری انجام دهید، حتما این مکانیزم را از صفحاتتان حذف کنید. زیرا Cache Server با همه معایبی که برای طراحان وب دارد، در نهایت سبب افزایش سرعت صفحات برای کاربران نهایی هم خواهده شد. زیرا صفحات از سرور محلی کاربر برای او فرستاده می‏شود که زمان کمتری نسبت به بارگزاری صفحات از سرور اصلی می‏برد.

تصویر سجاد

سلام
من این کدی که شما قرار داده بودید رو توی فایل index خودم قرار دادم ولی نشد
بی زحمت یه راهنمایی .......

تصویر Silverboy

این cache server واقعا 2 روز منو تلف کرد .... تا فهمیدم مشکل از کجاست !!

تصویر امیرحسین

جالب بود!
من با اینکه تا حالا با Server Cache مشکلی نداشتم ولی اینکه وقتی کوئری تغییر کنه، رفتار سرورها تغییر می کنه ممکنه به درد بخوره!

ممنون

تصویر نيما

عالي بود .

تصویر علی

salam khaste nabashid mikhastam bedonam shoma az sisteme mp4 sar dar miarin mp4 man ghodrate daryafte hichgone filio nadare bayad chekar konam age rahnamayim konid mamnoon misham

تصویر مجید

استفاده از وی پی ان بهترین و ساده ترین راهه!

تصویر شاهزاده احمدی

می‏پذیرم که در تئوری در VPN صفحه‏ای Cache نمی‏شود چون که به احتمال خیلی زیاد سروری که به شما VPN داده است Cache Server نصب نکرده و به دلیل Secure بودن ارتباط، ISPهای میان راه هم اطلاعاتی از محتوای اطلاعات رد و بدل شده پیدا نمی‏کنند که بخواهند آن را Cache کنند. اما مسئله این است که این روش برای من کار نمی‏کند؛ خودم هم نمی‏دانم چرا؟!

تصویر علی

سلام. عالی بود. درد بزرگ برنامه نویسان هست شاید !!! :d

فرستادن دیدگاه تازه

پست الکترونیک شما نمایش داده نشده و به هیچ کسی نیز داده نمی‏شود.