2011-04-25 50 views
2

任何人都可以帮助我设置使用PHP的Expire头文件, .htaccess不好,因为我的主机不会在apache上启用mod_expires。使用PHP设置Expire头文件

所以基本上我正在寻找一种方式来做到:

Expire Header 
<FilesMatch "\.(ico|jpg|jpeg|png|gif|js|css|swf)$"> 
ExpiresDefault "access plus 365 days" 
</FilesMatch> 

只有PHP。

它也很重要,为不同文件类型的不同到期时间,所以我尝试使用类似:

header ("content-type: image/jpg; charset: UTF-8"); 
header ("cache-control: must-revalidate"); 
$offset = 48 * 60 * 60; 
$expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT"; 
header ($expire); 

每种类型的文件,但什么都没有发生。


加入PHP代码后的头,并从私人会议采取:

Response Headersview source 
Date Mon, 25 Apr 2011 19:47:10 GMT 
Server Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 
X-Powered-By PHP/5.3.1 
P3P CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" 
Expires Mon, 1 Jan 2001 00:00:00 GMT 
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Last-Modified Mon, 25 Apr 2011 19:47:10 GMT 
Content-Encoding gzip 
Pragma no-cache 
Keep-Alive timeout=5, max=100 
Connection Keep-Alive 
Transfer-Encoding chunked 
Content-Type text/html; charset=utf-8 
Request Headersview source 
Host localhost 
User-Agent Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16) Gecko/20110323 Ubuntu/10.10 (maverick) Firefox/3.6.16 (.NET CLR 3.5.30729) FirePHP/0.5 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language en-us,en;q=0.7,he;q=0.3 
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/----------------- 
Cookie fboard_settings[current_view]=flat; style_cookie=null; phpbb3_4s1go_k=; phpbb3_4s1go_u=2; phpbb3_4s1go_sid=8a3835a63834e9851b0cde3e2f6cff63; jw_clean_pro_tpl=jw_clean_pro; acpSearchCookie[searchphrase]=any; acpSearchCookie[acpSearch]=%D7%97%D7%A4%D7%A9+...; acpSearchCookie[cid]=0; acpSearchCookie[field_city]=0; 14a2bb08766d6180968b7925b7902d70=bgd3h1uj5dctoevtdiaj1jtmg6; 3e2fd857422e2463a01f9631f718017a=nbdjbmjsn9ee8ng90ui816hec2 
x-insight activate 
+2

“什么都没有发生”?你的意思是,它没有输出标题? – deceze 2011-04-25 09:23:23

+0

是的,请添加更多细节。你在哪里插入这个PHP代码? – 2011-04-25 09:25:20

+0

好吧,检查Yslow或PageSpeed我看到浏览器chaching笔记,我将代码插入我的index.php顶部,并且我没有收到任何错误作为标题发送。因此检查Net标签我看到:Expires \t Mon,1 2001 2001 00:00:00 GMT Last-Modified \t 2011年4月25日星期一09:05:17 GMT 缓存控制\t无存储,无缓存,必须重新验证,后检查= 0,预检查= 0 Pragma \t no-cache – alex 2011-04-25 09:30:16

回答

0

,可以帮助我对Ajax查询:

header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); 
header('Last-Modified: ' . gmdate('D, d M Y H:i:s',time()+60*60*8) . ' GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', false); 
header('Pragma: no-cache'); 
+0

是啊试过了,仍然没有改变标题... – alex 2011-04-25 09:31:42

+0

你有输出之前设置标题? do:error_repoerting(E_ALL);并寻找关于标题 – 2011-04-25 09:33:35

+0

实际上我没有访问我的PHP。ini,所以我使用的主机设置的错误,但我猜标题发送错误应该弹出,如果标题不正确 – alex 2011-04-25 09:34:53

10

根据问题的评论它看起来您的系统运行的PHP设置为session.cache_limiter = nocache。这会自动发送以下标题:

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 

只有Expires头你提到的略有不同(据我所知的Joomla使用了很日期时间,如果我没有记错的话)。但总的来说,这并没有什么区别,因为这两个日期都是过去的。

你应该session_cache_limiter(false);尝试在你的代码,停止PHP发送其默认的缓存头:

function sendHeader($sType, $iLastModified, $iSecondsToCache) 
{ 

    $aType = array(
     'ico' => 'image/x-icon', 
     'jpg' => 'image/jpeg', 
     'png' => 'image/png', 
     'gif' => 'image/gif', 
     'js' => 'text/javascript', 
     'css' => 'text/css', 
     'swf' => 'application/x-shockwave-flash' 
    ); 
    if (!isset($aType[$sType])) 
     die('No mime type found for ' . $sType); 

    //$sLastModified = gmdate('r', $iLastModified); 
    $sLastModified = gmdate('D, d M Y H:i:s', $iLastModified) . ' GMT'; 

    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) 
    { 
     if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $sLastModified) 
     { 
      header('HTTP/1.1 304 Not Modified'); 
      exit; 
     } 
    } 

    session_cache_limiter(false); 
    //header('Expires: ' . gmdate('r', $iLastModified + $iSecondsToCache)); 
    header('Expires: ' . gmdate('D, d M Y H:i:s', $iLastModified + $iSecondsToCache) . ' GMT'); 
    header('Cache-Control: public'); 
    header('Last-Modified: ' . $sLastModified); 
    header('Content-Type: ' . $aType[$sType]); 

} 

date_default_timezone_set('Europe/Berlin'); 

$iLastModified = strtotime('2011-04-25 07:08:09'); 
$iSecondsToCache = 48 * 60 * 60; 
sendHeader('jpg', $iLastModified, $iSecondsToCache); 

// stream sample image/jpeg content 
$rGD = imagecreatetruecolor(100, 20); 
$iColor = imagecolorallocate($rGD, 255, 255, 255); 
imagestring($rGD, 1, 5, 5, 'Image to be cached', $iColor); 
imagejpeg($rGD); 
imagedestroy($rGD); 
exit; 

编辑

同时它更可能对我来说,Joomla是造成问题的原因。如果测试代码可以访问到Joomla库,尝试插入:

jimport('joomla.environment.response'); 
JResponse::allowCache(true); 

在函数的最顶端,并与JResponse::setHeader替换每个header指令。

+0

好吧,这是行不通的。我应该看到一个内容类型的头到期为JPG图像,对吧?以及它不是在请求/响应 – alex 2011-04-25 18:13:58

+0

是的,你应该看过脚本的标题。您能否清除缓存和Cookie,再次执行代码并在执行后向我显示第一个原始HTTP响应?你有Fiddler或s/t来监视HTTP通信,对吧?如果你正在像Zend Framework这样的PHP框架下运行,或者仅仅使用PHP,这可能会有帮助。 – 2011-04-25 18:40:04

+0

我正在工作的网站是基于joomla,在本地主机上设置我的apache来运行mod_expires和htaccess我得到过期,问题出现在主机上。我使用tamperdata或萤火虫上的网络面板来查看我的请求 – alex 2011-04-25 19:44:13