首页->正文

php增加Last-Modified为何无效

2011-04-10 -Web开发 标签: php 缓存 协议

网站首页要增加对手机浏览器的跳转,但原首页为静态文件,无法增加对客户端标示(User-agent)、手机用户访问常规页面的判断(如iPhone用户想访问常规页面),所以改为通过php增加判断逻辑,读取、输出首页静态文件。但首页文件经过gzip后仍近30K,考虑到首页的访问频率和带宽,于是在header中加上Last-Modified,充分利用客户端缓存。但二次请求时发现http状态返回仍为200,很是不明白,经过搜索才真正明白Last-Modified的作用:

服务器端发送Last-Modified头信息, 如“Last-Modified: Mon, 11 Apr 2011 11:28:56 GMT”,浏览器会在本地生成自己的缓存文件(比如生成文件a),当浏览器二次请求此地址时,会加上“If-Modified-Since: Mon, 11 Apr 2011 11:28:56 GMT”的头信息。

服务器端收到If-Modified-Since会和文件的最近修改时间进行对比,如发现两个时间相等,则直接返回“HTTP/1.1 304 Not Modified”,浏览器则根据此信息直接取本地的缓存文件a,而无需再次获取全部信息。而php会无视请求header中的If-Modified-Since,而是每次返回200,也就出现了以上的问题。不过细想后php这么做是合理的,If-Modified-Since是基于文件的,而php每次是动态生成内容,不可能有最近修改时间。

参考资料
.php对If-Modified-Since的处理:http://www.phorum.org/phorum5/read.php?14,137970(此乃强人,说经过查看php源码发现的)
.从请求中获取If-Modified-Since:http://home.phpchina.com/space.php?uid=91364&do=blog&id=185426
.http 304更详细的介绍:http://msdn.microsoft.com/zh-cn/library/dc2dx7w4%28v=vs.80%29.aspx
.nginx服务器端判断手机浏览器:http://wdhdmx.iteye.com/blog/969328

相关工具
.firebug http://getfirebug.com/
.fiddler http://www.fiddler2.com/fiddler2/

扩展思考&阅读
.如何给动态内容增加304?例如,基于数据库的包含修改时间字段的、动态生成图片文件的应用
.Etag http://www.hudong.com/wiki/Etag
.Header Field Definitions http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

下一篇 编写web服务器学Python之一

上一篇 nginx代理简单应用

相关文章

Ubuntu下编译安装PHP

使用curl_multi_init并发请求

nginx代理简单应用

用xhprof分析php代码

正则修饰符m和s用法

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com