http cache 原理实战演习
有篇博文介绍的原理已经比较清楚了,见下面链接, 本文给出实验结果。
http://www.cnblogs.com/cocowool/archive/2011/08/22/2149929.html
Last-modified
第一次请求,请求头中没有 IF_Modify_Since, 因为第一次还没有获得 Last-Modified时间值, 本次请求只能是无条件请求。
GET http://localhost/httpcache.php HTTP/1.1
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 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4
第一次响应, 响应头有 Last-modified值, 浏览器缓存此值,待下次网页访问执行有条件访问, 即将此值作为请求报文头中 If_Modify_Since值。
HTTP/1.1 200 OK
Date: Mon, 16 Jun 2014 16:12:13 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/0.9.8y PHP/5.4.25
X-Powered-By: PHP/5.4.25
Last-modified: Fri, 16 Mar 2007 04:00:25 GMT
Content-Length: 524
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<style></style>
</head>
<body>
<h1>hello world!11</h1>
<input type="text" value="test"/>
<input type="button" value="button"/>
<script type='text/javascript'>
$("[type='button']").click(function(){
$("[type='text']").val("button click");
})
</script>
</body>
</html>
第二次浏览器请求, 带有If-Modified-Since
GET http://localhost/httpcache.php HTTP/1.1
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 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4
If-Modified-Since: Fri, 16 Mar 2007 04:00:25 GMT
第二次响应, 带有304状态,并没有报文体, 则告诉浏览器使用上次缓存。
HTTP/1.1 304 Not Modified
Date: Mon, 16 Jun 2014 16:23:40 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/0.9.8y PHP/5.4.25
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
代码:
<?php
$if_mod_since = ""; $headers = getallheaders();
while (list($header, $value) = each($headers)) {
if ( "If-Modified-Since" == $header )
{
$if_mod_since = $value;
break;
}
} if ( $if_mod_since != "" )
{
//告诉浏览器文档内容没有发生改变
header('HTTP/1.1 304 Not Modified');
exit(0);
}
else
{
header("Last-modified: Fri, 16 Mar 2007 04:00:25 GMT");
}
?>
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<style> </style>
</head>
<body>
<h1>hello world!11</h1>
<input type="text" value="test"/>
<input type="button" value="button"/>
<script type='text/javascript'>
$("[type='button']").click(function(){
$("[type='text']").val("button click");
})
</script>
</body>
</html>
ETAG
与 第一个 类似, 给出代码可运行演示。
<?php
$if_none_match = ""; $headers = getallheaders();
while (list($header, $value) = each($headers)) {
if ( "If-None-Match" == $header )
{
$if_none_match = $value;
break;
}
} if ( $if_none_match == "ead145f" )
{
//告诉浏览器文档内容没有发生改变
header('HTTP/1.1 304 Not Modified');
exit(0);
}
else
{
header("ETag: ead145f");
}
?>
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<style> </style>
</head>
<body>
<h1>hello world!11</h1>
<input type="text" value="test"/>
<input type="button" value="button"/>
<script type='text/javascript'>
$("[type='button']").click(function(){
$("[type='text']").val("button click");
})
</script>
</body>
</html>
Expires 和 Max-age 支持浏览器离线缓存有效期定制,即不访问服务器
给出连个php头,可实验验证, 通过chrome浏览器前进后退访问, 无http请求, 仍然可显示页面,
但是URL地址栏回车键, 或者F5都会引起http重新请求。
header("Max-age: 86400");
header("Expires: Tue, 20 Mar 2015 04:00:25 GMT");
http cache 原理实战演习的更多相关文章
- Guava 源码分析(Cache 原理 对象引用、事件回调)
前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理. 文末提到了回收机制.移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析. 在开 ...
- spring security 原理+实战
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- 编译原理实战——使用Lex/Flex进行编写一个有一定词汇量的词法分析器
编译原理实战--使用Lex/Flex进行编写一个有一定词汇量的词法分析器 by steve yu 2019.9.30 参考文档:1.https://blog.csdn.net/mist14/artic ...
- HVV奇兵—网页防篡改系统在网络安全实战演习中的妙用(上)
近年来,网络安全实战演习受到各大关基单位的高度关注.对于网络安全实战演习的防守方,防火墙.Web应用防火墙.态势感知.EDR.蜜罐等都是较为常见的防守工具,而网页防篡改系统则鲜有露脸的机会-- 很多人 ...
- Jupyter(Python)中无法使用Cache原理分析
前言 最近需要在Jupyter中写一个类库,其中有一个文件实现从数据库中读取空间数据并加载为Feature对象,Feature对象是cartopy封装的geomery列表,能够方便的用于作图等.因为有 ...
- MySQL事务原理&实战【官方精译】
事务隔离级别 事务隔离是数据库处理的基础之一.隔离是I中的首字母 ACID ; 隔离级别是在多个事务同时进行更改和执行查询时,对结果的性能和可靠性,一致性和可重复性之间的平衡进行微调的设置. Inno ...
- Guava 源码分析(Cache 原理)
前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨 ...
- MySQL的Query Cache原理分析
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC.每个Cache都是以SQL文本作为key来存的. 原理 ...
- jQuery对象数据缓存Cache原理及jQuery.data详解
网上有很多教你怎么使用jQuery.data(..)来实现数据缓存,但有两个用户经常使用的data([key],[value])和jQuery.data(element,[key],[value])几 ...
随机推荐
- ACM 素数
素数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 走进世博园某信息通信馆,参观者将获得前所未有的尖端互动体验,一场充满创想和喜悦的信息通信互动体验秀将以全新形式呈 ...
- 【Poj】 p2342 Anniversary party(树形DP第一道)
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5523 Accepted: 3169 ...
- 实用的Bootstrap的扩展和插件集合
bootstrap插件 http://www.missyuan.net/school/other_2014/other_16472.html http://www.oschina.net/news/5 ...
- javaweb之框架标签(day1 框架标签的使用)
框架标签 <frameset> --rows:按照行进行划分<frameset rows='80,*'> --rows:按照列进行划分<frameset cols='80 ...
- [CareerCup] 15.6 Entity Relationship Diagram 实体关系图
15.6 Draw an entity-relationship diagram for a database with companies, people, and professionals (p ...
- mysql错误代码整理
1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除 ...
- sql语句左右表连接理解
一句话,左连接where只影响坐标,右连接where只影响右表
- struts2--convention-plugin--零配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- 20145334赵文豪 《Java程序设计》第1周学习总结
20145334赵文豪 <Java程序设计>第1周学习总结 教材学习内容总结 第一周的学习在紧张中结束了,我们这周了解了各门课的基本内容与授课形式,在第一周java课程的的学习中我们学习了 ...
- BizTalk动手实验(十四)AS2传输非EDI消息
1 课程简介 本课程通过AS2协议完成XML文件的传输过程,传输之后同步接收MDN确认信息.通过本课程熟悉AS2传输解决方案的基本开发与配置方法. 2 准备工作 为了模拟实际的B2B交互过程,本实验需 ...