状态码就是当客户端向服务器端发送请求时, 描述返回的请求结果, 借助状态码可以知道服务器端是正常处理了请求还是出现了错误
状态码200 OK, 三位数字和原因短语构成
数字第一位指定了响应类别, 后两位无分类, 相应类别有以下几种
状态码一共60多种, 具有代表性的有14个
2XX的响应结果表明请求被正常处理了
表示从客户端发来的请求在服务器端被正常处理
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,使用GET 方法时,对应请求资源的实体会作为响应返回:而使用HEAD方法时,对应请求资源的实体首部不随报文主体作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)。
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如当从浏览器发出请求处理后,返回204 响应,那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容
3XX 响应结果表明浏览器需要执行某些也输的处理以正确处理请求
**永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的URI。**也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存。
像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠就会产生301状态码。
临时性重定向. 该状态码表示请求的资源已经被分配了新的URI, 希望用户(本次)能使用新的URI访问
和301Moved Permanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URI
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
303状态码和302 Found状态码有着相同的功能,303状态码明确表示客户端应当采用GET 方法获取资源,这点与302状态码有区别, 比如,当使用POST方法访问CGI程序,其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去时,返回303状态码虽然302Found状态码也可以实现相同的功能,但这里使用303状态码是最理想的。
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。
HTTP 状态码 304 Not Modified 表示客户端发送了一个条件式请求(通常是包含了 If-Modified-Since
或 If-None-Match
头部字段的请求),并且服务器判断请求的资源自上次请求后没有发生变化,无需重新传输整个资源。服务器返回 304 状态码时,表示客户端的缓存仍然是最新的,可以直接使用缓存而无需重新获取资源。
具体而言,当客户端请求一个资源,并且该资源在服务器上自客户端上次请求之后没有发生变化时,服务器可以返回 304 状态码,告知客户端可以继续使用它在缓存中保存的版本,而不用重新传输整个资源。
示例:
HTTP/1.1 304 Not Modified
Date: Wed, 01 Dec 2023 12:00:00 GMT
这里的关键点是服务器在响应中没有返回实体主体,因为实际的资源内容并没有被传输。客户端收到 304 响应后,可以直接使用本地缓存,无需重新下载资源。
条件式请求的头部字段示例:
GET /resource HTTP/1.1
Host: www.example.com
If-Modified-Since: Tue, 30 Nov 2023 12:00:00 GMT
在上述请求中,客户端使用了 If-Modified-Since
头部字段,表示只有在指定的时间之后资源发生了变化,才需要返回新的资源;否则,返回 304 Not Modified。这有助于减轻服务器的负担,提高网络效率,因为只有在资源发生变化时才需要重新传输。
HTTP 状态码 307 Temporary Redirect 表示请求的资源已经被临时移动到另一个位置,但客户端应该继续使用原始的请求 URI 发起请求。**与 302 Found 不同,307 明确要求客户端保持原始的请求方法和请求体不变,并在新的 URI 上重新发起请求。**这个状态码通常用于处理 POST 请求,以确保客户端继续使用相同的请求方法重新发起请求。
关键点总结:
示例:
httpCopy codeHTTP/1.1 307 Temporary Redirect
Location: /new-location
这里的关键是客户端收到 307 响应后,会继续使用原始请求的方法和请求体,将请求发送到新的 URI /new-location
,而不会改变原始请求的方式。
这种行为有助于确保客户端在重定向时继续使用相同的请求方法,尤其是对于包含了请求体(例如 POST 请求)的情况。如果使用 302 Found,有些客户端可能会将 POST 请求改为 GET 请求,而 307 明确阻止了这种行为。
4XX 的响应结果表明客户端是发生错误的原因所在
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像200 0K一样对待该状态码。
HTTP 状态码 401 Unauthorized 表示客户端请求需要进行身份验证,但未提供有效的身份验证凭据或提供的凭据无效。这通常要求用户在继续请求之前提供有效的用户名和密码。
关键点总结:
WWW-Authenticate
头部字段,其中包含关于如何提供有效凭据的信息。示例:
httpCopy codeHTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Example"
在上述示例中,服务器返回了 401 响应,指示客户端请求未经授权。WWW-Authenticate
头部字段提供了有关如何提供有效凭据的信息,这里是使用基本身份验证(Basic Authentication)并提供领域(realm)“Example”。客户端在收到这个响应后,应该根据服务器要求提供正确的用户名和密码,然后重新发起请求。
该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。
未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可能是发生403的原因
关键点总结:
示例:
httpCopy codeHTTP/1.1 403 Forbidden
Content-Type: text/html
403 Forbidden
Forbidden
You don't have permission to access the requested resource.
在上述示例中,服务器返回了 403 Forbidden 响应,说明客户端没有权限访问请求的资源。响应中的 HTML 内容通常包含有关拒绝访问的描述信息,以帮助用户或开发人员了解拒绝访问的原因。
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
这可能是因为请求的 URL 路径是无效的、资源已被移除,或者资源从未存在过。
关键点总结:
示例:
httpCopy codeHTTP/1.1 404 Not Found
Content-Type: text/html
404 Not Found
Not Found
The requested resource could not be found on this server.
在上述示例中,服务器返回了 404 Not Found 响应,说明客户端请求的资源未被找到。响应中的 HTML 内容通常包含有关资源未找到的描述信息,以帮助用户或开发人员了解请求的资源为何未找到。
5XX的响应结果表明服务器本身发生错误
HTTP 状态码 500 Internal Server Error 表示服务器在执行请求时发生了意外的错误,导致服务器无法完成请求。这是一个通用的服务器错误状态码,用于指示服务器遇到了未能处理的异常情况。
关键点总结:
示例:
httpCopy codeHTTP/1.1 500 Internal Server Error
Content-Type: text/html
500 Internal Server Error
Internal Server Error
The server encountered an internal error and was unable to complete your request.
在上述示例中,服务器返回了 500 Internal Server Error 响应,说明在处理请求时发生了服务器内部错误。响应中的 HTML 内容通常包含有关错误的描述信息,以帮助用户或开发人员了解发生的问题。一般而言,500 状态码表明服务器需要进一步调查和解决问题。
HTTP 状态码 503 Service Unavailable 表示服务器暂时无法处理请求,通常是因为服务器过载或正在进行维护。这个状态码告诉客户端,服务器当前无法提供请求的服务,但这可能是暂时的情况。
关键点总结:
Retry-After
头部字段,指示客户端在多少时间内可以重试请求。示例:
httpCopy codeHTTP/1.1 503 Service Unavailable
Content-Type: text/html
Retry-After: 3600
503 Service Unavailable
Service Unavailable
The server is currently unable to handle the request. Please try again later.
在上述示例中,服务器返回了 503 Service Unavailable 响应,说明服务器暂时无法处理请求。Retry-After
头部字段指示客户端在多少秒后可以重试请求。这个信息对于客户端有助于决定何时可以重新尝试访问服务。
状态码和状况的不一致
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回2000K,这种情况也经常遇到。