前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HTTP头信息中的参数Etag

HTTP头信息中的参数Etag

作者头像
Java架构师必看
发布于 2021-03-22 03:15:36
发布于 2021-03-22 03:15:36
2.2K0
举报
文章被收录于专栏:Java架构师必看Java架构师必看

服务器如果是集群,不同服务器返回的 Http Header 中的 Etag 参数不一样。如果是图片是程序生成的,我们可以用 no-cache 这些 header 来控制,但如果这些图片是 apache 或 nginx 等呢?

下面开始介绍 Etag:

       Etag在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件后面添加一个唯一的参数(相当于查询参数字符串),Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取 Etag发生变化的文件,减少浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了。

现在我们有个问题为什么要使用Etag呢?

Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法判断.原因是UNIX记录MTIME只能精确到秒.所以我们选择生成Etag,因为Etag可以综合Inode,MTime和Size,可以避免这个问题.

Etag的工作原理 Etag在服务器上生成后,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。我们常见的是使用If-None-Match.请求一个文件的流程可能如下: 新的请求 客户端发起HTTP GET请求一个文件(css ,image,js);服务器处理请求,返回文件内容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http头状态码为为200.

同一个用户第二次这个文件的请求 客户端在一次发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头中会包括上次这个文件的Etag(例如"2e681a- 6-5d044840"),这时服务器判断发送过来的Etag和自己计算出来的Etag,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;

注意.服务器又设置了Cache-Control:max-age和Expires时,会同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.

下面是在Apache中的Etag的配置

在Apache中设置Etag的支持比较简单,只需要在apache的配置中加入下面的内容就可以了:

FileETag MTime Size

注解:FileETag指令配置了当文档是基于一个文件时用以创建ETag(实体标签)应答头的文件的属性(ETag的值用于进行缓冲管理以节约网络带宽)。ETag的值由文件的inode(索引节点)、大小、最后修改时间决定。FileETag指令可以让您选择(如果您想进行选择)这其中哪些要素将被使用。主要关键字如下:

INode 文件的索引节点(inode)数 MTime 文件的最后修改日期及时间 Size 文件的字节数 All 所有存在的域,等价于:FileETag INode MTime Size None 如果一个文档是基于文件的,则不在应答中包含任何ETag头

在大型多WEB集群时,使用ETag时有问题,所以有人建议使用WEB集群时不要使用ETag,其实很好解决, 因为多服务器时,INode不一样,所以不同的服务器生成的ETag不一样,所以用户有可能重复下载(这时ETag就会不准),明白了上面的原理和设置后,解决方法也很容易,让ETag后面二个参数,MTime和Size就好了.只要ETag的计算没有INode参与计算,就会很准了.

如果动态程序要生成ETAG 也很简单,如: etag = ‘”‘ . md5(body) . ‘”‘;

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Python爬虫入门教程 3-100 美空网数据爬取
从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做“美空网”网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 下面这个网址
梦想橡皮擦
2019/01/22
1.5K1
Python爬虫入门教程 3-100 美空网数据爬取
Python 并发编程(一)之线程
常用用法 t.is_alive() Python中线程会在一个单独的系统级别线程中执行(比如一个POSIX线程或者一个Windows线程) 这些线程将由操作系统来全权管理。线程一旦启动,将独立执行直到
coders
2018/01/04
7850
Python 并发编程(一)之线程
Ruby 操作 MongoDB(2)
下面这张表是在不同版本 Ruby 语言,不同版本的 MongoDB 中此 Ruby Driver (mongo 2.2.5) 是否兼容的列表
franket
2021/10/19
4550
聊聊 Python 中的同步原语,为什么有了 GIL 还需要同步原语
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2024/05/01
1900
python操作MongoDB
文章目录 1. python操作MongoDB 1.1. 前言 1.2. 综合应用 python操作MongoDB 前言 下面推荐本人写的MongoDB的基本操作博文,介绍的还是比较详细的,喜欢的朋友可以去看看 MongoDB干货篇之安装 MongoDB干货篇之查询数据 MongoDB干货篇之更新数据 综合应用 下面是自己写的一个简单的操作,分别对应了增删改查,虽然不太全面,但是只是简单的示范了一下,当然更多的功能还是需要自己去完善的,因为代码中都有注释,这里就不再详细的说了 # codi
爱撒谎的男孩
2019/12/31
5170
Python操作MongoDB的工具类
windows离线安装python3.6.8环境:https://blog.csdn.net/qq262593421/article/details/111309116
静谧星空TEL
2022/01/05
1K0
Python操作MongoDB的工具类
[Python数据可视化]通过分析胸罩销售记录 发现了惊人的秘密
首先我们需要在搜索页面获取商品的id,为下面爬取用户评价提供productId。key_word为搜索的关键字,这里就是【胸罩】
龙哥
2019/07/30
7040
[Python数据可视化]通过分析胸罩销售记录 发现了惊人的秘密
Python操作MongoDB
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
菲宇
2019/10/22
5060
《MongoDB极简教程》第二章 MongoDB 基本命令(Shell)
MongoDB的所有请求都以命令的形式发出,支持的命令列表参考Database Commands
一个会写诗的程序员
2018/08/20
5500
爬虫(105)pymongo, 这一篇文章够了,值得收藏
学了那么多的爬虫库,怎么能没有数据库这个东东呢?在开发过程中,数据是必不可少的,数据库也是应运而生了,数据和数据库这两个兄弟是缺一不可的
公众号---人生代码
2020/05/16
1.6K0
MongoDB 介绍和操作
MongoDB 和 Redis 一样均为 key-value 存储系统,它具有以下特点:
IT茂茂
2020/03/05
4.5K0
MongoDB 介绍和操作
py3_cookbook_notes_03
并发编程 启动与停止线程 # Code to execute in an independent thread import time def countdown(n): while n > 0: print('T-minus', n) n -= 1 time.sleep(5) # Create and launch a thread from threading import Thread t = Thread(target=countdown,
jeremyxu
2018/05/10
9840
python操作mongodb数据库
(6) $push: 和 $ pushAll 都是向数组属性添加元素。# 好像两者没啥区别
bear_fish
2018/09/20
1.8K0
读者投稿:使用redis和mongodb下载小说,并用pytest做测试
周末为了熟悉mongodb和redis,写了一个抓取《白夜行》小说的程序,并且用pytest测试框架做单元测试, 使用了线程池加快下载速度:
青南
2019/01/23
7690
Python 基于pymongo操作Mongodb学习总结
如果连接用户名和密码包含诸如':', '/', '+' 及'@'保留字符,则使用前应该先进行编码,如下:
授客
2024/01/29
4920
MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)
PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式。
Python攻城狮
2018/08/23
1.1K0
MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)
MongoDB使用小结:一些常用操作分享
本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell、pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。
拓荒者
2019/09/06
2.1K0
Python也能操作MongoDB数据库
作为非关系数据库的代表--Mongo,可以说是让人又爱又恨,让人爱的是它的便捷性,让人恨的是它的配置,实在是坑多。那么今天我们就来深入剖析它吧。
Python进阶者
2021/08/20
7230
挑战30天学完Python:Day27 Python mongodb
Python是一种后端技术,它可以连接到不同的数据库应用程序。它可以连接到SQL和noSQL数据库。
MegaQi
2023/10/21
2420
挑战30天学完Python:Day27 Python mongodb
Python操作MongoDB看这一篇就够了
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。 1. 准备工作 在开始之前,请确保已经安装好了MongoDB并启动了其服务,并且安装好了Python的PyMongo库。 2. 连接MongoDB 连接MongoDB时,我们需要使用PyMongo库里面的MongoClient。一般来说,传入MongoDB的
崔庆才
2018/06/25
23K0
推荐阅读
相关推荐
Python爬虫入门教程 3-100 美空网数据爬取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档