转自: 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,问题解决。
分享到:
相关推荐
本文将深入探讨两个关键的缓存机制:Etag与If-None-Match以及Last-Modified与If-Modified-Since。 1. Etag与If-None-Match: Etag(Entity Tag)是一种用于标识资源版本的机制。服务器在响应头中设置Etag,它通常是...
当客户端(浏览器)向服务器请求资源时,如果之前已经获取过该资源,它会在请求中包含一个 `If-Modified-Since` 头,带上上次获取资源时记录的 `Last-Modified` 时间戳。如果服务器发现资源自那时以来未被修改,它会...
当浏览器再次请求该资源时,它会将上次接收到的Last-Modified值通过`If-Modified-Since`头部发送回服务器,询问服务器资源是否自那时起有变动。如果资源未改变,服务器会返回一个304 Not Modified状态码,告诉浏览器...
当`If-Modified-Since`的日期与服务器资源的`Last-Modified`相同,服务器可以返回304 Not Modified状态,避免传输整个文件。 7. **性能优化** 使用`Last-Modified`和`ETag`可以显著提升用户体验,减少不必要的网络...
修改last-modified的HTTP规范,实现了last-modified , if-modified-since , etag , if-none-match 。概要Modified是根据构建的,并通过缓存支持对其进行修饰,因此,如果您熟悉请求,则几乎可以使用修改了。 var...
协商缓存的字段有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match,其中 Etag / If-None-Match 的优先级比 Last-Modified / If-Modified-Since 高。 Last-Modified 字段,它的值是该资源文件在服务器...
Last-Modified是服务器返回资源的最后修改时间,If-Modified-Since是客户端再次请求时携带的Last-Modified值,用来告诉服务器资源的最后修改时间。Etag是服务器对资源的唯一标识,If-None-Match是客户端请求时携带的...
在后续请求中,客户端会在HttpRequest Header中发送If-Modified-Since报头,包含之前接收到的Last-Modified时间。如果服务器上的文件自上次请求后未被修改,服务器将返回304 Not Modified状态码,客户端则直接从本地...
Etag http If-None-Match If-Modified-Since Last-Modified 使用Demo 已经可以直接使用
浏览器缓存机制、Expires策略(http1.0)和Cache-control策略(http1.1)、Last-Modified/If-Modified-Since、ETag/If-None-Match
* Request Header Fields:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、Expect、From、Host、If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since、Max-...
3. **`Last-Modified`与`If-Modified-Since`**: 类似于`ETag`,`Last-Modified`头表示资源的最后修改时间。如果客户端在下次请求时提供`If-Modified-Since`头,服务器会比较这个时间,如果资源未修改,则返回`304 ...
强缓存通过这些头部直接决定是否使用缓存,而协商缓存则通过`Last-Modified`/`If-Modified-Since`或`ETag`/`If-None-Match`与服务器通信来验证资源是否更新。Service Worker提供了更细粒度的缓存控制,支持离线应用...
浏览器在请求中添加`If-Modified-Since`头,包含上次资源的`Last-Modified`值。服务器比较这个时间,若资源未修改则返回304,否则返回新的资源和新的`Last-Modified`值。 HTTP缓存不仅涉及上述机制,还有其他策略如...
25 If-Modified-Since 26 26 If-None-Match 27 27 If-Range 28 28 If-Unmodified-Since 28 29 Last-Modified 29 30 Location 29 31 Max-Forwards 29 32 Pragma 30 33 Proxy-Authenticate 30 34 Proxy-Authorization ...
if (ifModifiedSince && ifModifiedSince == stats.ctime.toGMTString()) { res.statusCode = 304; res.end(); } else if (etag) { // 添加ETag支持 // ... } else { sendFile(req, res, filePath, stats); ...
- **Last-Modified/If-Modified-Since**: 用于比较服务器上的文件最后修改时间与客户端缓存副本的最后修改时间。 - **ETag/If-None-Match**: 提供了一个关于资源当前状态的标识符,用于判断资源是否发生变化。 ##...
例如,使用`If-Modified-Since`头,浏览器只在文件有更新时才请求服务器,否则直接使用本地缓存。 6. **事件监听**: - 在某些情况下,如单页应用(SPA),你可能需要在页面路由变化时更新修改时间。可以监听`...
2. 协商缓存:当强缓存无效时,浏览器会向服务器发送带有If-None-Match(ETag)或If-Modified-Since(Last-Modified)的请求头。ETag是服务器为每个资源分配的一个唯一标识,Last-Modified是资源的最后修改时间。...
浏览器会发送`If-Modified-Since`头,包含上次获取资源时的`Last-Modified`时间,服务器比较这个时间与当前资源的修改时间,如果未修改,返回304状态码,否则返回完整资源。 HTTP头中的关键字段包括: - `Pragma: ...