【转】request的cache-control和response cache-control不同点
原文地址:http://www.cnblogs.com/lwhkdash/archive/2012/11/04/2748291.html
HTTP协议中,关于一些头域的解释很模糊,网上的解释有些甚至是打架的,例如cache-control:no-cache,为了搞清这个头,google了不少资料,但很多都是各有各说法,甚至相互矛盾。http header中cache-control无疑是非常重要的一个头,往往涉及到性能问题,缓存,缓存代理等等都无法避免跟cache-control打交道。当然还有其他一些头域如last-modified,但它们含义都非常明确,至少没有cache-control那么含糊。
就连浏览器之间,对cache-control也有不同的理解,导致了对这个头的不同的表现。
网上很多关于cache-control的资料写得很模糊,我觉得很多都没有,或者可能是忽略了几个地方,使得我们看着这些资料的时候,似懂非懂。或者作者觉得某些地方足够容易理解,所以根本不觉得需要强调,但正是这些被忽略掉的“前提条件”令我们即使看完资料,也很难弄懂问题。那些对cache-control进行解释的资料通常会忽略的一些"前提条件"有这几个:
1.cache-control是出现在response还是request中。很多资料在解释cache-control时候,都没有指明是response中的cache-control(也就是由服务器应答时发送的cache-control)还是request中的cache-control(也就是由用户代理,通常是浏览器,请求资源时发送的cache-control)。
2.什么是缓存。“缓存”一词会有N种解释,特别是一些翻译自英文的资料。“缓存”可以指缓存的对象(object),也可以指HTTP消息链上的缓存系统,例如浏览器的缓存系统,和代理服务器上的缓存,或者一些专为缓存而设计的代理服务器(例如squid),也可以是原始服务器上的缓存(例如c#的cache对象)。而另一方面,根据语境不同,“缓存”也有可能指缓存的机制....N多。所以一些资料当忽略了这些,读者看了后,旧疑问还没搞清楚,又来了新疑问。
而说到HTTP链上的缓存系统,我们一般指浏览器的缓存系统,和代理服务器的缓存。
我所知道的关于cache-control指令的一些情况是:
当cache-control出现在request中:
cache-control:no-control 告诉HTTP消息链上的缓存系统(也就是浏览器的缓存和代理服务器上的缓存),本次请求要求忽略一齐缓存,必须是原始服务器重新计算生成回应给用户。所以,即使浏览器上的本地缓存未过期,或者代理服务器上的缓存未过期,都不要将这些缓存作为回应。当我们在浏览器中强制刷新页面(按ctrl+F5),发送的就是这个头(不同很多浏览器将cache-contro:no-cachel和pragam:no-cache两个头一起发送)
pragma:no-cache:和cache-control:no-control一样,不过出于兼容HTTP/1.0,所以有些浏览器会保留这个头。注意pragma:no-cache只应该出现在Request中,表明不想获取缓存。HTTP没有哪条条文对Response中的pragma:no-cache进行定义,所以Response中的pragma:no-cache是无效的。
当cache-control出现在response中:
cache-control:no-control 服务器告诉HTTP消息链上的缓存系统(比如varnish, squid,cdn等),不要缓存这个response结果。其实这个不是百分百肯定,而且不同浏览器好像接收到这个头时也有不同反应。
当response header有cache-control:no-control时:
chrome:再访问相同的URL时候是发出if-modified-since。这说明即使接收到cache-control:no-contro,chrome也会进行缓存。
IE9:再次访问相同URL时,跟第一次访问(无缓存情况下)一样,没有if-modified-since,也没有其他缓存相关的头域,而且缓存文件夹也没有缓存文件。也就是说,IE9接收到cache-control:no-contro,不会将response内容缓存起来。
FF:跟IE9行为类似
而另外,cache-control:no-store出现在response中才有意义,意思是告诉缓存系统不要缓存或者存储response内容(不要任何形式的存储,包括存储在缓存文件夹中,以免一些敏感信息外泄)。chrome,IE9,FF对这个头的实现是一样的。当接收到有这个头的response,三个浏览器的缓存目录都找不到相关的缓存文件。
【转】request的cache-control和response cache-control不同点的更多相关文章
- ASP.NET缓存OutputCache和Response.Cache之C#后台设置
一.ASPX页面缓存页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明<%@ OutputCache Duration="60" VaryByParam=&qu ...
- Nginx Errors: upstream response cache error
Nginx Errors upstream response cache error *2470578 an upstream response is buffered to a temporary ...
- Cache及(HttpRuntime.Cache与HttpContext.Current.Cache)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/avon520/archive/2009/11/25/4872704.aspx .NET中Cache有两种调用方式:Ht ...
- 如何使用event 10049分析定位library cache lock and library cache pin
Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- HTTP请求(Request)和回应(Response)对象
附录H HTTP请求(Request)和回应(Response)对象 57 http://djangobook.py3k.cn/ Django使用request和response对象在系统间传递状态. ...
- 关于library cache lock和row cache lock产生的常见原因
这两个等待事件其实很少出现在top5列表中,一般都没什么印象,在此整理记录以便以后查阅. 常见的library cache lock产生的原因在<高级OWI与Oracle性能调查>这本书和 ...
- Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache
在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是Sy ...
- ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播
ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播 Cortex-A9的多喝CPU可以接收和执行一致性广播操作,当其使能并处于SMP模式 ...
- cache:annotation-driven" 的前缀 "cache" 未绑定
问题: Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 29 in XML ...
随机推荐
- 转载FPGA学习之内嵌乘法器调用
补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别 ...
- haproxy中两个常用的宏
list_for_each(pos, head) pos.head 都为list类型 一般来说,head是list的虚拟头,依次取list上的各个节点 container_of(ptr, type, ...
- css控制div下图片自适应解决方法:图片不超过最大宽度
我们(特别是像我一样的菜鸟)经常会遇到一个问题——图片自适应.这个问题是很普遍的.在文章区,在论坛,可以这么说:哪儿需要上传图片,哪儿就存在这个问题,而论坛上也不时有人询问.为什么?原因很简单,我们不 ...
- 用css来写一个背景图片的切换
代码如下: <!DOCTYPE HTML> <htmllang="en-US"> <head> <meta charset="U ...
- TableView刷新 局部刷新等
1.对整个页面刷新 [ tableView reloadData]; 2.对某一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithI ...
- Android 控件之Spinner
Spinner用来显示列表项,类似于一组单选框RadioButton.下面瞥一下它的效果. 源码下载 一.概述 Spinner是一个每次只能选择所有项的一个项的控件.它的项来自于与之相关联的适配器中. ...
- 20位活跃在Github上的国内技术大牛
登录|注册 leon-这个程序员不闷骚的博客 喜欢leon,有追求有原则有爱心的杀手,做一个有追求的程序员,代码是程序员的朋友,虽然没有热情,但是非常忠实.希望拥有一身绝世武功,再配一把绝世好 ...
- linux(6)
第十五单元 软件包的管理 [本节内容]1. 使用RPM安装及移除软件(详见linux系统管理P374)1) 掌握RPM的定义:RPM就是Red Hat Package Manger(红帽软件包管理工具 ...
- 简述FPGA的一些优势
优势一: 更大的并行度.这个主要是通过并发和流水两种技术实现. A:并发是指重复分配计算资源,使得多个模块之间可以同时独立进行计算.这一点与现在的多核和SIMD技术相似.但相对与SIMD技术,FPGA ...
- SpringCloud子项目
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...