php缓存控制设置不起作用

时间:2013-12-20 16:48:28

标签: php http-headers cache-control

我的标题中有以下功能

function header_alter($file)
{
    $timestamp=filemtime($file);
    $tsstring = gmdate('D, d M Y H:i:s ', $timestamp) . 'GMT';
    $etag = $timestamp;
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false;
    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] : false;
    if ((($if_none_match && $if_none_match == $etag) || (!$if_none_match)) &&
        ($if_modified_since && $if_modified_since == $tsstring))
    {
        $arr[] = 'HTTP/1.1 304 Not Modified';       
    }
    else
    {
        $arr[] = "Last-Modified: $tsstring";
        $arr[] = "ETag: \"{$etag}\"";
    }
    $arr[] = "Cache-Control: max-age=3600";
    $arr[] = 'Expires: ' . date('D, d M Y H:i:s', time() + (3600)) . ' GMT';
    return $arr;
}

但是当我使用下面的代码来查看标题时

foreach (getallheaders() as $name => $value) {
    echo "$name: $value\n";
}

Host: localhost
Connection: keep-alive
**Cache-Control: max-age=0**
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
If-None-Match: "1387557104"
If-Modified-Since: Fri, 19 Dec 2013 16:31:44 GMT

缓存控件未更新。 Thnx为帮助人员。

1 个答案:

答案 0 :(得分:0)

我们可以使用Cache-Control:max-age = ...来通知浏览器组件在定义的时间段内不会被更改。这样,如果浏览器已在其缓存中具有组件,则我们可以避免不必要的进一步请求,因此将更快地执行引导缓存页面视图。 现代浏览器能够使用一些启发式方法缓存静态文件,即使没有任何缓存控制头,但如果我们隐式定义缓存头,它们也会更高效。

对于Apache2,您可以使用mod_expires启用max-age:

ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"

对于Lighttpd,有mod_expire模块。
在server.modules部分启用它:

server.modules = (
...
"mod_expire",
...
)

然后为包含静态文件的目录添加以下指令:

$HTTP["url"] =~ "^/images/" {
expire.url = ( "" => "access 30 days" )
}

可以使用ngx_http_headers_module启用Nginx服务器的最大年龄: expires max;

现在,Web服务器发送静态文件的缓存头: 缓存控制:max-age = 2592000

如果设计发生变化,我们应该防止使用浏览器在其缓存中使用的过时内容。这可以通过向文件名添加文件版本来完成: script.js - > script1.js - > script2.js - > ......等等。

缓存控制:当我们输出HTML时,max-age也很有用。想象一下PHP生成的页面不经常更改,每天更新一次甚至更长时间。但是浏览器仍然需要在每个页面视图中下载HTML。 我们可以通过在PHP中发送max-age值来改进它。

header('Cache-Control: max-age=28800');