HTTP状态码(HTTP Status codes)简介

HTTP与Status codes

HTTP可能大家都熟悉,就是超文本传输协议。浏览器通过HTTP与WEB Server通讯(也有一些其它软件比如IM使用HTTP协议传递数据),把我们的请求(HTTP Request)传递给服务器,服务器响应这个请求,返回应答(HTTP Response)以及我们需要的数据。大致就是这个样子了。

如果我们请求啥,服务器就返回啥,是乎就不需要HTTP Status codes了。但是事情往往不是那么简单。比如我们请求一个网页页面,可是服务器不存在这个页面,或者这个页面被转移到其它地方,或者服务器禁止我们查看 这个页面等等,所以为了便于浏览器处理这些正确与不正确的情况,HTTP用Status codes来表示请求(HTTP Request)在服务器端被处理的情况。Status codes通过应答(HTTP Response)返回给浏览器,浏览器根据这个作相应的处理。
注:
1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。
HTTP的发展是万维网协会(World Wide Web Consortium)和Internet工作小组(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,其中最著名的就是RFC 2616。

HTTP状态码

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字有分类的作用。不同的状态码代表不同的含义。

它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918 等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。所示的消息短语是典型的,但是可以提供任何可读取的替代方案。 除非另有说明,状态码是HTTP / 1.1标准(RFC 7231)的一部分。

注:
Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。

HTTP Status codes的分类

既然有正确和错误的状态,HTTP定义两大类状态码是不是就可以了?人家制订协议的可是专家(不像我这种菜鸟),想得比我们要周全,要长远。HTTP 1.1中定义了5大类Status codes,分别是:
1xx:临时响应(Informational),需要请求者继续执行操作的状态代码,表示服务器正在接受请求。
2xx:成功状态码(Success),已成功接受客户端请求。
3xx:重定向状态码(Redirection),需要客户端做进一步操作来完成请求。
4xx:客户端错误(Client Error),客户端请求出错导致服务端无法正常完成请求。
5xx:服务端错误(Server Error),服务器出错未能成功处理服务端请求。

常见的HTTP响应码

请求收到,继续处理:
  • 100:客户端必须继续发出请求
  • 101:客户端要求服务器根据请求转换HTTP协议版本
操作成功/收到/分析/接受:
  • 200:正确;
  • 201:提示知道新文件的URL;
  • 202:表示服务器已经接受了请求,但是还没有处理,而且这个请求最终会不会处理还不确定;
  • 203:返回信息不确定或不完整;
  • 204:请求收到,但返回信息为空;
  • 205:服务器完成了请求,用户代理必须复位当前已经浏览过的文件;
  • 206:服务器已经完成了部分用户的GET请求;
重定向:
  • 300:请求的资源可在多处得到;

  • 301:永久重定向,在Location响应首部的值仍为当前URL(隐式重定向),(静态重定向);

  • 302:临时重定向,在Location响应首部的值仍为新的URL(显示重定向),(动态重定向);

客户端错误:
  • 400:提交的请求参数不正确,可能是参数格式不正确,或没有提交必要的参数;
  • 404:尝试请求的资源不存在;
  • 405:请求方式错误;
服务器端错误:
  • 500:服务器内部错误,一般在开发环境的控制台会有错误信息;
  • 501:未实现。服务器不识别该请求方法,或者服务器没有能力完成请求;
  • 503:服务不可用。服务器当前不可用(过载或故障)。

附1:常见的HTTP响应码

请求收到,继续处理:
                100      客户端必须继续发出请求
                101      客户端要求服务器根据请求转换HTTP协议版本

         操作成功收到,分析,接受:
                200      交易成功
                201      提示知道新文件的URL
                202      接受和处理、但处理未完成
                203      返回信息不确定或不完整
                204      请求收到,但返回信息为空
                205      服务器完成了请求,用户代理必须复位当前已经浏览过的文件
                206      服务器已经完成了部分用户的GET请求

         重定向:
                300      请求的资源可在多处得到
                301      永久重定向,在Location响应首部的值仍为当前URL(隐式重定向)
                302      临时重定向,在Location响应首部的值仍为新的URL(显示重定向)
                303      建议客户端访问其他URL或访问方式
                304      Not Modified 请求的资源没有改变 可以继续使用缓存
                305      请求的资源必须从服务器指定的地址得到
                306      前一版本HTTP中使用的代码,现行版本中不再使用
                307      声明请求的资源临时性删除

         客户端错误:
                400      错误请求,如语法错误
                401      未授权
                   HTTP 401.1    未授权,登录失败
                   HTTP 401.2    未授权,服务器配置问题导致登录失败
                   HTTP 401.3    ACL  禁止访问资源
                   HTTP 401.4    未授权  授权被筛选器拒绝
                   HTTP 401.5    未授权  ISAPI或CGI授权失败
                402      保留有效ChargeTo头响应
                403      禁止访问
                   HTTP 403.1    禁止访问  禁止可执行访问
                   HTTP 403.2    禁止访问  禁止读访问
                   HTTP 403.3    禁止访问  禁止写访问
                   HTTP 403.4    禁止访问  要求SSL
                   HTTP 403.5    禁止访问  要求SSL 128
                   HTTP 403.6    禁止访问  IP地址被拒绝
                   HTTP 403.7    禁止访问  要求客户端证书
                   HTTP 403.8    禁止访问  禁止站点访问
                   HTTP 403.9    禁止访问  连接的用户过多
                   HTTP 403.10   禁止访问  配置无效
                   HTTP 403.11   禁止访问  密码更改
                   HTTP 403.12   禁止访问  映射器拒绝访问
                   HTTP 403.13   禁止访问  客户端证书已被吊销
                   HTTP 403.15   禁止访问  客户端访问许可过多
                   HTTP 403.16   禁止访问  客户端证书不可信或者无效
                   HTTP 403.17   禁止访问  客户端证书已经到期或者尚未生效
                404       没有发现文件、查询或URL
                405       用户在Request-Line字段定义的方法不允许
                406       根据用户发送的Accept拖,请求资源不可访问
                407       类似401,用户必须首先在代理服务器上得到授权
                408       客户端没有在用户指定的饿时间内完成请求
                409       对当前资源状态,请求不能完成
                410       服务器上不再有此资源且无进一步的参考地址
                411       服务器拒绝用户定义的Content-Length属性请求   
                412       一个或多个请求头字段在当前请求中错误
                413       请求的资源大于服务器允许的大小
                414       请求的资源URL长于服务器允许的长度
                415       请求资源不支持请求项目格式
                416       请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,       请求也不包含If-Range请求头字段
                417       服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长
         服务器端错误: 
                500 - 内部服务器错误
                   HTTP 500.100 - 内部服务器错误 
                   HTTP 500-11 服务器关闭
                   HTTP 500-12 应用程序重新启动
                   HTTP 500-13 - 服务器太忙
                   HTTP 500-14 - 应用程序无效
                   HTTP 500-15 - 不允许请求 
                501 - 未实现
                502 - 网关错误
                503 - 服务不可用
                504 - 网关超时

附2:HTTP状态码列表

状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

附加:IT冷知识

01

第一台电脑为蒸汽驱动

作为公认的编程之父,Charles Babbage(查尔斯.巴贝奇)发明了世界上首批计算机之一。他将这台新设备称为分析引擎。其体积超过一栋房屋,由六台蒸汽机驱动并使用打孔卡进行编程。分析引擎有四大主要组成部分:1.转盘——相当于现代计算机中的CPU;2.存储——相当于现代计算机中的内存与存储介质;3.读取器——相当于输入机制;4.打印机——用于实现信息输出。

02

电脑病毒的设计初衷并非是造成损害

史上第一款电脑病毒,竟然是由防御技术专家Fred Cohen(弗雷德·科恩)亲手设计出来的。他创造电脑病毒的目的仅仅是为了证明程序对电脑感染的可行性,从未希望借此对电脑造成任何危害。但这款程序却能够对电脑进行感染,并且能通过软盘等移动介质在不同计算机之间进行传播,因而命名为病毒。后来,他又创造出一种主动式电脑病毒,主要目的是帮助电脑用户找到未受感染可执行文件。

03

第一位程序员是位女性

第一个程序员其实是个女的,这也是令人非常惊讶的,现在的IT行业大多都是男性,各大高校这一专业班上也大部分都是男生,所以感到奇怪也是正常的事情,这位女性是来自英国的数学家。

04

程序中bug的名称源自“虫子”

在程序中bug一词用于技术错误。这一术语最初由爱迪生在1878年提出的,但当时并没有流行起来。在这的几年之后,美国上将Grace Hopper(葛丽丝·霍普)在她的日志本中,写下了她在Mark II电脑上发现的一项bug。不过实际上,她说的真的是“虫子”问题,因为一只蛾子被困在电脑的继电器中,导致电脑的操作无法正常运行。如图片所见,她写道“这是我在电脑上发现的第一个bug”。

1946 年,霍普发现了第一个电脑上的 bug。

在 Mark II 计算机上工作时,电脑不能正常运作了,霍普和整个团队都搞不清楚为什么。

后来才发现,是一只飞蛾意外飞入了一台电脑内部而引起的故障。终于把问题解除了,霍普在日记本中记录下了这一事件。

”千年虫“事件:

​ 计算机2000年问题,又叫做“千年虫”、“电脑千禧年千年虫问题”或“千年危机”。

​ 由于其中的年份只使用两位十进制数来表示,因此当系统进行(或涉及到)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。因此从根本上说千年虫是一种程序处理日期上的bug(计算机程序故障),而非病毒。

​ “千年虫”问题的根源始于60年代。当时计算机存储器的成本很高,如果用四位数字表示年份,就要多占用存储器空间,就会使成本增加,因此为了节省存储空间,计算机系统的编程人员采用两位数字表示年份。随着计算机技术的迅猛发展,虽然后来存储器的价格降低了, 但在计算机系统中使用两位数字来表示年份的做法却由于思维上的惯性势力而被沿袭下来, 年复一年,直到新世纪即将来临之际,大家才突然意识到用两位数字表示年份将无法正确辨识公元2000年及其以后的年份。1997年,信息界开始拉起了“千年虫”警钟,并很快引起了全球关注。

受到的影响

金融业

到了2000年,银行里面的电脑可能将2000年解释为1900年,引 起利息计算上的混乱,甚至自动将所有的记录消除;自动取款机会拒收“00”年的提款卡;

保险业

保险公司可能会将每份保险的年限算错。

电信业

你在1999年12月31日23:59分打了三分钟的电话,电话局的账单却可能显示为(-100年+3分钟);

电力系统

美国夏威夷电力公司曾经做了一项实际的实验,输入00年,结果电厂自动停止操作,在某些情况下也发生电压与频率方面的变化,造成用户全面停电、电器故障甚至烧毁;美国联邦核管处更是担心全美的百余座核电厂里的仪器由于2000年问题失控造成核辐射外泄等灾难。

税务系统

税务局的电脑可能会认为你拖欠了100年的税款,从而寄来天文数字般的补税通知。

医药业

医疗仪器如救生系统或监视系统可能死机导致患者生命危急以及血库管理、医嘱系统与病历、器材管理全部无法正常运作。

交通系统

由于控制雷达的电脑失灵,空中管制完全瘫痪,班机停飞。

2000年问题更成了美国各大汽车公司的头疼问题,原来,美国汽车都有确定的使用年限(比如10年),超过该时间期限后汽车便会自动拒绝发动。麻烦出在一些刚刚生产出来的自动化程度较高的汽车,其内部控制芯片仍用两位10进制数表示年份,那么到了2000年后,由于年份变成了00年,和出厂日期(比如1998年)一比较,竟然已运行了98年,汽车当然便会自动拒绝发动了。

2000年的千年虫事件,这个使几乎所有电子设备瘫痪的漏洞


2010年问题

2000年的千年虫事件,这个使几乎所有电子设备瘫痪的漏洞,在沉寂了10年之后,再次悄然现身。

据最近的网络消息称,出乎人们的预料,2010年再次出现类似2000年的“千年虫”问题。(2010年)

银行卡失灵

德国银行协会5日警告说,在进入2010年之际,超过2500万张德国银行卡可能遭到类似“千年虫”软件漏洞的损害,导致电脑芯片无法识别年份“2010”,从而让使用自动取款机或在德国境内甚至境外分行取款、用卡消费的银行客户无法使用银行卡。

跳过2010直至2016年

不知道什么原因,澳大利亚昆士兰银行卡处理中心的计算机时钟,在越过2009年12月31日之后,反常地直接翻至2016年1月1日,掠过了中间的6个年头。然而,出现这样的状况会有什么样的后果呢?

最直接的,大量的昆士兰州的企业依靠该银行处理他们的信用卡支付业务,而大量信用卡在2016年之前就已经到期失效,所以几乎所有的交易都面临瘫痪。不过虽然还没有查明原因,银行已经启动人工批准流程,以保证经济的正常运转。


2038年问题

32位Unix操作系统和Linux操作系统时间溢出问题又称为2038年问题(the Year 2038 problem)。如果你想知道什么是2038问题的话,你需要知道一些技术上的东西。这个bug是由用来写Unix/Linux的C语言引起的,C语言中用 time_t 来代表时间日期time_t 是整数(int)型的,它用来记载从1970年1月1日到2000年所经历的秒数

这个数据是以32位存储的,第一位是符号位,其余的31位用来存数字,而这31位数字可以存储的最大数字为2147483647

1970年开始计算,这31位的数字可以表示的秒数最多可以用到2038年01月19日03时14分07秒,当时间到达这个数字的时候系统将会出现问题,到时候数字不会自动增加,而是会变为-2147483648,而这串数字代表的时间是1901年12月13日20时45分52秒,这会导致很多的程序出现问题,甚至崩溃。

不过现在64位系统已经成为主流,这个问题现在是可以避免的。