首页·HTTP 状态码与标头

HTTP 状态码与标头 132 项

404 和 500 到底是什么意思,Content-Type 和 Cache-Control 各管什么,一行说清。

状态码

1xx 信息4

只是告诉你还在进行中,真正的答复随后就到。

2xx 成功10

请求已经妥善处理完了。

3xx 重定向7

让你去别的地方 —— 区别在于是永久还是临时。

4xx 请求有误29

问题出在请求这一侧。原样再发一次,还是会失败。

400 Bad Request请求本身写得不对,服务器读不懂。401 Unauthorized需要先登录。没带身份或者带错了。402 Payment Required为付费场景预留的编号,实际上几乎不用。403 Forbidden东西在,但你没有权限看。404 Not Found这个地址上什么都没有。405 Method Not Allowed地址是对的,但不接受你用的这个方法。406 Not Acceptable服务器给不出你在 Accept 里要求的那种格式。407 Proxy Authentication Required要先通过中间代理的身份验证。408 Request Timeout等你的请求等太久,服务器先断了。409 Conflict和当前状态冲突了,比如两个人同时改同一份东西。410 Gone以前有,现在被永久删掉了,也不会再回来。411 Length Required得先写明 Content-Length 才收。412 Precondition Failed你加的前提条件不成立,所以没有执行。413 Content Too Large送来的正文太大了。414 URI Too Long网址太长了,超出服务器能处理的长度。415 Unsupported Media Type这种格式的正文服务器不收。416 Range Not Satisfiable你要的那一段超出了文件的范围。417 Expectation FailedExpect 里提的要求,服务器满足不了。418 I'm a teapot愚人节玩笑留下的编号 —— 我是茶壶,煮不了咖啡。421 Misdirected Request这条连接送错了地方,这台服务器管不了这个域名。422 Unprocessable Content格式没问题,但内容说不通,处理不了。423 Locked对象被锁住了,暂时动不了。424 Failed Dependency前一个请求失败,连带这个也做不成。425 Too Early太早了。重放风险还没排除,先不处理。426 Upgrade Required得升级到别的协议才能继续。428 Precondition Required必须带上前提条件才受理,以免覆盖掉别人的改动。429 Too Many Requests短时间里请求太多了,慢一点再来。431 Request Header Fields Too Large请求头太大,超出了服务器的上限。451 Unavailable For Legal Reasons出于法律原因不能提供。

5xx 服务器有误11

问题出在服务器那一侧。过一会儿再试往往值得。

标头

请求标头28

浏览器往服务器发的时候带上的标头。

Accept告诉服务器自己想要哪种格式的内容。Accept-Encoding告诉服务器自己能解开哪些压缩方式。Accept-Language告诉服务器自己偏好哪种语言。Authorization带上身份凭据,用来通过认证。Cookie把先前存下的 cookie 一起送回服务器。Host写明要访问的域名。一台服务器上放多个站点时靠它区分。If-Modified-Since这个时间之后有改动才给我,没改就回 304。If-None-MatchETag 和我手上的不一样才给我,一样就回 304。Origin告诉服务器这个请求是从哪个源发出来的。Range只要文件的某一段,不要整份。Referer写明是从哪个页面点过来的。拼写少了一个 r 是当年的笔误。User-Agent自报浏览器和操作系统。Sec-Fetch-Dest说明这次请求是要拿去当图片、脚本还是页面用。Sec-Fetch-Mode说明这次请求的模式 —— 同源、跨源还是导航。Sec-Fetch-Site说明请求方和目标方是不是同一个站点。DNT表示不希望被追踪。要不要理会由网站自己决定。Expect先问服务器收不收,再决定要不要把正文送过去。Forwarded把经过的代理信息按标准格式记下来。From留下发起请求者的邮箱地址。爬虫偶尔会带。If-MatchETag 和我手上的一样才动手,用来防止覆盖别人的改动。If-Range文件没变就继续给我那一段,变了就整份重来。Max-Forwards限制这个请求最多还能经过几层代理。Proxy-Authorization带上给中间代理看的身份凭据。TE告诉服务器自己能接受哪些传输编码。Upgrade-Insecure-Requests表示愿意把 http 的请求自动换成 https。X-Forwarded-For记下最初那个客户端的 IP,让后面的服务器看得到。X-Forwarded-Proto记下客户端原本用的是 http 还是 https。X-Requested-With标明这是脚本发出的异步请求。旧代码里常见。

响应标头30

服务器答复浏览器的时候带上的标头。

Access-Control-Allow-Origin指明哪些源可以读这个回应。CORS 的核心一行。Access-Control-Allow-Methods跨源时允许使用哪些方法。Access-Control-Allow-Headers跨源时允许带上哪些请求头。Access-Control-Allow-Credentials允许跨源时一并带上 cookie 和认证信息。Access-Control-Max-Age预检结果可以缓存多久,省下重复的预检请求。Age这份回应在缓存里待了多少秒。Allow列出这个地址允许的方法。405 常和它一起出现。Content-Disposition决定是直接显示还是当成文件下载,也能指定文件名。Content-Security-Policy规定这个页面能加载哪些来源的脚本和资源。ETag内容的指纹。内容一变,这串就变。Expires写明这份内容到哪个时刻为止算新鲜。Last-Modified内容最后一次改动的时间。Location重定向要去的地址,也用来写新建资源的地址。Permissions-Policy规定页面能不能用摄像头、麦克风、定位这些能力。Referrer-Policy规定往外发请求时,Referer 里透露多少。Retry-After告诉你隔多久再来。429 和 503 常带着它。Server自报服务器软件。出于安全考虑,很多站点把它藏起来。Set-Cookie让浏览器把 cookie 存下来。Strict-Transport-Security要求浏览器此后一律用 https 访问本站。Timing-Allow-Origin允许跨源的脚本读取本次请求的耗时数据。Vary说明这份回应会随哪些请求头而变,缓存要照着分开存。WWW-Authenticate告诉客户端该用哪种方式来认证。和 401 一起出现。X-Content-Type-Options禁止浏览器擅自猜测内容类型。X-Frame-Options规定本页能不能被别的页面嵌进框架里。X-XSS-Protection旧浏览器的跨站脚本过滤开关。如今已由 CSP 取代。Cross-Origin-Opener-Policy把本页和别的源开的窗口隔开。Cross-Origin-Resource-Policy规定这份资源允许被哪些源加载。Cross-Origin-Embedder-Policy要求页面里嵌的东西必须明确表态可被嵌入。Content-Range说明这一段在整份内容里的位置。Accept-Ranges表明服务器支持按段取。断点续传靠它。

两边通用13

请求和响应两边都可能出现的标头。

怎么看这一页

  • 状态码的第一位定了大方向:4 开头是请求那侧的问题,5 开头是服务器那侧的问题。
  • 404 是「没有」,403 是「有,但不给你」。两个混着用,排查起来只会更慢。
  • 标头名不分大小写。Content-Type 和 content-type 是同一个标头。
  • 缓存和 CORS 的毛病,多半就差一行标头。在浏览器开发者工具的网络面板里能直接看到。

常见问题

Q. 404 和 403 有什么区别?

404 说的是那个地址上什么都没有;403 说的是东西在,但你没资格看。不过也有服务器故意回 404,好把「这里存在一个资源」这件事本身藏起来。

Q. 碰到 500 我能做点什么?

5 开头的都是服务器那侧的问题,多半只能等。不过 502 和 504 是前后两台服务器之间的事,隔一会儿重试常常就好了。

Q. 301 和 302 怎么选?

地址永久搬走用 301,只是临时绕道用 302。要留意浏览器和搜索引擎会把 301 记很久,改回来很麻烦。

Q. 标头名分大小写吗?

不分。Content-Type 和 content-type 是同一个标头;从 HTTP/2 起,干脆规定一律用小写发送。

Q. CORS 错误是怎么来的?

页面想读另一个源的响应,而服务器没用 Access-Control-Allow-Origin 放行,浏览器就会拦下来。服务器其实已经把响应发回来了,只是浏览器不肯把正文交给你的代码 —— 所以网络面板里看得见,脚本里却读不到。