HTTP 状态码与标头 132 项
404 和 500 到底是什么意思,Content-Type 和 Cache-Control 各管什么,一行说清。
状态码
1xx 信息4
只是告诉你还在进行中,真正的答复随后就到。
2xx 成功10
请求已经妥善处理完了。
200 OK请求成功,正文就在下面。201 Created新资源已创建。Location 里写着它的地址。202 Accepted请求已收下,但还没做完。做完了得另外去查。203 Non-Authoritative Information回来的内容被中间的代理改过,不是源服务器的原样。204 No Content处理成功,但没有正文。删除之后常见这个。205 Reset Content处理成功,请把输入的表单清空重来。206 Partial Content只回了请求的那一段。断点续传和视频拖动靠它。207 Multi-Status一次请求里含多个操作,各自的结果分别写在正文里。208 Already Reported同一个东西前面已经报过了,这里不再重复。226 IM Used回来的是差异部分,不是整份内容。
3xx 重定向8
让你去别的地方 —— 区别在于是永久还是临时。
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
问题出在服务器那一侧。过一会儿再试往往值得。
500 Internal Server Error服务器内部出错了,具体原因没往外说。501 Not Implemented这个功能服务器根本没实现。502 Bad Gateway前面的服务器从后面那台拿到了坏回应。503 Service Unavailable暂时接不了客 —— 过载或者在维护。504 Gateway Timeout等后面那台服务器等超时了。505 HTTP Version Not Supported你用的 HTTP 版本,服务器不支持。506 Variant Also Negotiates内容协商的设置绕成了环,服务器出不来。507 Insufficient Storage存储空间不够,存不下了。508 Loop Detected处理过程中发现死循环,只好中断。510 Not Extended还需要额外的扩展信息才能处理。511 Network Authentication Required得先在这个网络上完成登录 —— 公共 Wi-Fi 常见。
标头
请求标头55
浏览器往服务器发的时候带上的标头。
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标明这是脚本发出的异步请求。旧代码里常见。Accept-Charset告诉服务器客户端能接受哪些字符编码。现在几乎不再使用了。If-Unmodified-Since只有在那个时间之后没被改动时才处理,可以避免误覆盖别人的修改。Sec-CH-UA报出浏览器的名字和大版本号。这是为取代 User-Agent 而设计的。Sec-CH-UA-Mobile只说明设备是不是手机,值只有真和假两种。Sec-CH-UA-Platform报出请求来自哪种操作系统。版本号要另外单独索取。Save-Data告诉服务器用户想省流量,服务器可以改送更轻的版本。Device-Memory报出设备大致有多少内存。数值是刻意取整的,不精确。Early-Data标明这个请求是在握手完成前作为早期数据发出的,有被重放的风险。Access-Control-Request-Method预先询问真正的请求会用哪种方法。只出现在预检请求里。Access-Control-Request-Headers预先询问真正的请求会带哪些头部。只出现在预检请求里。Sec-Purpose标明这是预取请求,prefetch 表示用户还没点。Sec-CH-UA-Arch告诉服务器设备的 CPU 架构,是 arm 还是 x86。Sec-CH-UA-Model报告设备型号,实际上只有手机才会填。Sec-CH-UA-Platform-Version报告操作系统版本,和 Sec-CH-UA-Platform 配套。X-Forwarded-Host经过代理改写之前,浏览器原本请求的主机名。X-Real-IP代理把原始访问者的地址放在这里。不在标准里,但用得很广。Alt-Used表明客户端是按 Alt-Svc 换过来的,用来避免绕圈。Sec-WebSocket-Key请求升级到 WebSocket 时发的随机值,服务器会算过之后回给你。Sec-WebSocket-Version请求使用的 WebSocket 协议版本,实际上只有 13。Last-Event-ID断线重连时告诉服务器最后收到的事件编号,好接着推。Traceparent把一次请求在多个服务之间的流转串起来的追踪编号。Baggage携带随请求一起流转、各服务都能读到的键值上下文。Idempotency-Key让重复到达的请求只被处理一次的键,支付场景常用。Prefer告诉服务器客户端希望怎么处理,服务器可以照做也可以不照做。Sec-GPC浏览器代为表达“不要出售或共享我的个人信息”。Sec-CH-Prefers-Color-Scheme告诉服务器用户偏好浅色还是深色主题。Sec-CH-UA-Full-Version-List列出浏览器与引擎的完整版本,用来取代 User-Agent。
响应标头56
服务器答复浏览器的时候带上的标头。
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表明服务器支持按段取。断点续传靠它。Accept-Patch列出这个地址接受哪些修改格式。用 PATCH 之前先看它。Accept-Post列出这个地址在 POST 时接受哪些格式,发送前可以先确认。Alt-Svc告知同样的服务还有更好的通路,常用来指向 HTTP/3。Clear-Site-Data命令浏览器清掉存下的数据,一般在退出登录时用。Link在头部里指出相关的其他地址,也用来提示预加载。NEL设定浏览器把遇到的网络错误报告到哪里去。Report-To预先登记接收报告的名字和地址,之后的报告都送到那里。Server-Timing报出服务器内部各个阶段各花了多久,可以在开发者工具里看到。SourceMap指出打包前的原始代码在哪里,调试时靠它对回去。X-DNS-Prefetch-Control决定要不要提前解析域名。关掉可以少发一些请求。X-Permitted-Cross-Domain-Policies控制旧式插件能不能从这个来源取走数据。X-Robots-Tag用头部把索引规则告诉搜索机器人,图片和 PDF 也能用。Origin-Agent-Cluster请求浏览器把这个来源单独隔离到自己的一组里。Proxy-Authenticate说明代理要求客户端用哪种方式证明身份,和 407 一起出现。Access-Control-Expose-Headers列出脚本可以读取哪些响应头。默认只能读到很少几个。CDN-Cache-Control只对分发网络生效的缓存规则,浏览器会直接忽略它。Accept-CH列出服务器想要的客户端提示,浏览器从下次请求起带上。Critical-CH把提示标成关键项,浏览器会带着它重发第一次请求。Reporting-Endpoints指定错误报告发往哪里,取代旧的 Report-To。X-Powered-By暴露服务器用的技术。说了没好处,通常直接去掉。X-Cache说明这次是不是 CDN 用缓存答复的。HIT 就表示没回源。Refresh让浏览器过几秒跳到别处。不在标准里,但浏览器都认。Sec-WebSocket-Accept把客户端发来的密钥按固定算法处理后回传,对上了连接才建立。Speculation-Rules用规则告诉浏览器该提前取哪些地址、提前渲染哪些页面。No-Vary-Search说明匹配缓存时可以忽略哪些查询参数。X-UA-Compatible曾用来告诉旧版 Internet Explorer 采用哪种渲染模式。
两边通用22
请求和响应两边都可能出现的标头。
Cache-Control规定这份内容能不能缓存、能存多久。Connection这次之后连接是留着还是断开。Content-Encoding说明正文用了哪种压缩方式。Content-Language说明正文是哪种语言写的。Content-Length正文有多少字节。Content-Type说明正文是什么格式,以及用什么字符集。Date这条消息生成的时刻。PragmaHTTP/1.0 时代的缓存开关。如今由 Cache-Control 接手。Trailer预告正文之后还会补上哪些头。Transfer-Encoding说明正文是怎么切块送过来的。Upgrade提议把这条连接换成别的协议。Via记下这条消息经过了哪些代理。Warning对回应的额外提醒,多和缓存有关。现已废弃。Priority表明这个请求有多急,以及能不能插队先送。Content-Location说明刚送出的内容实际上放在哪个地址,和 Location 的用途不同。Keep-Alive说明复用的连接要保持打开多久。HTTP/2 之后不再使用。Content-Digest随正文一起送出校验值,接收方可以据此确认内容没有损坏。Tracestate在 traceparent 旁边携带各追踪系统自己的附加信息。Repr-Digest附上内容的哈希,让对方核对是否完整无损。Signature消息上的签名,接收方据此核实发送者。Signature-Input说明签名覆盖了哪些头部、用的什么方式。X-Request-ID每个请求的编号,用来在日志里找回这一次请求。
怎么看这一页
- 状态码的第一位定了大方向:4 开头是请求那侧的问题,5 开头是服务器那侧的问题。
- 404 是「没有」,403 是「有,但不给你」。两个混着用,排查起来只会更慢。
- 标头名不分大小写。Content-Type 和 content-type 是同一个标头。
- 缓存和 CORS 的毛病,多半就差一行标头。在浏览器开发者工具的网络面板里能直接看到。
常见问题
Q404 和 403 有什么区别?
404 说的是那个地址上什么都没有;403 说的是东西在,但你没资格看。不过也有服务器故意回 404,好把「这里存在一个资源」这件事本身藏起来。
Q碰到 500 我能做点什么?
5 开头的都是服务器那侧的问题,多半只能等。不过 502 和 504 是前后两台服务器之间的事,隔一会儿重试常常就好了。
Q301 和 302 怎么选?
地址永久搬走用 301,只是临时绕道用 302。要留意浏览器和搜索引擎会把 301 记很久,改回来很麻烦。
Q标头名分大小写吗?
不分。Content-Type 和 content-type 是同一个标头;从 HTTP/2 起,干脆规定一律用小写发送。
QCORS 错误是怎么来的?
页面想读另一个源的响应,而服务器没用 Access-Control-Allow-Origin 放行,浏览器就会拦下来。服务器其实已经把响应发回来了,只是浏览器不肯把正文交给你的代码 —— 所以网络面板里看得见,脚本里却读不到。