状态码就是当客户端向服务器端发送请求时, 描述返回的请求结果, 借助状态码可以知道服务器端是正常处理了请求还是出现了错误
状态码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
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<h1>Forbidden</h1>
<p>You don't have permission to access the requested resource.</p>
</body>
</html>
在上述示例中,服务器返回了 403 Forbidden 响应,说明客户端没有权限访问请求的资源。响应中的 HTML 内容通常包含有关拒绝访问的描述信息,以帮助用户或开发人员了解拒绝访问的原因。
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
这可能是因为请求的 URL 路径是无效的、资源已被移除,或者资源从未存在过。
关键点总结:
示例:
httpCopy codeHTTP/1.1 404 Not Found
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>The requested resource could not be found on this server.</p>
</body>
</html>
在上述示例中,服务器返回了 404 Not Found 响应,说明客户端请求的资源未被找到。响应中的 HTML 内容通常包含有关资源未找到的描述信息,以帮助用户或开发人员了解请求的资源为何未找到。
5XX的响应结果表明服务器本身发生错误
HTTP 状态码 500 Internal Server Error 表示服务器在执行请求时发生了意外的错误,导致服务器无法完成请求。这是一个通用的服务器错误状态码,用于指示服务器遇到了未能处理的异常情况。
关键点总结:
示例:
httpCopy codeHTTP/1.1 500 Internal Server Error
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
<title>500 Internal Server Error</title>
</head>
<body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.</p>
</body>
</html>
在上述示例中,服务器返回了 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
<!DOCTYPE html>
<html>
<head>
<title>503 Service Unavailable</title>
</head>
<body>
<h1>Service Unavailable</h1>
<p>The server is currently unable to handle the request. Please try again later.</p>
</body>
</html>
在上述示例中,服务器返回了 503 Service Unavailable 响应,说明服务器暂时无法处理请求。Retry-After
头部字段指示客户端在多少秒后可以重试请求。这个信息对于客户端有助于决定何时可以重新尝试访问服务。
状态码和状况的不一致
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回2000K,这种情况也经常遇到。