HTTP 协议状态码-4XX

4XX 的状态码指的是请求出错了,而且很有可能是客户端侧的异常。客户端侧的异常很多,有时候情况也比较复杂,下面定义的状态码有时候也只能反应一个大概情况,而不一定确切的。

400 Bad Request

作为客户端异常的首个状态码,400 代表的意思很泛(错误的请求),一般指的是 4XX 其它状态码没有更合适的情况下就用 400,毕竟客户端出错类型很多,无法准确把情况都定义好。

401 Unauthorized

请求没有权限,通常返回的响应头部会包含 WWW-Authenticate 的头,浏览器遇到这种响应一般会弹出一个对话框,让用户重新提交用户名和密码进行认证。
服务端响应

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic; realm="Secured area"

客户端重新提交认证

GET / HTTP/1.1
Authorization: Basic j3VsbCBkb25lOnlvdhBmb3Vu89B0aGUgZWFzdGVyIoUnZwo=

402 Payment Required

这是一个预留的状态,最初想要实现的是,一些商业网站,用户付费完后可以重复的发送请求,为支付而预留的。

403 Forbidden

访问被禁止了,401 确切指没有认证,403 范围就更多了,可能是登陆了但是没有这个资源的权限,可能是访问的源 ip 不在相应的白名单中,等所有不被允许的情况。

404 Not Found

很常见的一种错误码,可能是你的地址构造错了,也可能是后台服务器的资源确实没了。

405 Method Not Allowed

请求方法有 POST GET 这类,客户端访问的方法跟服务端能够提供的不一样,当请求状态是 405 的时候,响应信息头会带上 Allow 字段,告诉客户端被允许的请求方法是哪些。

HTTP/1.1 405 Method Not Allowed
Content-Type: text/html
Allow: GET, HEAD, OPTIONS, PUT

406 Not Acceptable

指定的资源已经找到,但它的媒体类型和客户在Accpet头中所指定的不兼容,客户端浏览器不接受所请求页面的媒体类型。

客户端请求一个 Json 格式内容

GET /foo HTTP/1.1
Accept: application/json
Accept-Language: fr-CA; q=1, fr; q=0.8 

服务端不支持 Json

HTTP/1.1 406 Not Acceptable
Server: curveball/0.4
Content-Type: text/html

407 Proxy Authentication Required

要求进行代理身份验证,类似于401,表示客户必须先经过代理服务器的授权。
代理服务器返回需要认证的状态

HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic; realm="Secured area"

客户端发起代理认证

GET / HTTP/1.1
Proxy-Authorization: Basic d2VsbCBkb25lOllvdSBmb3VuZCB0aGUgc2Vjb25kIGVhc3RlciBlZ2cK

原站需要认证,代理服务器也需要认证的情况

GET / HTTP/1.1
Proxy-Authorization: Basic ZWFzdGVyIGVnZzpudW1iZXIgdGhyZWUK
Authorization: Bearer c2VuZCBtZSBhIHR3ZWV0IG9yIHNvbWV0aGluZwo

408 Request Timeout

客户端太慢了,超出了服务端允许的等待时间,服务端会返回 408 并断开连接。常见的有可能网速太慢了,一个请求发送太长时间还没发完。

HTTP/1.1 408 Request Timeout
Connection: close
Content-Type: text/plain

Too slow! Try again

409 Conflict

客户端请求本身没问题,但是服务端对应的资源跟客户端要执行的操作有冲突。比如客户端要修改 版本1的某个资源,但是服务端着个资源只有在 版本2 才存在。

410 Gone

告知客户端某个资源不存在了,跟 404 很像,只是 410 更加明确该资源永久性改变了,如果客户端在许可的条件下,应该把所有指向着个地址的连接全部删除。404 就比较笼统,当前请求的资源不在了,不清楚后面会不会有。

410 响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。

411 Length Required

服务器拒绝在没有定义 Content-Length 头的情况下接受请求。

412 Precondition Failed

请求头部带有一些先前条件,满足了才可以执行,不满足就返回 412。常见的就是要求某个资源过期了才能修改,不过期的时候执行 PUT 修改就报错。

413 Request Entity Too Large

服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。

414 Request-URI Too Long

请求的 URI 长度超过了服务器能够解释的长度,这种情况比较可能的是 GET 请求的 URI 携带的参数太多太大了。

415 Unsupported Media Type

请求实体的媒体类型不被服务器或者资源支持。例如,客户端想要返回一个 application/json 内容,服务端只能提供 text/html 类型的资源。

416 Requested Range Not Satisfiable

服务器不能满足客户在请求中指定的Range头。

417 Expectation Failed

在请求头 Expect 中指定的预期内容无法被服务器满足。

418 I’m a teapot

IETF 在愚人节的时候发布了一个 笑话的 RFC 提案,内容是:当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个418错误状态码,表示“我是一个茶壶”。后来官方想要去除该编号,竟然遭到了阻止,甚至不少浏览器都支持这个协议。是技术圈中一个错误而美好的典故。

421Misdirected Request

请求被指向到无法生成响应的服务器(比如由于连接重复使用)

422 Unprocessable Entity

请求格式正确,但是由于含有语义错误,无法响应。(RFC 4918 WebDAV)

423 Locked

当前资源被锁定。(RFC 4918 WebDAV)

424 Failed Dependency

由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。(RFC 4918 WebDAV)

425 Too Early

服务器不愿意冒风险来处理该请求,原因是处理该请求可能会被“重放”,从而造成潜在的重放攻击。

426 Upgrade Required

客户端应当切换到TLS/1.0。

449 Retry With

代表请求应当在执行完适当的操作后进行重试。

该请求因法律原因不可用。