HTTP 204,304状态码
HTTP的状态码有很多种,主要有1xx(临时响应)、2xx(成功)、3xx(已重定向
)、4xx(请求错误)以及5xx(服务器错误)五个大类,每个大类还对应一些具体的分类。平时我们接触比较多的是200、400、500等。
204 No Content
意思等同于请求执行成功,但是没有数据
,浏览器不用刷新页面,也不用导向新的页面。如何理解这段话呢。还是通过例子来说明吧,假设页面上有个form,提交的url为http-204.htm,提交form,正常情况下,页面会跳转到http-204.htm,但是如果http-204.htm的相应的状态码是204,此时页面就不会发生转跳,还是停留在当前页面。另外对于a标签,如果链接的页面响应码为204,页面也不会发生跳转。
所以对于一些提交到服务器处理的数据,只需要返回是否成功
的情况下,可以考虑使用状态码204来作为返回信息
,从而省掉多余的数据传输
。
304 Not Modified
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
,从而大大的降低带宽的消耗
,对于用户的体验也是提高
。