原文地址: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不同点的更多相关文章

  1. ASP.NET缓存OutputCache和Response.Cache之C#后台设置

    一.ASPX页面缓存页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明<%@ OutputCache Duration="60" VaryByParam=&qu ...

  2. Nginx Errors: upstream response cache error

    Nginx Errors upstream response cache error *2470578 an upstream response is buffered to a temporary ...

  3. Cache及(HttpRuntime.Cache与HttpContext.Current.Cache)

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/avon520/archive/2009/11/25/4872704.aspx .NET中Cache有两种调用方式:Ht ...

  4. 如何使用event 10049分析定位library cache lock and library cache pin

    Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...

  5. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  6. HTTP请求(Request)和回应(Response)对象

    附录H HTTP请求(Request)和回应(Response)对象 57 http://djangobook.py3k.cn/ Django使用request和response对象在系统间传递状态. ...

  7. 关于library cache lock和row cache lock产生的常见原因

    这两个等待事件其实很少出现在top5列表中,一般都没什么印象,在此整理记录以便以后查阅. 常见的library cache lock产生的原因在<高级OWI与Oracle性能调查>这本书和 ...

  8. Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache

    在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是Sy ...

  9. ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播

    ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播 Cortex-A9的多喝CPU可以接收和执行一致性广播操作,当其使能并处于SMP模式 ...

  10. cache:annotation-driven" 的前缀 "cache" 未绑定

    问题: Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 29 in XML ...

随机推荐

  1. python3 selenium 安装以及验证

    1. 相关链接 官方网站:http://www.seleniumhq.org GitHub:https://github.com/SeleniumHQ/selenium/tree/master/py ...

  2. niosii dma实验中的一点感想

    1,使用nios给出的驱动函数的顺序一般为1,清中断2,写控制寄存器,3,写参数寄存器4,中断注册,5,开始工作.因为开始工作控制位在控制寄存器中,所以会想到到最后一块写,省事,但是在dma试验中发现 ...

  3. CoreDNS kubernetes 安装使用

     kubernetes 以前是skydns 后面变为 dnsmasq,coredns 也是一个不错的工具 1. 准备环境 安装 kubernetes 配置 kubelet 的cluster-dns 2 ...

  4. c&c++ datetime

    时间函数之间的关系 struct tm { int tm_sec; // 代表目前秒数,正常范围0-59,但允许至61秒: int tm_min; // 代表目前分数,范围为0-59. int tm_ ...

  5. STM32从boot跳转到app失败

    现象:在每次boot执行完跳转到APP时,都会跑飞 原因:在boot中使用到了USART和TIM,boot执行完没有关闭总中断 方法:在boot执行完跳转之前关闭中断,__disable_irq() ...

  6. mac book 华为C8815不能debug

    最近遇到一个头疼的问题,华为c8815机器,死活不能在mac下debug,虽然最终是能够debug了,但是走了很多弯路. (1)以为是mac的系统问题,所以重装了系统.为了重装系统,备份资料,用快盘上 ...

  7. 拦截导弹简单版(读入一串整数时getline(cin,s) stringstream is(s);)

    拦截导弹简单版 时间限制: 1 Sec  内存限制: 128 MB提交: 40  解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系 ...

  8. entering power save mode无法开机解决办法

    标签(空格分隔): 服务器 问题描述: 服务器型号为IBM system x 3755 m3.服务器在搬动之前运行良好,换完位置之后出现按完电源键后无法进入系统,通过显示器看到entering pow ...

  9. Git使用点滴记录: You have no permission to access this repo.

    代码托管在https://coding.net上面,之前Git用https的方式都好好的,没有出什么问题.结果今天git pull代码的时候一直提示以下信息: remote: Coding.net T ...

  10. PyYAML和configparser模块讲解

    Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation ymal主要用于配置文件. Co ...