یه مقدار بررسی و تست روی این قضیه انجام دادم.
از این برنامه برای تست استفاده کردم:
<?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 در ریشهء وبسایت قرار میدیم استفاده میکنه.