HTTP 304 Not Modified

本文详细解析了HTTP 304响应状态码的标准解释及其在处理静态文件缓存时的作用,通过对比静态文件与动态页面的缓存策略,阐述了在动态页面中实现缓存加速的方法,包括如何在响应头部增加LastModified信息,以及根据IfModifiedSince和被请求内容的更新时间来决定返回304或200响应,以减少数据库查询和带宽消耗,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  调试的时候发现浏览器开发者工具下的Network下请求文件返回的Status是304,百度了下,明白了304的意思,以下是我的理解:

  304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
  如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
  因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。
  以上就是我对 HTTP 304 的一个理解。
### 关于 NGROK 返回 304 Not Modified 的解决方案 当遇到 NGROK 返回 `304 Not Modified` 响应时,这通常意味着客户端已经缓存了资源,并且该资源自上次请求以来未被修改过。为了处理这种情况并确保每次都能获取最新的响应数据,可以考虑以下几个方面: #### 修改服务器端配置以控制缓存行为 如果目标是防止浏览器或其他 HTTP 客户端使用本地缓存的数据,则可以在 Web 应用程序或反向代理(如 Nginx)中调整 HTTP 头部来影响缓存策略。 对于 Nginx 配置文件中的 location 或 server 指令部分,可以通过设置特定的状态码有效期来自定义缓存时间。然而,在提供的参考资料里提到的是关于如何设定不同状态码的有效期[^1],而针对 `304 Not Modified` 这种情况,可能更关注于禁用某些类型的缓存机制或者强制验证资源的新鲜度。 一种方法是在 Nginx 中加入如下指令来阻止对静态文件的条件 GET 请求返回 `304 Not Modified`: ```nginx location / { expires off; } ``` 上述代码片段通过关闭 Expires 和 Cache-Control 功能使得所有匹配此位置路径下的资源都不会受到这些头部的影响,从而避免触发 `304 Not Modified` 响应。 另外也可以尝试添加额外的头信息到响应中去改变默认的行为模式,比如下面的例子展示了怎样让浏览器总是重新加载页面而不是依赖其内部存储的内容副本: ```nginx add_header Cache-Control "no-store, no-cache, must-revalidate"; add_header Pragma "no-cache"; # 对于HTTP/1.0兼容性 ``` 以上措施能够有效地减少甚至消除因缓存引起的 `304 Not Modified` 结果的发生频率。 需要注意的是,虽然这样能解决问题,但也可能导致性能下降,因为每一次访问都会发起完整的下载过程而非利用已有的缓存版本。因此建议仅在必要情况下应用此类更改,并仔细权衡利弊得失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值