一、基本概念
HTTP 状态码是客户端向服务端发起请求后,服务端返回的状态码及状态信息,状态码一般由三位数字组成,状态码的首字母一共有5种,分别是1-5,代表着5种不同的类型信息。以下是类型信息与具体的状态码信息。
二、状态码类别
1xx:通知信息,http服务器接收到请求,等待客户端的进一步消息发送。
100("Continue"):继续发送请求(服务端已经接收到一部分,继续发送剩下的请求)。
101("Switching Protocols"):切换不同的协议,可切换到高版本的协议或者其他协议。在使用 Websoket 时就是先使用 HTTP 协议握手,再切换到 Websoket 协议进行数据传输。
102("Processing"):由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
2xx:请求成功,代表请求已经被服务器成功接收并处理。
200("Ok"):服务器接收到请求并成功处理了。
201("Created"):请求已经被实现,同时也创建了一个新的资源。
202("Accepted"):请求已经被接收,但尚未处理,有可能处理,也有可能出现异常。
203("Non-Authoritative Information"):服务器已经成功处理了请求,但是有些报文头并非来自本服务器。
204("No content"):服务器已经成功处理了请求,但不返回响应体。
205("Reset Content"):服务器已经成功处理了请求,但是没有返回响应体,需要客户端重置数据结构。
206("Partial Content"):服务器已经成功处理了部分GET请求。
207("Partial Content"):由WebDAV(RFC 2518)扩展的状态码,代表之后的消息将是一个XML消息。
3xx:重定向,需要进一步的操作才能得到资源。
300("Multiple Choices"):多种选择,请求的资源可以有多种表示,服务器根据不同的表示重定向到不同的资源。
301("Moved Permanently"):永久重定向,表示旧地址资源已经被永久的移除了(资源不可以访问了),搜索引擎在抓取新内容的同时也将网址换位重定向之后的地址。
302("Move temporarily"):临时重定向,表示旧地址还在,只是临时将旧地址跳转到新地址(当一个网页24-48小时临时移动到一个新的地址)。
//例:将当前访问路径重定向到百度页面。
res.status('302');
res.redirect('https://www.baidu.com');
//设置之后再访问当前路径,会重定向到 'https://www.baidu.com',状态为 200,
//但是当前路径请求的状态为 302。
303("See Other"):一个资源可以在其他URL上被访问到。
304("Not Modified"):所请求的资源未做任何修改,所以也不会返回响应体。应用场景:协商缓存 Last-Modified 修改时间小于或等于 If-Modified-since。
305("Use Proxy"):所请求的资源必须通过代理访问。
306("Switch Proxy"):未使用,已经废弃的状态码。
307("Temporary Redirect"):临时重定向,请求没有被处理,需要发送到另外一个URL上。
//例:后台设置了当前访问路径重定向到百度页面。
res.status('302');
res.redirect('http://www.baidu.com');
//可以看到以上地址写的是 'http://www.baidu.com',
//但是百度页面正确地址是 'https://www.baidu.com'(注意是 https)。
//所以在发送请求的时候会先重定向到 'http://www.baidu.com',该请求状态为 307,
//再重定向到正确的地址 'https://www.baidu.com',状态为 200。
308("Permanent Redirect"):永久重定向,请求没有被处理,需要发送到另外一个URL上。
重定向原因:
1. 网站目录结构调整;
2. 网页地址改变(想换个更合适的域名);
3. 网页拓展名改变(如 .php 改成 .html);
4. 注册了多个域名的网址从定向到主站点(便于搜索引擎统计访问量)。
4xx:客户端错误,认证信息错误、语法错误、约定的数据格式错误等。
400("Bad Request"):当前请求不被服务器所理解,语义有误(HTTP/1.1 的所有请求报文中必须包含一个 Host 头字段。如果一个 HTTP/1.1 请求缺少 Host 头字段或者设置了超过一个的 Host 头字段就会返回400)。或者缺少请求参数。
401("Unauthorized"):发送的请求需要通过http认证。
402("Payment Required"):保留,为将来使用。
403("Forbidden"):服务器已经接收请求,但是拒绝执行。出现场景:跨域。
404("Not Found"):最常见错误,请求的资源不在服务器上。
405("Method Not Allowed"):请求方式不被允许。
406("Not Acceptable"):服务端无法满足客户端的请求头信息(比如服务端没有客户端想要的类型资源文件或者可以匹配的字符集版本时)。
407("Proxy Authentication Required"):使用代理服务器,并需要身份验证。
408("Request Timeout"):客户端请求超时,没法在服务器规定的时间内完成请求。
409("Conflict"):客户端请求冲突。
410("Gone"):客户端请求的资源不在,以前可能存在,但是现在不在,也不知道可重定向的URL。
411("Length Required"):客户端的请求头中必须设置Content-Length。
412("Precondition Failed"):客户端可以在请求头中设置前置条件,比如设置请求方式,以此避免该请求方法被应用到其希望的内容以外的资源上,服务端在验证请求头字段给出的先决条件,没能满足时则返回412,比如断点续传(一个资源分多次传输,所以中间不能被修改),如果文件被修改了,则不满足先决条件,所以返回412。
413("Request Entity Too Large"):客户端提交的请求数据太大,服务器拒绝处理。
414("Request-URI Too Large"):请求的URL过长,服务器拒绝处理。
415("Unsupported Media Type"):客户端使用了服务端无法执行的媒体类型。
416("Requested range not satisfiable"):客户端请求的范围无效。
417("Expectation Failed"):客户端的请求头中Expect指定的内容无法被服务器满足。
421("too many connections"):客户端的连接数超过了服务器许可的最大范围。
422("Unprocessable Entity"):客户端语义错误,无法响应。
423("Locked"):当前资源被锁定。
424("Failed Dependency"):由于之前的请求错误,导致当前请求也失败。
425("Unordered Collection"):在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中。
426("Upgrade Required"):升级要求,客户端应当切换到TLS/1.0。
449("Retry With"):由微软扩展,代表请求应当在执行完适当的操作后进行重试。
451("Unavailable For Legal Reasons"):该请求因法律原因不可用。(RFC 7725)
5xx:服务器错误,服务器在处理客户端请求的时候发生错误。
500("Internal Server Error"):服务器的源代码出现错误。比如服务器的包模块没有引入。
501("Not Implemented"):服务器无法完成请求的某种功能或某种数据格式。
502("Bad Gateway"):网关错误,代理与上游服务器发生错误。
503("Service Unavailable"):由于超载或者系统维护,服务器没法当时就完成所有的请求。 ajax轮询 和 long poll 高并发的时候会发生这种情况。
504("Gateway Timeout"):与502有些类似,网关或代理服务器执行请求的时候,未能及时收到上游服务器的响应。
505("HTTP Version Not Supported"):不支持HTTP版本。
506("Variant Also Negotiates"):服务器内存配置错误。
507("Insufficient Storage"):服务器无法存储完成请求所必须的内容。
509("Bandwidth Limit Exceeded"):服务器达到宽带限制。
510("Not Extended"):获取资源所需要的策略并没有被满足。
600("Unparseable Response Headers"):源站没有返回响应头,只返回响应实体。