PDA

View Full Version : سوال: چرا کدهای مربوط به کش که توی htaccess استفاده می کنم، به خوبی کار نمی کنن؟



i-php-i
دوشنبه 09 خرداد 1390, 18:28 عصر
من برای کش کردن و فشرده کردن فایلها توسط htaccess از کدهای زیر استفاده می کنم.
وقتی یه فایل کش می شه، مرورگر نباید اون فایل رو مجددا از سرور درخواست کنه. اما وقتی من محتویات فایلهای روی سرور رو عوض می کنم، ظاهر وب سایت هم با توجه به این تغییرات عوض می شه ! در صورتی که فایلها کش شده هستن و نباید محتویات سایت تغییری پیدا کنه.

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


# BEGIN Compress text files
<ifModule mod_deflate.c>
<filesMatch "\.(css|js|x?html?)$">
SetOutputFilter DEFLATE
</filesMatch>
</ifModule>
# END Compress text files

# BEGIN Expire headers
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 216000 seconds"
ExpiresByType application/javascript "access plus 216000 seconds"
ExpiresByType application/x-javascript "access plus 216000 seconds"
ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>
# END Expire headers

# BEGIN Cache-Control Headers
<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?)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</filesMatch>
</ifModule>
# END Cache-Control Headers

# 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

eshpilen
دوشنبه 09 خرداد 1390, 20:19 عصر
دقیقا محتویات کدوم فایلها رو تغییر میدی؟
مرورگرت چیه چه نسخه ای؟
منبع این کدهایی که استفاده میکنی رو هم بده.

i-php-i
دوشنبه 09 خرداد 1390, 20:36 عصر
دقیقا محتویات کدوم فایلها رو تغییر میدی؟
مرورگرت چیه چه نسخه ای؟
منبع این کدهایی که استفاده میکنی رو هم بده.
توی نت سرچ کرده بودم و الان منبع دقیقشون رو ندارم. فکر کنم از انجمن برنامه نویس پیدا کرده بودمشون.

فایلهای سی اس اس و جاوا اسکریپت رو تغییر می دم. عکسها رو هم عوض می کنم ولی ظاهرا هیچ فایلی کش نمی شه.

روی همه مروگرها تست کردم ولی ظاهرا مشکل از کدها هست.

eshpilen
دوشنبه 09 خرداد 1390, 20:47 عصر
شاید سرویس دهندهء وب شما ماجول های لازم رو لود نکرده.
همونطور که از اون دستورات شرطی مشخص هست برای کار کردن این دستورها نیاز به دو ماجول آپاچی بنام mod_expires و mod_headers هست.
احتمالا از خروجی تابع phpinfo بتونی برای این قضیه کمک بگیری. بنظرم باید در قسمت Loaded Modules دنبال این ماجولها بگردی.

i-php-i
سه شنبه 10 خرداد 1390, 00:51 صبح
شاید سرویس دهندهء وب شما ماجول های لازم رو لود نکرده.
همونطور که از اون دستورات شرطی مشخص هست برای کار کردن این دستورها نیاز به دو ماجول آپاچی بنام mod_expires و mod_headers هست.
احتمالا از خروجی تابع phpinfo بتونی برای این قضیه کمک بگیری. بنظرم باید در قسمت Loaded Modules دنبال این ماجولها بگردی.
من از XAMPP استفاده می کنم.

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

نظرتون چیه؟

eshpilen
سه شنبه 10 خرداد 1390, 01:04 صبح
از کجا میدونی فعال هستن؟
بعدم گفتی XAMPP؟
یعنی همهء اینا رو روی لوکال تست کردی؟
روی اینترنت تست نکردی؟
بنظرم لوکال فرق میکنه ها.

i-php-i
سه شنبه 10 خرداد 1390, 02:06 صبح
از کجا میدونی فعال هستن؟
بعدم گفتی XAMPP؟
یعنی همهء اینا رو روی لوکال تست کردی؟
روی اینترنت تست نکردی؟
بنظرم لوکال فرق میکنه ها.

از کجا میدونی فعال هستن؟
از phpinfo استفاده کردم و توی ماجولهای فعال اسم هردو ماجول بود.


بنظرم لوکال فرق میکنه ها

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

شما با این کدها آشنایی ندارید؟

eshpilen
سه شنبه 10 خرداد 1390, 12:51 عصر
یه مقدار بررسی و تست روی این قضیه انجام دادم.
از این برنامه برای تست استفاده کردم:

<?php

$host='localhost';

$file='/test/test.png';

$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$req = "GET $file HTTP/1.1\r\n";
$req .= "Host: $host\r\n";
$req .= "Connection: Close\r\n\r\n";
fwrite($fp, $req);
$resp='';
while (!feof($fp)) $resp.=fgets($fp, 128);
$pos=strpos($resp, "\r\n\r\n");
if($pos==-1) $pos=strpos($resp, "\n\n");
$headers=substr($resp, 0, $pos+1);
echo '<pre>';
echo htmlspecialchars($headers);
echo '</pre>';
fclose($fp);
}
?>
این برنامه فایل مورد نظر رو از هاست مورد نظر میگیره و هدرهای Response (پاسخ) رو نشون میده.
اگر بخواید مطمئن بشید که دستورات مورد نظر درست کار میکنن قدم اول اینه که ببینید هدرهای مورد نظر در پاسخ وجود دارن یا نه. یعنی آیا دستورات htaccess ما عمل میکنن یا نه.
پس شما یک فایل روی لوکال و اینترنت بذار و با این برنامه تست کن که آیا هدرهای مربوطه درست دریافت میشن یا خیر. برای اینکه تشخیصش راحتتر باشه از این دستورات در htaccess استفاده کن:


# BEGIN Compress text files
<ifModule mod_deflate.c>
<filesMatch "\.(css|js|x?html?)$">
SetOutputFilter DEFLATE
</filesMatch>
</ifModule>
# END Compress text files

# BEGIN Expire headers
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 216000 seconds"
ExpiresByType application/javascript "access plus 216000 seconds"
ExpiresByType application/x-javascript "access plus 216000 seconds"
ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>
# END Expire headers

# BEGIN Cache-Control Headers
<ifModule mod_headers.c>
<filesMatch "\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public"
Header set XXXX "%t"
</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?)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</filesMatch>
</ifModule>
# END Cache-Control Headers

# 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


این تنها فرقش با مال خودت اینه که یک هدر بنام XXXX هم به هدرهایی که در پاسخ فایلهای تصویری ارسال میشه اضافه کردم که timestamp رو ارسال میکنه. بنابراین شما باید وقتی برنامه رو اجرا میکنی این هدر رو در خروجی ببینی. بطور مثال این یه نمونه از خروجی من روی لوکال:

HTTP/1.1 200 OK
Date: Tue, 31 May 2011 06:36:09 GMT
Server: Apache/2.2.14 (Win32) PHP/5.3.2
Accept-Ranges: bytes
Content-Length: 32482
Cache-Control: max-age=2592000, public
Expires: Thu, 30 Jun 2011 06:36:09 GMT
XXXX: t=1306823769671875
Connection: close
Content-Type: image/png
اما موضوع دیگری که فکر میکنم میتونه باعث دیده شدن نتایج غیرمنتظره بشه اینه که شما وقتی دکمهء رفرش مرورگر رو کلیک میکنی (یا کلید F5 رو فشار میدی) ممکنه مرورگر سیستم کش رو نادیده بگیره و فایل رو مجددا از سرور درخواست کنه. ظاهرا این معنایی هست که مرورگرها برای رفرش از جانب کاربر قائل هستن. یعنی وقتی کاربر میگه رفرش انگار داره میگه یه نسخهء تر و تازه بهم بده و از کش استفاده نکن!
وقتی شما بجای رفرش کردن مثلا دکمهء Enter رو در آدرسبار میزنی میبینی که دیگه این عمل گرفتن نسخهء جدید از سرور اصلی انجام نمیشه. پس همینطور موقعی که اون فایل در سورس یک صفحهء دیگه هست باید از کش استفاده بشه.
پس بنظر بنده همین که چک کنیم که دستورات کش که در htaccess درج کردیم واقعا کار میکنن کافیه و بقیش به تنظیمات مرورگرها و اصول اونها بستگی داره. البته میشه در این ارتباط تست های مفصل تر و دقیقتری انجام داد، اما من خودم تا اینجا قانع شدم و فکر میکنم اطمینان خوبی هست که این دستورات مشکلی ندارن.

اگر دستورات htaccess شما اجرا نمیشن، احتمالا تنظیم AllowOverride در فایل اصلی پیکربندی آپاچی (httpd.conf) اجازهء این رو نمیده که شما از دستورات لازم در فایلهای htaccess استفاده کنید. بطور مثال این تنظیم در نصب EasyPHP خود بنده غیرفعال بود که با تغییر AllowOverride None به AllowOverride All درستش کردم. ولی روی هاستهای اشترکی شما دسترسی به این فایل ندارید و درصورت لزوم باید با ادمین سرور خودتون تماس بگیرید.

حواست باشه برنامه ای که درج کردم، برای تست از یک فایل تصویری بنام test.png که در پوشه ای بنام test در ریشهء وبسایت قرار میدیم استفاده میکنه.

eshpilen
سه شنبه 10 خرداد 1390, 12:52 عصر
چی شده تست کردی؟
مشکل چی بود؟

i-php-i
سه شنبه 10 خرداد 1390, 13:58 عصر
چی شده تست کردی؟
مشکل چی بود؟
الان دارم کار یه مشتری رو راه می ندازم و متاسفانه نتونستم تست کنم.

حتما روش شما رو تست می کنم و نتیجه رو بهتون اعلام می کنم.

i-php-i
چهارشنبه 11 خرداد 1390, 00:15 صبح
یه مقدار بررسی و تست روی این قضیه انجام دادم.
از این برنامه برای تست استفاده کردم:

اگر دستورات htaccess شما اجرا نمیشن، احتمالا تنظیم AllowOverride در فایل اصلی پیکربندی آپاچی (httpd.conf) اجازهء این رو نمیده که شما از دستورات لازم در فایلهای htaccess استفاده کنید. بطور مثال این تنظیم در نصب EasyPHP خود بنده غیرفعال بود که با تغییر AllowOverride None به AllowOverride All درستش کردم. ولی روی هاستهای اشترکی شما دسترسی به این فایل ندارید و درصورت لزوم باید با ادمین سرور خودتون تماس بگیرید.

حواست باشه برنامه ای که درج کردم، برای تست از یک فایل تصویری بنام test.png که در پوشه ای بنام test در ریشهء وبسایت قرار میدیم استفاده میکنه.
الان کدهای شما رو تست کردم.
خروجی که گرفتم به این صورت هست:
نظرتون چیه؟

HTTP/1.1 200 OK
Date: Tue, 31 May 2011 20:04:58 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: 4303
Cache-Control: max-age=2592000, public
Expires: Thu, 30 Jun 2011 20:04:58 GMT
XXXX: t=1306872298999750
Connection: close
Content-Type: image/jpeg


البته بنظر خودم کدها ایراد دارن. کد زیر رو در نظر بگیرید. بنظرم این کد باعث می شه که فایلها بعد از یک ثانیه از حافظه کش مروگر پاک بشن. البته مقدار 1 ثانیه رو به 360000 ثانیه تغییر دادم ولی بازم اثری روی کار من نداشت. نظر شما چیه؟

ExpiresDefault "access plus 1 seconds"
سایت آپاچی رو نگاه کردم ولی چیزی پیدا نکردم.

eshpilen
چهارشنبه 11 خرداد 1390, 08:04 صبح
الان کدهای شما رو تست کردم.
خروجی که گرفتم به این صورت هست:
نظرتون چیه؟
این نشون میده که دستورات htaccess دارن اجرا میشن.


البته بنظر خودم کدها ایراد دارن. کد زیر رو در نظر بگیرید. بنظرم این کد باعث می شه که فایلها بعد از یک ثانیه از حافظه کش مروگر پاک بشن. البته مقدار 1 ثانیه رو به 360000 ثانیه تغییر دادم ولی بازم اثری روی کار من نداشت. نظر شما چیه؟
اگر به اسم دستور دقت کنید و بقیهء دستورات بعدش رو هم مد نظر داشته باشید روشن میشه که این دستور درمورد فایلهایی که بصورت صریح مشخص نشدن و زمان کش براشون درنظر گرفته نشده اعمال میشه. یعنی فایلهایی که نوعشون غیر از اونایی هست که ما مشخص کردیم.

i-php-i
چهارشنبه 11 خرداد 1390, 13:35 عصر
این نشون میده که دستورات htaccess دارن اجرا میشن.

اگر به اسم دستور دقت کنید و بقیهء دستورات بعدش رو هم مد نظر داشته باشید روشن میشه که این دستور درمورد فایلهایی که بصورت صریح مشخص نشدن و زمان کش براشون درنظر گرفته نشده اعمال میشه. یعنی فایلهایی که نوعشون غیر از اونایی هست که ما مشخص کردیم.
خب اگر کدها درست هستن، چرا وقتی فایلهای سی اس اس رو تغییر می دم، این تغییر روی ظاهر سایت عمل می کنه؟

eshpilen
چهارشنبه 11 خرداد 1390, 13:42 عصر
نمیدونم احتمالا صفحه رو که رفرش میکنی این فایلها رو دوباره از سرور میگیره.
بجای اینکه صفحه رو رفرش کنی مثلا مرورگر رو ببنند و دوباره باز کن و آدرس رو بدون رفرش کردن باز کن ببین آیا تغییرات اعمال میشن یا نه.

i-php-i
چهارشنبه 11 خرداد 1390, 15:40 عصر
نمیدونم احتمالا صفحه رو که رفرش میکنی این فایلها رو دوباره از سرور میگیره.
بجای اینکه صفحه رو رفرش کنی مثلا مرورگر رو ببنند و دوباره باز کن و آدرس رو بدون رفرش کردن باز کن ببین آیا تغییرات اعمال میشن یا نه.
دوست عزیز مرسی، مشکل همون بود که شما گفتید. بخاطر ریفرش کردن صفحه بود.

بنظرتون بهتر نیست که زمان کش کردن فایلهای نامشخص رو از یک ثانیه به یک ساعت یا حداقل یک روز افزایش داد؟

سوال دیگه در مورد کدهای زیر هست. این کدها برای فایلهای استاتیک بکار می ره. کاربرد دقیق این کدها چیه؟ لطفا در مورد این کدها توضیح بدید.

# 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

i-php-i
چهارشنبه 11 خرداد 1390, 15:45 عصر
با توجه به مهم بودن مبحث مربوط به کش در بهبود کارایی سایت، سایر دوستان که علاقه دارن می تونن این بحث رو از ابتدا پیگیری کنن تا بتونن وب سایتهای بهینه ای طراحی کنن.

دوست عزیزمون آقای eshpilen (http://barnamenevis.org/member.php?148005-eshpilen) توضیحات خوبی در این زمینه ارائه می دن.

eshpilen
چهارشنبه 11 خرداد 1390, 18:06 عصر
دوست عزیز مرسی، مشکل همون بود که شما گفتید. بخاطر ریفرش کردن صفحه بود.

بنظرتون بهتر نیست که زمان کش کردن فایلهای نامشخص رو از یک ثانیه به یک ساعت یا حداقل یک روز افزایش داد؟فکر نمیکنم اینطوری اصولی باشه. چون یکسری فایلها و کاربردها هستن که بهتره یا ضرورت داره کش نشن.
مثلا اینطوری فکر کنم حتی خروجی فایلهای PHP شما هم کش بشن. بنظر شما اینطوری خوبه؟ مثلا کاربر میاد توی صفحهء اخبار و همون صفحهء قبلی رو میبینه. یا اینکه شمارندهء سایت شما نمیتونه تعداد بازدیدهای واقعی رو بشماره.


سوال دیگه در مورد کدهای زیر هست. این کدها برای فایلهای استاتیک بکار می ره. کاربرد دقیق این کدها چیه؟ لطفا در مورد این کدها توضیح بدید.

# 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
دقیقا یادم نیست اما میدونم که دو هدر ETag و Last-Modified هم در سیستم کش کاربرد دارن. بنابراین حتما تولید خودکار این هدرها در کار تنظیمات کش مورد نظر اختلال ایجاد میکردن (و شاید این بخاطر رفتار خاص یا باگ بعضی مرورگرها هم باشه) که اونا رو با این دستورات حذف کرده.

eshpilen
چهارشنبه 11 خرداد 1390, 19:32 عصر
راستی دقت کنید دستورات htaccess که گذاشتید باعث میشه خروجی فایلهای PHP هم کش بشه.
دقیقا این دستور باعثش میشه:

ExpiresByType text/html "access plus 600 seconds"
بخاطر اینکه خروجی تولید شده توسط فایلهای PHP هم از نوع HTML هست و این در هدر Content-Type که بصورت خودکار در خروجی تولید میشه مشخص میشه. دقیقا به این شکل:

Content-Type: text/html

یه نکتهء مهم دیگه اینکه، درخواستهای از نوع POST کش نمیشن.
یعنی مثلا باوجودی که صفحات PHP شما با دستور بالا در htaccess کش میشن، اما اگر همین صفحات حاوی فرمی باشن که سابمیتش کنید، درخواست مستقیما به سرور ارسال شده و پاسخ هم از سرور دریافت میشه و سیستم کش پاسخ این درخواست رو کش نمیکنه و حتی در پاسخ درخواستهای کاملا یکسان (از نوع POST) یک پاسخ کش شده حاصل از درخواستهای قبلی رو دریافت نمیکنید بلکه همونطور که گفتم درخواست مستقیما به سرور ارسال شده و پاسخ دریافت میشه.

eshpilen
چهارشنبه 11 خرداد 1390, 19:54 عصر
فکر کردم خوبه یه روش تست راحت و مطمئن برای این موضوع مهم و ظریف ایجاد کنیم که میتونه خیلی آموزنده باشه.
یه برنامهء ساده برای تست این قضیه رو ضمیمه کردم که شامل چند فایل هست: فایل .htaccess، فایل test.php، فایل no-cache.css و فایل cache.css.
در فایل htaccess ما دستوراتی دادیم که باعث میشن فایل cache.css کش بشه و فایل no-cache.css کش نشه.
در فایل test.php دو تگ div گذاشتیم که یکی از استایل موجود در فایل cache.css استفاده میکنه و دیگری از استایل تعریف شده در فایل no-cache.css. در نتیجه اگر صفحهء test.php رو در مرورگر باز کنید و بعد استایل موجود در هردوی این فایلهای css رو تغییر بدید و سیو کنید و بعد صفحه رو با کلیک بر روی دکمهء Reload page دوباره لود کنید، میبینید که تغییرات فایل no-cache.css در تگ div مربوطه منعکس میشه اما تغییرات فایل cache.css در تگ div خودش اعمال نمیشه چون این فایل از کش لود میشه.
هربار که صفحه رو لود میکنید عددی که در قسمت پایین نوشته شده و بصورت تصادفی با تابع mt_rand در PHP تولید میشه تغییر میکنه تا راحتتر مطمئن بشید که خود صفحهء PHP دوباره از سمت سرور دریافت شده.

بجز دکمهء Reload page یک دکمهء دیگر بنام Refresh page هم در صفحه گذاشتم که این دکمه دستور جاواسکریپت location.reload() رو اجرا میکنه و تاجاییکه تست کردم این دستور مثل عملیات رفرش مستقیم توسط کاربر هست؛ یعنی باعث میشه سیستم کش دور زده بشه و بنابراین با فشار این دکمه استایل هردوی تگ های div از طریق سرور آپدیت و اعمال میشه.

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

i-php-i
چهارشنبه 11 خرداد 1390, 20:45 عصر
راستی دقت کنید دستورات htaccess که گذاشتید باعث میشه خروجی فایلهای PHP هم کش بشه.
دقیقا این دستور باعثش میشه:

ExpiresByType text/html "access plus 600 seconds"
بخاطر اینکه خروجی تولید شده توسط فایلهای PHP هم از نوع HTML هست و این در هدر Content-Type که بصورت خودکار در خروجی تولید میشه مشخص میشه. دقیقا به این شکل:

Content-Type: text/html

یه نکتهء مهم دیگه اینکه، درخواستهای از نوع POST کش نمیشن.
یعنی مثلا باوجودی که صفحات PHP شما با دستور بالا در htaccess کش میشن، اما اگر همین صفحات حاوی فرمی باشن که سابمیتش کنید، درخواست مستقیما به سرور ارسال شده و پاسخ هم از سرور دریافت میشه و سیستم کش پاسخ این درخواست رو کش نمیکنه و حتی در پاسخ درخواستهای کاملا یکسان (از نوع POST) یک پاسخ کش شده حاصل از درخواستهای قبلی رو دریافت نمیکنید بلکه همونطور که گفتم درخواست مستقیما به سرور ارسال شده و پاسخ دریافت میشه.
قبلا با این مشکل مواجه شده بودم. البته وقتی که کد زیر رو حذف کردم دیگه با فایلهای پی اچ پی مشکلی ندارم.


<filesMatch "\.(php)$">
Header set Cache-Control "max-age=216000, private"
</filesMatch>

آیا لازم هست که کدهای زیر رو هم حذف کنم؟ لطفا راهنمایی کنید.

ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"

<filesMatch "\.(x?html?)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</filesMatch>

eshpilen
چهارشنبه 11 خرداد 1390, 23:14 عصر
آیا لازم هست که کدهای زیر رو هم حذف کنم؟ لطفا راهنمایی کنید.بنظرم اگر به اونای دیگه دست نزنید و فقط این رو هم به htaccess اضافه کنید بهتره:

<ifModule mod_headers.c>
<filesMatch "\.(php)$">
Header unset Expires
Header set Cache-Control "max-age=0, private"
</filesMatch>
</ifModule>
این دستورات فقط فایلهای با پسوند php رو ضدکش میکنه و بقیهء فایلها مثل فایلهای با پسوند html و غیره همچنان کش میشن (البته مدتش فقط 10 دقیقه تعیین شده، ولی میشه بیشترش کرد).

--------------------

یه راه دیگه بدون اینکه به htaccess دست بزنید اینه که هدرهای ضد کش رو توسط خود PHP ارسال بکنید که در اینصورت این هدرها جایگزین هدرهایی که آپاچی تولید میکنه میشن.
مثلا اینا هدرهای ضدکشی هستن که بنده در ابتدای فایلهای PHP خودم میذارم:

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");
این روش خوبیش اینه که تنها صفحاتی که واقعا نباید کش بشن رو ضدکش میکنه و صفحاتی که کش شدن اونا مشکلی نداره کش میشن (البته این کش شدن و مدت زمانش به تنظیمات آپاچی و دستورات htaccess بستگی داره). بنظرم خیلی وقتا صفحات php ای هم پیدا میشن که مشکلی نداره کش بشن. نه؟

--------------------

یه روش معکوس هم اینه که از دستورات ضدکش در فایل htaccess استفاده کنیم، بعد برای خنثی کردن اثر اونها در صفحات php ای که میخوایم کش بشن از هدرهای مناسب استفاده کنیم که این بار بجای ضدکش بودن باعث کش شدن صفحه میشن.

انتخاب روش با شماست و به نظر و شرایط شما برمیگرده. فعلا اون راه اول احتمالا از همه ساده تره ولی از همه خام تر هم هست. ضمنا هرچی سعی کنید عملیات در داخل خود برنامه انجام بشه و برنامه از تنظیمات و نرم افزارهای خارجی مستقل باشه خودش یک مزیته. مثلا فرض کنیم روی یک سرور نرم افزار دیگری نصب بود یا امکان استفاده از htaccess برای اینطور دستورات فعال نشده بود و غیره. اینطوری نیازی به کپی کردن و تنظیم دستی چیزی هم نیست. خلاصه تاحد ممکن هرچی تنظیمات داخل خود برنامه باشن و بصورت خودکار انجام بشن بهتره.
درمورد فایلهای استاتیک html یا فایلهایی مثل css و تصویر و غیره نمیتونیم این کار رو براحتی کافی انجام بدیم چون قابل برنامه نویسی مستقیم نیستن، اما در فایلهای php که دستمون بازه.

i-php-i
چهارشنبه 11 خرداد 1390, 23:29 عصر
انتخاب روش با شماست و به نظر و شرایط شما برمیگرده. فعلا اون راه اول احتمالا از همه ساده تره ولی از همه خام تر هم هست. ضمنا هرچی سعی کنید عملیات در داخل خود برنامه انجام بشه و برنامه از تنظیمات و نرم افزارهای خارجی مستقل باشه خودش یک مزیته. مثلا فرض کنیم روی یک سرور نرم افزار دیگری نصب بود یا امکان استفاده از htaccess برای اینطور دستورات فعال نشده بود و غیره. اینطوری نیازی به کپی کردن و تنظیم دستی چیزی هم نیست. خلاصه تاحد ممکن هرچی تنظیمات داخل خود برنامه باشن و بصورت خودکار انجام بشن بهتره.
درمورد فایلهای استاتیک html یا فایلهایی مثل css و تصویر و غیره نمیتونیم این کار رو براحتی کافی انجام بدیم چون قابل برنامه نویسی مستقیم نیستن، اما در فایلهای php که دستمون بازه.
عبارتهایی مثل public، private، must-revalidate و ... به چه معنی هست؟

عبارت max-age زمان نگه داری فایل رو بر حسب ثانیه مشخص می کنه؟

سوال دیگه اینکه آیا کدهایی که استفاده می کنیم به بزرگ و کوچک بودن حروف اهمیت می ده؟ یعنی اگر یه فایل رو بصورت test.HTML تعریف کنیم، اون فایل هم کش می شه یا اینکه فقط پسوندهایی با حروف کوچک توسط htaaccess شناسایی و هدرهای کش ارسال می شن؟

eshpilen
پنج شنبه 12 خرداد 1390, 09:06 صبح
عبارتهایی مثل public، private، must-revalidate و ... به چه معنی هست؟

تمام اینا در پروتکل 1.1 HTTP تعریف شدن.
جزییات زیاد داره ولی بطور کلی مثلا public یعنی اجازه هست وقتی پاسخی از طرف سرور برای درخواست یک کاربر تولید میشه اون پاسخ در یک کش سرور یا پراکسی که به کاربران مختلفی سرویس میده ذخیره بشه و برای پاسخ به درخواست های بقیهء کاربران هم استفاده بشه.

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

must-revalidate هم مال جریانات دیگه ای هست که خلاصش اینه که به یک کش سرور میگه حتما باید معتبر بودن پاسخی که تاریخش گذشته رو با سرور اصلی چک بکنی ولو در هدرهای درخواست یا تنظیمات پیشفرض کش سرور اجازه یا دستور استفاده از پاسخهای تاریخ گذشته داده شده باشه.

برای توضیحات بیشتر و جزییات هم باید به RFC 2616 مراجعه کنید چون مفصل و ظریف هست. بنده هم فقط کلیات رو تاجاییکه یادم بود گفتم.

ضمنا اون هدرهای ضدکشی که درج کردم و گفتم بنده استفاده میکنم احتمالا خیلی چیزهای غیرضروری و حتی متناقض داره. اون هدرها رو واسه رفع مشکل کش شدن ناخواسته که دردسر شده بود با عجله درست کردم و برای اطمینان از اینکه تحت هر شرایطی کار میکنه هرچی رو که فهمیده بودم ضدکش هست چپوندم توش!! خلاصه گیج نشید فکر کنید خیلی پیچیده هست. لزوما ضروری نیست همهء اونا رو بنویسید، ولی بودنشون ضرری هم فکر نمیکنم داشته باشه.



عبارت max-age زمان نگه داری فایل رو بر حسب ثانیه مشخص می کنه؟بله.


سوال دیگه اینکه آیا کدهایی که استفاده می کنیم به بزرگ و کوچک بودن حروف اهمیت می ده؟ یعنی اگر یه فایل رو بصورت test.HTML تعریف کنیم، اون فایل هم کش می شه یا اینکه فقط پسوندهایی با حروف کوچک توسط htaaccess شناسایی و هدرهای کش ارسال می شن؟نمیدونم. روی ویندوز که ظاهرا تفاوتی نداره. البته سیستم فایل ویندوز غیرحساس به کوچکی و بزرگی حروف هست، و بعکس سیستم فایل لینوکس حساس به کوچکی و بزرگی هست و احتمال داره در اونجا قضیه فرق بکنه که میتونید برای فهمیدن تست کنید.

eshpilen
جمعه 13 خرداد 1390, 00:02 صبح
فکر کردم بهتره برنامه ای رو که برای تست کش درست کرده بودم کاملتر کنم.
این نسخهء جدیدش هست که کاملتر و هوشمندتر شده و سعی میکنه تشخیص بده آیا دستورات داخل htaccess اصلا اجرا میشن یا نه و اگر مشکلی بود پیام مناسبی به کاربر بده.

بقیهء توضیحات برنامه هم که در پست قبلی (http://barnamenevis.org/showthread.php?289488-%DA%86%D8%B1%D8%A7-%DA%A9%D8%AF%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-%DA%A9%D8%B4-%DA%A9%D9%87-%D8%AA%D9%88%DB%8C-htaccess-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C-%DA%A9%D9%86%D9%85%D8%8C-%D8%A8%D9%87-%D8%AE%D9%88%D8%A8%DB%8C-%DA%A9%D8%A7%D8%B1-%D9%86%D9%85%DB%8C-%DA%A9%D9%86%D9%86%D8%9F&p=1274397&viewfull=1#post1274397) هست.

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

نکته: برای این نسخهء جدید نیاز به اضافه کردن چیز کوچکی در فایل htaccess هم بود.