PDA

View Full Version : سوال: چند سوال در مورد هدرهای Expires و If-Modified-Since و If-Modified



afshin.m
پنج شنبه 13 خرداد 1389, 23:39 عصر
با سلام خدمت دوستان و اساتید گرامی.

بنده توسط فایل .htaccess تمامی عکس ها، فایل های CSS و JS رو به آدرسی (برای Compress کردن و ... ) منتقل می کنم توسط کد زیر :


RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -f

RewriteRule ^(.*\.)(js)$ kernel/js_minify.php?js=$1$2 [L,NC]
RewriteRule ^(.*\.)(jpg|jpeg|gif|png)$ kernel/img.php?src=$1&format=$2&quality=5 [L,NC]
RewriteRule ^(.*\.)(css)$ kernel/css_minify.php?css=$1$2 [L,NC]


حال چند مشکل دارم...یکی از این مشکلات بزرگ این هست که نمی دانم چطور Expire برای فایل های CSS و عکسی و JS خود در نظر بگیرم و بهترین روش برای اینکار چیست...؟

از استاد محترم صمیمانه خواهشمندم پاسخ های خود را ارسال فرمایند.

با تشکر. :لبخندساده:

امیـرحسین
جمعه 14 خرداد 1389, 13:10 عصر
شما دارید توسط فایل js_minify.php فایلهای JS رو فشرده می کنید. همونجا که هدر text/javascript رو تنظیم می کنید، با تابع ()header، هدرهای دیگه رو هم تنظیم کنید.

Farhadi
جمعه 14 خرداد 1389, 15:50 عصر
اول باید مشخص کنی که کش مدت دار میخوای بذاری یا کش شرطی.
البته برای سرعت بیشتر بهتره کش مدت دار با زمان طولانی مثلا یک سال استفاده کنی و برنامه رو طوری بنویسی که زمانی که فایل ها تغییر میکنه url ها هم تغییر کنه. تا از کش استفاده نشه.
کش شرطی هم که باید تاریخ ویرایش فایل رو با هدر last-modified بفرستی و هدر if-modified-since رو هم چک کنی تا در صورت لزوم هدر 403 Not Modified بفرستی.

afshin.m
جمعه 14 خرداد 1389, 18:53 عصر
ممنون جناب فرهادی عزیز.

خیلی روش جالبی بود، فقط یک سوال...

من می خوام از روش اول یعنی کش مدت دار استفاده کنم حالا یه مسئله ای هست برای تغییر URL فایل ها.

من توسط .htaccess میام و فایل های css رو میفرستم روی css_minify.php ولی آدرس css اصلی که در صفحه هست رو تغییر نمی دم و در کد توسط file_get_contents فایل css رو می خونم (که روی دیسک کش شده و با md5sum هم کار می کنه) اما در کد اصلی توسط md5sum کار می کنم (و فایل رو می خونم) و بنابراین با تغییر محتوای فایل، آدرس css ذخیره شده روی دیسک تغییر می کنه (اما آدرس CSS اصلی هیچ گاه تغییر نمی کنه) ، حالا سوال من اینه که به این روش آیا کش درست کار می کنه یا اینکه به آدرس فایل اصلی نگاه می کنه و ممکنه اختلالاتی بوجود بیاره در کار نرم افزار؟

تشکر فراوان.

Farhadi
یک شنبه 16 خرداد 1389, 00:56 صبح
مهم نیست سمت سرور چیکار میکنی. مرورگر تا هر زمان که بگی فایل رو کش میکنه و تنها راه پاک کردن کش قبل از سررسید تغییر آدرسه.
ساده ترین روش برای تغییر آدرس اینه که زمان ویرایش فایل رو به عنوان query string توی url استفاده کنی.

rapidpich
یک شنبه 16 خرداد 1389, 09:21 صبح
نه مرورگر کش نمیکنه!
باید هدر رو بفرستی.
تو سایت php مربوط به تابع header چند نفر توضیح دادن(تو نظراتش)
این کد رو من تو یک پروژه استفاده کردم:



$last_modified_time = filemtime($filepath);
$md5 = md5_file($filepath);

header('Cache-Control: Public');
header("Expires : " . date('r',time() + 60 * 60 * 24 * 30));
header("Last-Modified: " . date('r',$last_modified_time));
header("Etag: {$md5}");
header('Content-Type: image/jpeg'); //******************Change this regarding filetype

if(@trim($_SERVER['HTTP_PRAGMA']) == 'no-cache')
{
//sendfile

}
elseif ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && isset($_SERVER['HTTP_IF_NONE_MATCH'])) &&
(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
@trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag ))
{
header("HTTP/1.1 304 Not Modified");
die();
}
else
{
//sendfile
}