当前位置: 首页 > news >正文

304状态码

HTTP 304状态码表示“未修改”(Not Modified),是一个特殊的响应状态码。它用于告诉客户端,自从上次请求以来,目标资源没有发生变化,因此客户端可以继续使用它所缓存的版本,而无需重新下载。

使用场景

当浏览器已经下载了某个资源,并且该资源具有一定的缓存策略时(例如使用Cache-ControlETag或者Last-Modified标头),在后续访问相同资源时,浏览器会向服务器发送带有条件的请求:

  • 如果使用Last-Modified验证,在请求中附带If-Modified-Since标头。
  • 如果使用ETag验证,则在请求中附带If-None-Match标头。

服务器接收到这些条件性请求后会检查资源的最新状态:

  • 如果资源未被修改:服务器会返回304状态码,不包括任何响应体,表明现有的缓存仍然有效,浏览器应当继续使用它。
  • 如果资源已更新:服务器将返回200状态码和新的资源内容。

304与缓存

304状态码减少了网络带宽的消耗,因为服务器只需要发送响应头而无需发送整个资源。所以,虽然每次都会产生HTTP请求,但是由于响应体为空,相比直接下载整个资源,仍然可以节约时间和带宽。

示例

假设浏览器第一次请求了一个图片资源,并收到了以下响应头:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 12345
Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT
ETag: "a1b2c3d4"
Cache-Control: max-age=3600

当浏览器下次请求相同的资源时(并且处于max-age时间之内),它可能会发送类似如下的请求头:

GET /image.jpg HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 21 Oct 2020 07:28:00 GMT
If-None-Match: "a1b2c3d4"

服务器会检查If-Modified-SinceIf-None-Match标头,并确定图片自上次请求以来未被修改。随后,服务器响应如下:

HTTP/1.1 304 Not Modified
Date: Wed, 21 Oct 2020 08:00:00 GMT

注意,响应中没有Content-Length和实体主体。浏览器收到304响应后,会从本地缓存中加载图片。

总结

HTTP 304状态码是协商缓存机制的一部分,使得Web应用能够更高效地利用缓存,从而减少数据传输量、降低服务器负载、提高页面加载速度。对于Web开发者来说,合理配置响应头中的Cache-ControlETagLast-Modified等,能够有效地控制资源的缓存行为。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SOMEIP_ETS_067: UINT8Array_with_Length_0_strips_Payload
  • 应用程序编程接口 (API) — 简单解释
  • 飞睿智能家居人体微动感知雷达模组,宠物喂食器、LED灯控连续波雷达感应开关原理
  • 计算机网络信息安全,零基础入门到精通,收藏这一篇就够了!
  • TTS 文本 vs SSML
  • MIT APP Inventor服务器版编译
  • 关于平扫和增强磁共振的思考
  • Gradle安装保姆级教程
  • ProxySQL 读写分离配置
  • C#笔记之三 委托
  • Linux包管理工具yum
  • 【前端储存】之localStrage、sessionStrage和Vuex
  • RabbitMQ消息的重复消费问题如何
  • ARM32开发——(十四)GD32F4_DMA功能查询
  • 分布式设计原理——CAP原则
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [译]Python中的类属性与实例属性的区别
  • 11111111
  • HashMap剖析之内部结构
  • Java小白进阶笔记(3)-初级面向对象
  • Laravel 菜鸟晋级之路
  • leetcode386. Lexicographical Numbers
  • OSS Web直传 (文件图片)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue小说阅读器(仿追书神器)
  • 大型网站性能监测、分析与优化常见问题QA
  • 基于 Babel 的 npm 包最小化设置
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何选择开源的机器学习框架?
  • 微服务框架lagom
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Linux权限管理(week1_day5)--技术流ken
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (¥1011)-(一千零一拾一元整)输出
  • (2)MFC+openGL单文档框架glFrame
  • (3)(3.5) 遥测无线电区域条例
  • (9)STL算法之逆转旋转
  • (a /b)*c的值
  • (AngularJS)Angular 控制器之间通信初探
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (转)德国人的记事本
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .md即markdown文件的基本常用编写语法
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net实现SCrypt Hash加密
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • @PostConstruct 注解的方法用于资源的初始化
  • [001-03-007].第07节:Redis中的事务