关于last-modified与If-Modified-Since

转自: http://blog.chinhai.com/index.php/archives/149

由于想使用php合并成文件,而又想它可以缓存。所以使用了客户端请求头的If-Modified-Since,和服务器端文件最近修改的一个文件的last-modified,通过这两个时间的比较从而实现是否缓存。代码如下:

//中国
$client_time = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 0);

$css = '';
$lastmod=0;

$file_sys="a.css";
if( file_exists($file_sys)) {
$file_sys_fh = fopen($file_sys,'r');
$file_sys_con = fread($file_sys_fh, filesize($file_sys));
$lastmod = filemtime($file_sys);

//echo mime_content_type($file_sys);

$css = $file_sys_con;
}

$file_sys="b.css";
if( file_exists($file_sys)) {
$file_sys_fh = fopen($file_sys,'r');
$file_sys_con = fread($file_sys_fh, filesize($file_sys));
if(filemtime($file_sys)>$lastmod){
$lastmod = filemtime($file_sys);
}
$css = $css."\r\n".$file_sys_con;
}

$ExpiresDate=(10*365*24*60*60);
$timefomat='D, d M Y H:i:s';
$Expires=$lastmod + $ExpiresDate;
if ($lastmod > $client_time){
header('Expires: '.gmdate($timefomat, $Expires).' GMT');
header('Last-Modified: '.gmdate($timefomat, $lastmod).' GMT', true, 200);
echo $css;
}else{
header('Expires: '.gmdate($timefomat, $Expires).' GMT');
header('Last-Modified:'.gmdate($timefomat, $client_time).' GMT', true, 304);
exit(0);
}
?>

本地测试正常,服务器端返回头last-modified与和客户端请求头If-Modified-Since都在httpwacth检测到了。但是上传到服务器的时候就不能正常运行,客户端没有请求头If-Modified-Since。
由于不懂服务器配置,开始觉得问题出现在nginx没有接收到客户端请求头If-Modified-Since,而走了歪路。最后才在同事提醒下发现刷新页面时候,服务器没有返回Last-Modified而导致了客户端没有传If-Modified-Since的请求头。最后确定问题是开了ssi,测试关闭后正常缓存。

http://blog.helosa.org/2010/01/28/nginx-last-modified.html

简单的说,Last-Modified 与If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可 以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。

last-modified与If-Modified-Since,是先有last-modified才有If-Modified-Since。
于是虚拟机设置准确域名关闭ssi,问题解决。

猜你喜欢

转载自lee2013.iteye.com/blog/1172659