Skip to content

介绍下304过程

参考答案:

首先304状态码是对客户端有缓存情况下服务端的一种响应。

客户端在请求一个文件的时候,发现自己缓存的文件有 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,从而大大的降低带宽的消耗,对于用户的感觉也是提高。

通常来说,缓存是个好东西.如果你想提高自己网站的访问速度,缓存是必须要考虑的。可是在调试的时候,有时候需要阻止缓存,这样才能确保你所访问到的资源是最新的。

题目要点:

304状态码是在客户端已有缓存的情况下,服务端的一种响应,它告诉客户端可以直接使用缓存,无需重新下载完整的资源。

当客户端请求一个文件时,如果发现本地有缓存,会包含If Modified Since头信息,这个时间就是缓存文件的Last Modified时间。服务端通过比较这个时间和当前文件的修改时间来决定是否返回304(Not Modified)还是200(OK)。

对于静态文件,如CSS、图片等,服务器会自动完成Last ModifiedIf Modified Since的比较,并决定是否更新缓存。但对于动态页面,由于通常没有包含Last Modified信息,浏览器和网关不会缓存这些页面,每次请求都会返回完整的200响应。

为了给动态页面添加缓存加速,需要在响应头中添加Last Modified信息,并根据请求中的If Modified Since和文件的更新时间来决定返回304还是200。尽管返回304时会进行一次数据库查询,但可以避免后续更多的查询,且仅返回HTTP头信息而非页面内容,从而减少带宽消耗,提高用户体验。

总的来说,缓存是一个提升网站访问速度的好方法,但在调试时,有时需要阻止缓存以确保访问到最新的资源。