`
yanzilee9292
  • 浏览: 528958 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于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,问题解决。

 

 

分享到:
评论

相关推荐

    http协议-缓存控制:etag If-None-Match / Last-Modified If-Modified-Since

    NULL 博文链接:https://hyj1254.iteye.com/blog/1161000

    node-modified:修改后是一个简单的请求客户端来处理http本地缓存

    修改last-modified的HTTP规范,实现了last-modified , if-modified-since , etag , if-none-match 。概要Modified是根据构建的,并通过缓存支持对其进行修饰,因此,如果您熟悉请求,则几乎可以使用修改了。 var...

    TCP-HTTP-操作系统.pdf

    状态码 2xx:表示报文被成功接收 3xx:表示重定向,客户端重新...If-Modified-Since 和 Last-Modified:基于时间实现,在发现请求到的资源携带 Last-Modified,那 么在下一次请求时,会将其值携带在If-Modified-Since

    Http Etag 技术分享

    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

    浏览器缓存技术介绍以及优化建议

    强缓存通过这些头部直接决定是否使用缓存,而协商缓存则通过`Last-Modified`/`If-Modified-Since`或`ETag`/`If-None-Match`与服务器通信来验证资源是否更新。Service Worker提供了更细粒度的缓存控制,支持离线应用...

    HTTP协议Header详解.html

    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 ...

    node.js实现http服务器与浏览器之间的内容缓存操作示例

    本文实例讲述了node.js实现http服务器与浏览器...三、通过使用 Last-Modified / If-Modified-Since 来进行缓存判断 1、Last-Modified 是服务器向客户端发送的头信息,用于告诉客户端资源的 最后修改时间,该信息浏览器

    vapr-conditionals:一个Vapr插件,用于处理条件请求

    具体来说,它处理 If-Match、If-None-Match、If-Modified-Since 和 If-Unmodified-Since 标头,同时为客户端提供 ETag 和 Last-Modified 标头。 条件请求可以通过节省不经常更改的响应的带宽来提高服务器的效率,...

    http-file-headers:使用tk-http在rust中制作全功能HTTP静态文件服务器的库

    Last-Modified , If-Modified-Since Accept-Ranges , Range , Content-Range 使用Content-Type Accept-Encoding以提供压缩(gzip和brotli)文件 提供index.html或类似的目录索引 该库未绑定到任何框架,HTTP...

    Is It Cached?-crx插件

    开发人员工具的此扩展为您提供有关单个表中所有相关请求标头(方法,if-modified-since,if-none-match)和响应标头(cache-control,pragma,last-modified,etag)的概述。 。 它还会检测是否通过CDN提取了元素,...

    浅谈Ajax的缓存机制

    Ajax的缓存机制和浏览器处理资源时的缓存机制是一样的。 三条简单规则: ...在Ajax的请求中设置Http头: If-Modified-Since:0,告诉服务器要新的内容。 补充说明: 一般情况下,用户手动触发浏览器刷新

    relationship-server-egg-typescript:Egg + Typescript + Mongo + Restful API

    modified-since的响应 Hyperlink url的支持 rate-limit GraphQLContributorsUsage编译ts文件: npm run tsc本地运行: npm run devunittest: npm test在VS Code中直接按'F5'以调试模式运行,其他参见

    asp.net c# 抓取页面信息方法介绍

    首先清空页面缓存, 从Last-Modified到Expires,我们可以看到,博客园的缓存时间是2分钟,而且我还能看到当前的服务器时间Date,如果我再次 刷新页面的话,这里的Date将会变成下图中 If-Modified-Since,然后发送给...

    HTTP 304错误的详细讲解

    如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有...

    HTTP协议详解

    14.25 If-Modified-Since 14.26 If-None-Match 14.27 If-Range 14.28 If-Unmodified-Since 14.29 Last-Modified 14.30 Location 14.31 Max-Forwards 14.32 Pragma 14.33 Proxy-Authenticate 14.34 Proxy-...

    occam一维反演

    C IF YOU OBTAIN THIS CODE FROM A THIRD PERSON, PLEASE SEND YOUR NAME AND ADDRESS C TO S. CONSTABLE. YOU WILL THEN RECEIVE UPDATES, NEWS ON BUGS, ETC. C C VERSION 2.0 IS A RE-WRITE TO MAKE OCCAM ...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    - FIX Remaks panel focusing on main form (via PostMessage), since TreeInspector in FlexEditSE captures focus on self. - FIX Invalid arc size calculation when flex-control's size changes via DocRect ...

    Senfore_DragDrop_v4.1

    6) If your version of Delphi does not support text format DFM files (e.g. Delphi 4 doesn't), you will have to use the convert.exe utility supplied with Delphi to convert all the demo form files to ...

    dive into python

    11.3.3. Last-Modified/If-Modified-Since 11.3.4. ETag/If-None-Match 11.3.5. 压缩 (Compression) 11.4. 调试 HTTP web 服务 11.5. 设置 User-Agent 11.6. 处理 Last-Modified 和 ETag 11.7. 处理重定向 ...

Global site tag (gtag.js) - Google Analytics