代码编织梦想

理解

最近研究nginx日志的时候,对于304这个状态码产生了好奇。之前一直知道3XX系列的状态码表示重定向,但对于304的具体原理没有仔细研究过。

304 的标准解释是:客户端有缓冲的文档并发出了一个条件性的请求。服务器告诉客户端,原来缓冲的文档还可以继续使用。

完成这个几个动作包括服务器确认返回304给予客户端,主要包含几个http头信息,请求头If-None-Match、响应头ETag和响应头Cache-Control。

测试

为了更好的理解304状态码以及缓存,直接实验一把:
为了方便就使用express启动一个服务了(express几行代码就搞定了)

var express = require('express');
var app = express();

app.get('/', function(req, res) {
  res.send('hello world');
});
app.listen('8080')

启动之后,浏览器访问localhost:8080并观察请求,响应头。

第一次请求:
在这里插入图片描述
第二次请求:
在这里插入图片描述
第二次请求服务器返回了一个304。

在第一次请求服务器的时候在获取资源之后是会先把该资源缓存在本地的,同时服务器response返回了一个响应头ETag,ETag全称Entity Tag,用来标识一个资源。在具体的实现中,ETag可以是资源的hash值,也可以是一个内部维护的版本号。但不管怎样,ETag应该能反映出资源内容的变化,这是Http缓存可以正常工作的基础。服务器对于hello world这个字符串使用上述返回的ETag来表示,只要hello world这个资源不变,这个Etag就不会变。

客户端第二次请求服务器的时候,利用请求头If-None-Match来告诉服务器自己已经有个ETag为xxx的资源。如果服务器上的资源没有变化,也就是说服务器上的资源的ETag也是xxx的话,服务器就不会再返回该资源的内容,而是返回一个304的响应,告诉浏览器该资源没有变化,缓存有效,浏览器将直接调用本地缓存。

响应头Cache-Control

每个资源都可以通过Http头Cache-Control来定义自己的缓存策略,Cache-Control控制谁在什么条件下可以缓存响应以及可以缓存多久。 最快的请求是不必与服务器进行通信的请求:通过响应的本地副本,我们可以避免所有的网络延迟以及数据传输的数据成本。为此,HTTP 规范允许服务器返回一系列不同的 Cache-Control 指令,控制浏览器或者其他中继缓存如何缓存某个响应以及缓存多长时间。

Cache-Control 头在 HTTP/1.1 规范中定义,取代了之前用来定义响应缓存策略的头(例如 Expires)。当前的所有浏览器都支持 Cache-Control,因此,使用它就够了。

以下我来介绍可以再Cache-Control中设置的常用指令。

max-age

该指令指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒。例如:Cache-Control:max-age=60表示响应可以再缓存和重用 60 秒。需要注意的是,在max-age指定的时间之内,浏览器不会向服务器发送任何请求,包括验证缓存是否有效的请求,也就是说,如果在这段时间之内,服务器上的资源发生了变化,那么浏览器将不能得到通知,而使用老版本的资源。所以在设置缓存时间的长度时,需要慎重。

public和private

如果设置了public,表示该响应可以再浏览器或者任何中继的Web代理中缓存,public是默认值,即Cache-Control:max-age=60等同于Cache-Control:public, max-age=60。

在服务器设置了private比如Cache-Control:private, max-age=60的情况下,表示只有用户的浏览器可以缓存private响应,不允许任何中继Web代理对其进行缓存 - 例如,用户浏览器可以缓存包含用户私人信息的 HTML 网页,但是 CDN 不能缓存。

no-cache

如果服务器在响应中设置了no-cache即Cache-Control:no-cache,那么浏览器在使用缓存的资源之前,必须先与服务器确认返回的响应是否被更改,如果资源未被更改,可以避免下载。这个验证之前的响应是否被修改,就是通过上面介绍的请求头If-None-match和响应头ETag来实现的。

需要注意的是,no-cache这个名字有一点误导。设置了no-cache之后,并不是说浏览器就不再缓存数据,只是浏览器在使用缓存数据时,需要先确认一下数据是否还跟服务器保持一致。如果设置了no-cache,而ETag的实现没有反应出资源的变化,那就会导致浏览器的缓存数据一直得不到更新的情况。

no-store

如果服务器在响应中设置了no-store即Cache-Control:no-store,那么浏览器和任何中继的Web代理,都不会存储这次相应的数据。当下次请求该资源时,浏览器只能重新请求服务器,重新从服务器读取资源。

部分内容参考自: www.cnblogs.com/xinzhao/p/5099807.html

————————————————
版权声明:本文为CSDN博主「不能说的秘密go」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/canot/article/details/76359917
注:部分内容和排版有所修改。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_41287260/article/details/106037528

使用nginx访问FastDFS fastdfs nginx-爱代码爱编程

文中所有~~~均为同一个自定义文件夹名字,一般使用项目名称 2.1.为什么需要用Nginx访问? FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。 假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户端。此时FastDF

Spring Cloud使用指南-Ribbon-爱代码爱编程

客户端负载均衡-Ribbon 目录 1、Ribbon概述 2、整合Ribbon 3、后语 1、Ribbon概述 Ribbon是基于客户端的负载均衡算法、相较于Nginx、Ribbon的负责面很窄,只对所绑定的服务提供负载均衡,他将自己注册到Eureka后、就可以获得其所绑定服务的实例列表、然后根据配置的负载算法来指定一个微服务实例干活、值得注意的是

nginx代理图片访问-爱代码爱编程

nginx代理图片访问 首先配置nginx的代理物理路径 我的是在E盘下面的image 1 #图片的代理 2 server { 3 listen 80; 4 #配置访问的域名 5 server_name image.leyou.com; 6 7

nginx和php7配置一些常见问题的解决方法(fedora 31)-爱代码爱编程

1.nginx和php的重启命令 以下命令均为 dnf、apt、yum这些以软件包管理安装的php、nginx才会有的,源码安装除非配置了systemctl,否则下面的指令执行会报错,只能去源码安装的路径手动操作 nginx 启动服务:systemctl start nginx或nginx 强制关闭服务: pkill -9 nginx 重载配置:

NAT的工作机制-爱代码爱编程

NAT的工作机制 NAT的作用 ·作用 -通过将内部网络的私有IP地址翻译成全球唯一的 公网IP地址 使内部网络可以连接到互联网等外部网络上。 ·优点 -节省公有合法IP地址 -处理地址重叠 -安全性 ·NAT的缺点 -延迟增大 -配置和维护的复杂性 ·ANT实现方式 -静态转换 -Easy ip ·静态NAT概述 -静态转换

[nginx]日常配置笔记-爱代码爱编程

前言 多日不用nginx 怎么打开都忘记了,今天又熟悉熟悉,记录下笔记 一 命令 启动 nginx start nginx 关闭nginx nginx -s stop 验证nginx配置文件是否正确 重启 二 代理和负载均衡 127.0.0.1/baidu.com 代理百度 127.0.0.1 负载均衡 upstream wwwdemocom

SublimeText 配置跳转回上个光标坐标-爱代码爱编程

在 VisualStudio 可以通过 ctrl+- 的功能,跳转到上个光标所在的坐标。如在多个方法之间跳转,可以通过这个快捷键快速实现。在 SublimeText 可以在菜单的 Goto 里面找到 Jump Back 功能,这个功能就是对应 VisualStudio 的跳转回上个光标的功能,也就是向后定位功能 对应的 SublimeText 的快捷键

Servlet&HTTP&Request笔记-爱代码爱编程

文章目录 今日内容:更多文章请移步:[我的博客](http://www.echo20.top/)Servlet:HTTP:Request:案例:用户登录 今日内容: 1. Servlet 2. HTTP协议 3. Request 更多文章请移步:我的博客 Servlet: 1. 概念 2. 步骤 3. 执行原理 4. 生命周期 5.

超级厉害的几个网站,一般人我都不告诉-爱代码爱编程

今天给大家分享 一些超级实用方便的网站,一把人我都不告诉他们(小声逼逼),每个网站都很有用,下面上菜喽 1.http://www.uugai.com/ 一款logo免费制作的网站,在做一些临时的项目,很紧急要用一下的时候可以拿来用一下,非常的方便便捷。 2.https://www.iconfont.cn/ 阿里巴巴矢量图标库 这个不用多说了吧,太厉

Java用socket基于http协议搭建一个简易的http服务器-爱代码爱编程

目录 前言正文socket侦听localhost的端口HttpServerThread类的实现HttpServerThread类大致框架HttpServerThread类 run 方法的实现分析请求头信息尝试获取本地文件对象传输文件:发送响应包头传输文件:发送文件内容完整代码演示传输html页面传输图片404 not found 页面 前言

理解InfluxDB的logging,关闭HTTP access log-爱代码爱编程

Log and trace with InfluxDB InfluxDB writes log output, by default, to stderr, all logs are written to stderr.(about stderr see refe No.1). You can also redirect the log output,

Nginx 负载均衡缓存-爱代码爱编程

NGINX 配置 安装基础配置静态资源配置防盗链代理负载均衡缓存服务常见问题: 安装 是用鸟哥一键安装脚本,简单方便快捷,为什么不用呢? 下载地址:一键安装下载地址 默认安装目录是:/usr/local 下。 基础配置 user #设置nginx服务的系统使用用户 worker_processes