状态码(304 详解)

状态码类别

状态码 类别 原因短语
1xx 信息状态码 接收的请求正在处理
2xx 成功状态码 请求正常处理完毕
3xx 重定向状态码 需要进行附加操作以完成请求
4xx 客户端错误状态码 服务器无法处理请求
5xx 服务器错误状态码 服务器处理请求出错

HTTP 304状态码的详细讲解

304 状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。

整个请求响应过程如下:
  • 客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。服务端只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 (附加条件还有:If-Modified-Since、If-Match、If-None-Match、If-Range)
  • 对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
  • 因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。当这些缓存有效的时候,通过 Fiddler 或HttpWatch 查看一个请求会得到这样的结果:

第一次访问 200
按F5刷新(第二次访问) 304
按Ctrl+F5强制刷新 200

Last-Modified 与 If-Modified-Since
  • 1.基本定义
    Last-Modified 与If-Modified-Since 都是标准的HTTP请求头标签,用于记录页面的最后修改时间。

  • 2.发送方向
    Last-Modified 是由服务器发送给客户端的HTTP请求头标签
    If-Modified-Since 则是由客户端发送给服务器的HTTP请求头标签

  • 3.应用场景
    (1)Last-Modified
    在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
    Last-Modified: Fri, 12 May 2006 18:53:33 GMT
    后面跟的时间是服务器存储的文件修改时间
    (2)If-Modified-Since
    客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
    If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
    后面跟的时间是本地浏览器存储的文件修改时间

如果服务器端的资源没有变化,则时间一致,自动返回HTTP状态码304(Not Changed.)状态码,内容为空,客户端接到之后,就直接把本地缓存文件显示到浏览器中,这样就节省了传输数据量。

如果服务器端资源发生改变或者重启服务器时,时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。

以上操作可以保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

2xx 成功

  • 200 OK
    表示从客户端发来的请求在服务端正常处理了
  • 204 No Content
    表示只需要从客户端往服务器发送信息,而服务器不需要发送新信息内容的情况
  • 206 Partial Content
    表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求,响应报文里应该有 Content-Range 指定范围的实体内容

3xx 重定向

  • 301 Moved Permanently
    永久重定向,表示请求的资源已被分配了新的 URI,以后应使用资源现在所指定的 URI
  • 302 Found
    临时重定向,该状态吗表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI访问
  • 303 See Other
    该状态码表示请求对应资源存在另一个 URI,应该使用 GET 方法定向获取请求的资源

注意:当 301、302、303 响应状态码返回时,几乎所有浏览器会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送

  • 304 Not Modified
    该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但是从缓存获取资源
  • 307 Temporary Redirect
    临时重定向,于 302 有相同的含义,但它会遵照浏览器的标准,不会从 POST 变为 GET,但对处理响应行为时,每种浏览器可能出现不同的情况

4xx 客户端错误

  • 400 Bad Request
    该状态码表示请求报文中存在语法错误,当这种错误发生时,需要修改请求内容后再次发送请求
  • 401 Unauthorized
    该状态码表示发送的请求需要有通过 HTTP 认证(BASIC认证、DIGEST认证)的认证信息
  • 403 Forbidden
    该状态码表明请求资源的访问呗服务器拒绝了,服务器没有必要给出拒绝的详细理由。一般时访问权限出现某些问题(如从未授权发送源 IP 地址试图访问)等情况都是可能发生 403 的
  • 404 Not Found
    该状态码表示服务器上无法找到请求的资源,除此之外,也可以是服务器端拒绝请求且不行说明理由时使用

5xx 服务器错误

  • 500 Internal Server Error
    该状态码表示服务端在执行请求时发生了错误,也有可能是 web 应用存在的 bug 或某些临时的故障
  • 503 Service Unavailable
    该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。(如果事先知道解除以上状况需要的时间,最好写入 Retry-After 首部字段返回给客户端)

注意:状态码和状况的不一致,不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如 web 应用程序内部发生错误,状态码依旧返回 200 OK,这种情况也经常遇到

你可能感兴趣的:(网络)