(转)HTTP 304(Not Modified)和200(From Cache)的区别

news/2024/5/18 17:30:25

大家都知道200是正常,304是没有变化、没有修改。
但200是不是真的就“正常”,304背后又都做了什么?他是怎么判断没修改的?

200(From cache)是直接点击链接访问,输入网址按回车访问触发(这两种情况都不会有Etag);
304(Not Modified)是刷新页面时触发,或是设置了长缓存、或当Etag没有移除时触发。

先说说304
当你第一次请求一个资源的时候,server会同时生成并返回一个字符串在响应头里,叫Etag。
浏览器接到资源后,缓存资源的同时也会把这个Etag保存下来,成为If-None_Match 。Etag可以看作是一个资源的唯一标识,当你第二次请求这个资源的时候,请求头里会带着这个Etag,server会拿server该资源现在的Etag跟请求头中的If-None_Match做对比,然后看看If-Modified-Since过没过期,如果一样,直接告诉他:你就用本地的吧,我没变,就不给你返回了。所以返回了304,304就是这样。

再说说200 From Cache
这个虽然是200,但他根本就没有跟server做交互,直接拉的本地缓存。
上边已经说了From Cache的触发条件,但如果想一直持续From Cache不想304怎么办?
可以在Server端配置移除Etag,具体请听下回分解.

扩展:
想让浏览器缓存住php页面,为什么$_SERVER['HTTP_IF_MODIFIED_SINCE']为空?使用的nginx。

<?php
date_default_timezone_set('PRC');//时区设置 设置为 中国第八区时间
date_default_timezone_set ( "Asia/Shanghai" );

// 这里加@可以防止出错提示
$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE'];
echo $modified_time;
if (strtotime($modified_time) + 3600 > time()) 
{
    header("http/1.1 304");
    exit(0);
}
header("Last-Modified:".gmdate("D, d M Y H:i:s")." GMT");
header("Expires:".gmdate("D, d M Y H:i:s",time()+3600)." GMT");
header("Cache-Control: max-age=3600");
echo 'test';
echo "<br/>";

$time = date("Y-m-d H:i:s");
echo $time;

?>

clipboard.png

clipboard.png

If-Modified-Since是服务器进行判断,而非cgi程序判断,另外If-Modified-Since是上次服务器返回头部中的Last-Modified信息,如果返回的头部中没有Last-Modified,则请求时是不会带上,也就是说Last-Modified / If-Modified-Since是成对使用的。

什么是”Last-Modified”?
  在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
  Last-Modified: Fri, 12 May 2006 18:53:33 GMT
  客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
  If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
  如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

如果你真的想知道If-Modified-Since的内容,需要在nginx中fastcgi.conf配置

// 请求的头部的所有内容
fastcgi_param  REQUEST_HEADER     $request;

原文地址:
HTTP 304(Not Modified)和200(From Cache)的区别
什么是”Last-Modified”?


http://www.niftyadmin.cn/n/3172435.html

相关文章

CSS实现透明边框

border: 8px solid rgba(255,255,255,0.2);

angular run()运行块

和配置块不同&#xff0c;运行块在注入器创建之后被执行&#xff0c;它是所有AngularJS应用中第一个被执行的方法。 运行块是AngularJS中与main方法最接近的概念。运行块中的代码块通常很难进行单元测试&#xff0c;它是和应用本身高度耦合的。 运行块通常用来注册全局的事件监…

用react-native开发一个IOS NBA资讯app(一) ----构建基本项目(持续更新)

因为最近工作的原因&#xff0c;对app开发产生了浓烈的兴趣&#xff0c;但是感觉直接学习一门开发语言&#xff0c;构建个app也不知道要猴年马月了。前端时间也一直在看react,对react产生了好感&#xff0c;便一发不可收拾&#xff0c;看了阮老师的react入门教材&#xff0c;就…

Postman无返回值的说明

使用发送POST的男人时&#xff0c;后端接受到了请求&#xff0c;也可以返回响应&#xff0c;但是发送POST的男人却接受不到返回值&#xff0c;搞了半天没啥用&#xff0c;后来在设置中把请求超时的时间改成0(0就是一直等待服务器的返回消息)&#xff0c;Response出现了&#xf…

Chapter 2 ARMv8-A Architecture and Processors

ARMv8-A架构和处理器 变化&#xff1a; 1、大的物理地址&#xff0c;使得处理器能够访问超过4GB的物理内存 2、64位虚拟寻址&#xff0c;这使得虚拟内存超过了4GB的限制。这对于使用内存映射文件I/O或稀疏寻址的现代桌面和服务器软件来说很重要。 3、自动事件信号&#xff0c;这…

Docker ubuntu中更新软件源

cp /etc/apt/sources.list /etc/apt/sources.list_buckup -> 将/etc/apt目录下的文件进行备份&#xff0c;防止意外vi /apt/etc/sources.list 删除所有行(命令为ggdG)&#xff0c;并将最后的阿里软件源粘贴&#xff0c;使用其他的也ok apt-get clean -> 删除包缓存中的…

Chapter 13 Memory Ordering

第十三章 内存排序 如果你的代码直接与硬件或在其他核心上执行的代码交互&#xff0c;或者直接加载或写入要执行的指令&#xff0c;或者修改页表&#xff0c;你需要注意内存排序问题。在所有这些情况下&#xff0c;内存排序问题都由相关代码为您处理. 如果您正在编写操作系统内…

Docker mysql 和 flask容器连接 bug解决

我是用的 --linkcontainer_name:aka方法连接的两个容器&#xff0c;所以在使用SQLAlchemy连接mysql的时候&#xff0c;需要使用aka别名作为IP地址&#xff0c;如下所示。 <user>:<passwd>aka:<port>/<database>Docker 会把aka转化成mysql容器的地址&a…