PDA

View Full Version : سوال: مشکل با کش کردن فایلهای JS و CSS



idocsidocs
سه شنبه 14 تیر 1390, 01:45 صبح
من از کدهای زیر برای کش کردن استفاده می کنم. وقتی با فایرباگ تعداد درخواستهای اچ تی تی پی و فایلهای گرفته شده از سرور رو چک می کنم، می بینم که فایلهای سی اس اس و جاوا اسکریپت کش نشدن و با هر درخواست باید این فایلها از سرور دریافت بشن.

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

بنظرتون مشکل چیه؟


<ifModule mod_headers.c>
<filesMatch "\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
<filesMatch "\.(css)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
<filesMatch "\.(js)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
</ifModule>

AMIBCT
سه شنبه 14 تیر 1390, 11:55 صبح
شما در سمت مرورگر بايد بررسي كنيد كه چه سرآمدهاي ديگه‌اي از سمت سرور براتون ارسال شده
ممكنه سرآمد ديگه‌اي اين رو نقض مي‌كنه

و در نهايت فراموش نكنيد كه تصميم‌گيري نهايي با مرورگر هست
و ممكنه خيلي موارد ديگه رو در نظر داشته باشه

مثلا ممكنه يه مرورگر تعداد دفعاتي كه يه فايل رو درخواست كرده و محتواي متفاوت دريافت كرده رو نگهداري كنه
يا ده‌ها نكته‌ي ديگه...

idocsidocs
سه شنبه 14 تیر 1390, 13:21 عصر
شما در سمت مرورگر بايد بررسي كنيد كه چه سرآمدهاي ديگه‌اي از سمت سرور براتون ارسال شده
ممكنه سرآمد ديگه‌اي اين رو نقض مي‌كنه

و در نهايت فراموش نكنيد كه تصميم‌گيري نهايي با مرورگر هست
و ممكنه خيلي موارد ديگه رو در نظر داشته باشه

مثلا ممكنه يه مرورگر تعداد دفعاتي كه يه فايل رو درخواست كرده و محتواي متفاوت دريافت كرده رو نگهداري كنه
يا ده‌ها نكته‌ي ديگه...
خروجی فایرباگ برای یه فایل سی اس اس رو در ادامه قرار دادم.



Request Headers
Date Tue, 05 Jul 2011 08:59:47 GMT
Server Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i mod_autoindex_color PHP/5.2.8
Accept-Ranges bytes
Content-Length 16155
Cache-Control max-age=2592000, public
Expires Tue, 12 Jul 2011 08:59:47 GMT
Content-Type text/css

Request Headers

Host localhost
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Accept text/css,*/*;q=0.1
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Referer http://localhost/admin/main
Cookie PHPSESSID=76151f390d12599a4414bcb8f107b450

کد زیر هم مربوط به اطلاعات هدر هست. بنظرتون مشکل چیه؟


Last Modified Tue Jul 05 2011 13:29:47 GMT+0430 (Iran Standard Time)
Last Fetched Tue Jul 05 2011 13:31:35 GMT+0430 (Iran Standard Time)
Expires Thu Aug 04 2011 13:29:47 GMT+0430 (Iran Standard Time)
Data Size 16155
Fetch Count 301
Device disk

AMIBCT
سه شنبه 14 تیر 1390, 15:22 عصر
مواردي كه اينجا به ذهن من مي‌رسه

نبودن Last-Modified در پاسخ سرور هست
شايد هم اجرا از روي localhost باعث شده كه مرورگر قوانين رو رعايت نكنه و همه رو دريافت كنه( حدس زده كه در حال برنامه‌نويسي هستيد و داريد فايل‌ها رو تغيير مي‌ديد )
شايد هم تعداد بالاي درخواست ( ۳۰۱ ) و تغييرات زياد بين اين دريافت‌ها علت باشه

براي دونستن دقيق بايد سورس فايرفاكس رو بررسي كرد

رضا قربانی
سه شنبه 14 تیر 1390, 15:40 عصر
<ifModule mod_headers.c>
<filesMatch "\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
<filesMatch "\.(css)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
<filesMatch "\.(js)$">
Header set Cache-Control "max-age=216000, private"
</filesMatch>
<filesMatch "\.(x?html?|php)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</filesMatch>
</ifModule>

AMIBCT
سه شنبه 14 تیر 1390, 15:54 عصر
ممكنه بفرماييد اينا الان قراره چي كار بكنن و چه ارتباطي به مشكل دوستمون دارن؟

eshpilen
سه شنبه 14 تیر 1390, 16:05 عصر
اینا رو هم به htaccess اضافه کن ببین درست میشه یا نه:

<ifModule mod_headers.c>
Header unset ETag
</ifModule>
<ifModule mod_headers.c>
Header unset Last-Modified
</ifModule>


منبع: http://barnamenevis.org/showthread.php?289488

idocsidocs
سه شنبه 14 تیر 1390, 16:17 عصر
مواردي كه اينجا به ذهن من مي‌رسه

نبودن Last-Modified در پاسخ سرور هست
شايد هم اجرا از روي localhost باعث شده كه مرورگر قوانين رو رعايت نكنه و همه رو دريافت كنه( حدس زده كه در حال برنامه‌نويسي هستيد و داريد فايل‌ها رو تغيير مي‌ديد )
شايد هم تعداد بالاي درخواست ( ۳۰۱ ) و تغييرات زياد بين اين دريافت‌ها علت باشه

براي دونستن دقيق بايد سورس فايرفاكس رو بررسي كرد
توی خروجی فایر باگ عبارت زیر وجود داره و این یعنی Last-Modified تنظیم شده هست.

Last Modified Tue Jul 05 2011 13:29:47 GMT+0430 (Iran Standard Time)
روی سرور هم تست کردم و روی سرور هم همین مشکل وجود داشت.
در مورد مطلب آخرتون هم باید بگم که توی بعضی از درخواستها کد 301 وجود داره و تعداد این نوع کد زیاد نیست.

چیز دیگه ای به نظرتون نمی رسه؟

idocsidocs
سه شنبه 14 تیر 1390, 16:21 عصر
اینا رو هم به htaccess اضافه کن ببین درست میشه یا نه:

<ifModule mod_headers.c>
Header unset ETag
</ifModule>
<ifModule mod_headers.c>
Header unset Last-Modified
</ifModule>


منبع: http://barnamenevis.org/showthread.php?289488
این دستورها رو توی htaccess استفاده کردم ولی برای اینکه تاپک شلوغ نشده، توی سوال این دستورها رو بکار نبردم.
چیز دیگه ای به ذهنتون نمی رسه؟

لطفا توجه کنید که تصاویر کش می شن و فقط یک بار از سرور دریافت می شن اما فایلهای جاوااسکریپت و تصاویر در هر درخواست از سرور مجددا باید دریافت و بارگزاری بشن.

رضا قربانی
سه شنبه 14 تیر 1390, 19:05 عصر
ممكنه بفرماييد اينا الان قراره چي كار بكنن و چه ارتباطي به مشكل دوستمون دارن؟

عزیز جان این رو دادم تا با این رو هم تست کنن max-age ها فرق می کنه

idocsidocs
چهارشنبه 15 تیر 1390, 00:33 صبح
عزیز جان این رو دادم تا با این رو هم تست کنن max-age ها فرق می کنه
شما با استفاده از فایرباگ چک کنید ببینید این مشکل که برای من پیش اومده، برای شما هم بوجود می یاد یا نه. چون ظاهرا هر دو از یک نوع کد استفاده می کنیم.

رضا قربانی
چهارشنبه 15 تیر 1390, 01:33 صبح
شما با استفاده از فایرباگ چک کنید ببینید این مشکل که برای من پیش اومده، برای شما هم بوجود می یاد یا نه. چون ظاهرا هر دو از یک نوع کد استفاده می کنیم.
من مشکلی ندارم

AMIBCT
چهارشنبه 15 تیر 1390, 08:29 صبح
دوست عزيز
روي سرور خودم آزمايش كردم
تمام فايل‌ها غير از برگ اصلي از Cache خونده مي‌شن

و همون طور كه در پست قبلي حدس زده بودم تفاوت سرآمد پاسخ در سرور من با سرور شما
وجود Last-Modified هست كه در سرور شما وجود نداره

مشكل شما قطعا با اضافه شدن اين متغير حل خواهد شد

idocsidocs
چهارشنبه 15 تیر 1390, 11:46 صبح
دوست عزيز
روي سرور خودم آزمايش كردم
تمام فايل‌ها غير از برگ اصلي از Cache خونده مي‌شن

و همون طور كه در پست قبلي حدس زده بودم تفاوت سرآمد پاسخ در سرور من با سرور شما
وجود Last-Modified هست كه در سرور شما وجود نداره

مشكل شما قطعا با اضافه شدن اين متغير حل خواهد شد
لطفا بگید که چطور باید Last-Modified رو به هدرهام اضافه کنم؟

اگه امکان داره کدی که برای عملیات کش کردن فایلها توی htaccess به کار می برید رو در اینجا قرار بدید.

idocsidocs
چهارشنبه 15 تیر 1390, 11:53 صبح
من مشکلی ندارم
اگر امکانش هست همه کدهای مربوط به کش کردن و فشرده کردن اطلاعاتتون که توی htaccess رار می دید برام ارسال کنید.

رضا قربانی
چهارشنبه 15 تیر 1390, 13:04 عصر
عزیز جان بچه ها عرض کردن


کل کدت رو داخل فایل اچ تی اکسز ضمیمه کن تا واست درست کنم

رضا قربانی
چهارشنبه 15 تیر 1390, 13:06 عصر
این کد ها رو بعد از تمامی کدهای اچ تی اکسز اضافه کن . آخر آخر


# BEGIN Turn ETags Off
<ifModule mod_headers.c>
Header unset ETag
</ifModule>
FileETag None
# END Turn ETags Off

# BEGIN Remove Last-Modified Header
<ifModule mod_headers.c>
Header unset Last-Modified
</ifModule>
# END Remove Last-Modified Header

AMIBCT
چهارشنبه 15 تیر 1390, 13:11 عصر
من چيزي در htaccess اضافه نكردم

سرور من خودش تنظيمات پيش‌فرض براي اين كار رو داشته.

به نظر سرور شما يا خود شما كاري انجام داديد كه اين متغير حذف شده
اين دستورات رو به فايلتون اضافه كنيد
اگه مشكل حل نشد با سرور تماس بگيريد و از اونا بخواهيدكه مشكل رو حل كنن


CacheDefaultExpire 86400
CacheIgnoreCacheControl On

idocsidocs
چهارشنبه 15 تیر 1390, 13:43 عصر
من چيزي در htaccess اضافه نكردم

سرور من خودش تنظيمات پيش‌فرض براي اين كار رو داشته.

به نظر سرور شما يا خود شما كاري انجام داديد كه اين متغير حذف شده
اين دستورات رو به فايلتون اضافه كنيد
اگه مشكل حل نشد با سرور تماس بگيريد و از اونا بخواهيدكه مشكل رو حل كنن


CacheDefaultExpire 86400
CacheIgnoreCacheControl On
من از لوکال هاست استفاده می کنم.
بنظرتون این کد می تونه با عث این مشکل بشه؟

<ifModule mod_headers.c>
Header unset Last-Modified
</ifModule>

idocsidocs
چهارشنبه 15 تیر 1390, 13:54 عصر
دوستان من کدهای فایل htaccess رو توی این تاپک قرار دادم، لطفا بحث رو از اونجا ادامه بدید (http://barnamenevis.org/showthread.php?294498) تا بتونم مشکل رو حل کنیم.

AMIBCT
چهارشنبه 15 تیر 1390, 14:30 عصر
مرورگر براي اينكه بفهمه يه فايل رو از Cache بخونه يه طوري بايد بفهمه كه اين فايل روي سرور تغيير نكرده

چند تا متغير براي اين تشخيص نياز هستن:
Last-Modified
ETag كه حالت پيشرفته‌تر متغير بالايي هست
Cache-Control
Expires
Cache-Control

هر كدوم از اين متغيرها معناي خاصي دارن و بايد باشن

دستور unset به صورت صريح يكي از اين سرآمدها رو حذف مي‌كنه

idocsidocs
چهارشنبه 15 تیر 1390, 17:09 عصر
مرورگر براي اينكه بفهمه يه فايل رو از Cache بخونه يه طوري بايد بفهمه كه اين فايل روي سرور تغيير نكرده

چند تا متغير براي اين تشخيص نياز هستن:
Last-Modified
ETag كه حالت پيشرفته‌تر متغير بالايي هست
Cache-Control
Expires
Cache-Control

هر كدوم از اين متغيرها معناي خاصي دارن و بايد باشن

دستور unset به صورت صريح يكي از اين سرآمدها رو حذف مي‌كنه
من کدهای کامل رو تو این پست قرار دادم. لطفا یه نگاه به این پست بکنید (http://barnamenevis.org/showthread.php?294498) و بگید که مشکل چیه؟

AMIBCT
چهارشنبه 15 تیر 1390, 19:55 عصر
اول که اون unset های آخر فایل رو بردارید

تا اونجا اگه همچین سرآمدی هم تولید شده باشه با اون دستورها حذف می‌شه

بعدش هم من حدس می‌زنم اشکال از ExpiresByType باشه
با آزمون و خطا خودتون بررسی کنید که کدوم دستور داره مشکل رو ایجاد می‌کنه

حتی می‌تونید تمام دستورات رو حذف کنید و بررسی کنید که آیا اصلا Last-Modified به مرورگر ارسال می‌شه یا نه...

idocsidocs
چهارشنبه 15 تیر 1390, 20:29 عصر
اول که اون unset های آخر فایل رو بردارید

تا اونجا اگه همچین سرآمدی هم تولید شده باشه با اون دستورها حذف می‌شه

بعدش هم من حدس می‌زنم اشکال از ExpiresByType باشه
با آزمون و خطا خودتون بررسی کنید که کدوم دستور داره مشکل رو ایجاد می‌کنه

حتی می‌تونید تمام دستورات رو حذف کنید و بررسی کنید که آیا اصلا Last-Modified به مرورگر ارسال می‌شه یا نه...
آزمون و خطا فایده نداشت ولی وقتی همه کدهای مربوط به کش کردن رو حذف کردم، هیچ تاثیری روی کار نداشت.

یعنی تصاویر کش می شدن ولی فایلهای سی اس اس و جاوا اسکریپت بدون کش شدن، از سرور درخواست می شدن.

من الان دارم از XAMPP استفاده می کنم و سایت رو روی لوکال هاست تست می کنم. بنظرتون مشکل چیه؟

AMIBCT
پنج شنبه 16 تیر 1390, 08:44 صبح
حتما توي تنظيمات XAMPP چيزي هست كه اين سرآمدها رو حذف مي‌كنه

حداقل يا ETag يا Last-Modified بايد در سرآمد باشه تا مرورگر بتونه تغييرات رو تشخيص بده

idocsidocs
پنج شنبه 16 تیر 1390, 10:57 صبح
حتما توي تنظيمات XAMPP چيزي هست كه اين سرآمدها رو حذف مي‌كنه

حداقل يا ETag يا Last-Modified بايد در سرآمد باشه تا مرورگر بتونه تغييرات رو تشخيص بده
من روی سرور هم تست کردم و همین مشکل وجود داشت، راهی بنظرتون نمی رسه؟

AMIBCT
پنج شنبه 16 تیر 1390, 11:13 صبح
من هم روي سرور و هم در سرور محلي مشكلي ندارم

راه حل بررسي تنظيمات سرور هست
من كه علم غيب ندارم توي تنظيمات سرور شما چي نوشته !

idocsidocs
پنج شنبه 16 تیر 1390, 20:47 عصر
من هم روي سرور و هم در سرور محلي مشكلي ندارم

راه حل بررسي تنظيمات سرور هست
من كه علم غيب ندارم توي تنظيمات سرور شما چي نوشته !
نمی دونید که چه تنظیماتی باید وجود داشته با شه تا امکان کش کردن فایلها وجود داشته باشه؟

AMIBCT
پنج شنبه 16 تیر 1390, 22:49 عصر
باید دنبال چیزی باشید که Cache رو خراب کرده
نه چیزی که Cache رو ایجاد کنه

من روی سیستم خودم Apache و php رو دستی نصب کردم ( بدون استفاده از بسته‌های آماده )
و تنظیمات پیش‌فرض طوری هست که بدون مشکل بهترین نتیجه حاصل می‌شه