开发者

Setting up Expire Headers with PHP

could anyone help me with setting up Expire Headers using PHP only, .htaccess is no good, because my host won't enable m开发者_Python百科od_expires on apache.

So basically I'm looking for a way to do:

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

with php only.

its also important to have different expire periods for different filetypes, so I tried using something like:

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);

for each type of files, but nothing happened.


the headers after adding the PHP code, and taken from private session:

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


According to your comment in the question it looks like your system is running with a PHP setting of session.cache_limiter = nocache. This would automatically send the following headers:

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

Only the Expires header you mention differs a bit (afaik Joomla uses that very datetime, if i'm not mistaken). But all in all it makes no difference, because both dates are in the past.

You should try with session_cache_limiter(false); in your code, to stop PHP sending its default caching headers:

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;

EDIT:

Meanwhile it's more probable to me, that Joomla is causing the problem. If the test code has access to Joomla libraries, try inserting:

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

at the very top of the function and replace each header instruction with JResponse::setHeader.


That helps me for ajax queries:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜