HTTP常考状态码详解(附面试官考察点深扒)
前言:那个让人尴尬的面试现场 😅
不管是校招萌新还是想跳槽的老鸟,面试时大概率都遇到过这样一个场景:
面试官推了推眼镜,轻描淡写地问了一句:“简单说一下 301 和 302 的区别?再讲讲 304 是怎么产生的? ”
这时候,很多人脑子里可能只有一行字:“完了,这题我看过,但我忘了……”
于是只能支支吾吾:“额,一个是永久,一个是临时...那个...304好像是缓存?”
面试官微微一笑,你的心里却凉了半截。
其实,HTTP 状态码(Status Code) 真的不是枯燥的数字。对于我们后端开发来说,它不仅是面试的“敲门砖”,更是线上排错(Troubleshooting)的“听诊器”。看到 502 和看到 504,排查方向可是完全不一样的!
今天这篇文章,咱们不搞死记硬背,我带大家从应用场景和面试官视角,把这块硬骨头彻底嚼碎了!
🌏 状态码家族概览:先看大局
HTTP 状态码由 3 位数字组成,第一个数字定义了响应的类别。你可以把它们想象成 5 个性格迥异的家族:
-
1xx:消息(Information)
- 🐢 一句话总结:“服务收到了,你继续发。”(实际开发中很少直接处理)
-
2xx:成功(Success)
- ✅ 一句话总结:“操作成功,舒服了。”
-
3xx:重定向(Redirection)
- 👉 一句话总结:“资源搬家了,你去那边找它。”
-
4xx:客户端错误(Client Error)
- 🙅♂️ 一句话总结:“你(客户端)发的东西有毛病,服务器处理不了。”
-
5xx:服务端错误(Server Error)
- 💥 一句话总结:“我(服务端)炸了,不是你的锅。”
🔍 核心状态码详解:别只背定义,要懂场景
1. 2xx 系列:不仅仅只有 200
-
200 OK
- 含义:最常见的,请求成功。
- 场景:网页正常打开,接口正常返回数据。
-
201 Created
- 含义:请求成功并且服务器创建了新的资源。
- 场景:RESTful API 中,使用 POST 创建用户或订单成功后,应该返回 201 而不是 200。
-
204 No Content
- 含义:服务器处理成功,但不需要返回任何实体内容。
- 场景:前端发送 DELETE 请求删除某条记录,后端删完了,没必要回传什么数据,给个 204 告诉前端“妥了”即可。
-
206 Partial Content (💡划重点)
- 含义:服务器已经成功处理了部分 GET 请求。
- 场景:大文件断点续传、视频流媒体播放。前端会在 Header 里带上 Range: bytes=0-100,后端就只返回这部分数据。面试问到“断点续传怎么做”,这个状态码是核心。
2. 3xx 系列:重定向与缓存的纠葛
-
301 Moved Permanently (永久重定向)
- 含义:资源已经被永久移动到了新位置。
- 场景:网站更换域名(如 http 升级到 https),或者老旧的 URL 废弃。
- 关键点:浏览器会缓存这个重定向,下次你再访问老地址,浏览器直接就去新地址了,根本不会去问服务器。
-
302 Found (临时重定向)
- 含义:资源暂时去别的地方了,但未来可能还会回来。
- 场景:活动页面的临时跳转,未登录用户跳转到登录页。
-
304 Not Modified (🔥 超高频考点)
-
含义:资源没修改,你可以直接用你本地的缓存。
-
原理:
- 浏览器第一次请求资源,服务器返回 200,并在 Header 里带上 ETag (文件指纹) 或 Last-Modified (最后修改时间)。
- 浏览器第二次请求,Header 里带上 If-None-Match (对应 ETag) 或 If-Modified-Since。
- 服务器对比发现:“哎?这文件我没改过啊!”
- 服务器直接返回 304(响应体是空的,省带宽),告诉浏览器:“别下新的了,用你缓存里那个!”
-
3. 4xx 系列:客户端的锅
-
400 Bad Request
- 含义:请求参数有误,语义错误。
- 场景:前端传的 JSON 格式不对,或者必填参数没传。
-
401 Unauthorized vs 403 Forbidden (⚠️ 易混淆)
- 401:未认证。意思是“你是谁?我不认识你”。(通常没登录,或者 Token 过期)。
- 403:禁止。意思是“我知道你是谁,但你没权限进这个屋”。(比如普通用户想删管理员的数据)。
-
404 Not Found
- 含义:资源未找到。
- 场景:URL 输错了,或者资源被删了。
-
405 Method Not Allowed
- 含义:方法不被允许。
- 场景:接口只支持 POST,你非要用 GET 去调。
4. 5xx 系列:服务端的泪
-
500 Internal Server Error
- 含义:服务器内部错误。
- 场景:后端代码抛了空指针异常(NPE)、数据库连不上了、代码逻辑炸了。
-
502 Bad Gateway vs 504 Gateway Timeout (🔥 线上排错必问)
-
这俩通常出现在 Nginx(网关) 和 后端服务(如 Java/Go/Python 应用) 之间。
-
502 Bad Gateway:上游服务挂了或返回了无效响应。
- 大白话:Nginx 给后端发请求,后端直接断开连接,或者后端进程直接崩了(端口通但不干活)。
-
504 Gateway Timeout:上游服务超时。
- 大白话:Nginx 给后端发请求,后端活着,但是处理太慢了(比如慢 SQL 查了 60 秒),超过了 Nginx 设置的等待时间。
-
🎯 面试官的“伏击圈”:最常考&最易混淆点
这里是整篇文章的精华,面试官问这些问题时,心里其实是有“小九九”的。
1. 问:301 和 302 到底有啥本质区别?我不都是跳过去了吗?
-
🚫 易忘点:只记得“永久”和“临时”,忘了SEO(搜索引擎优化)和缓存。
-
🕵️♂️ 面试官想考察什么:你是否了解 HTTP 协议对搜索引擎的影响,以及浏览器缓存策略。
-
💯 完美回答范例:
“虽然用户体验一样,但核心区别在于缓存和SEO。
301 会被浏览器强制缓存,下次根本不请求服务器;搜索引擎会把旧地址的权重转移到新地址。
302 不会被缓存,每次都会去问服务器,搜索引擎也会保留旧地址。
所以做网站迁移一定要用 301,否则旧域名的 SEO 权重就丢了。”
2. 问:304 状态码是怎么产生的?
-
🚫 易忘点:只知道是缓存,说不出 ETag 和 Last-Modified 的协商过程。
-
🕵️♂️ 面试官想考察什么:Web 性能优化。你是否懂“协商缓存”机制,是否知道如何通过 HTTP 头节省带宽。
-
💯 完美回答范例:
“304 是协商缓存的结果。
客户端带着 If-None-Match (ETag) 或 If-Modified-Since 发起请求。
服务端对比发现资源未变,就不传 Body,只回一个 304 头。
这能极大减少带宽消耗,提升页面加载速度。”
3. 问:线上报 502 和 504,你怎么排查?
-
🚫 易忘点:分不清谁是因谁是果,瞎查数据库。
-
🕵️♂️ 面试官想考察什么:Troubleshooting(故障排查)能力。这是区分“码农”和“工程师”的分水岭。
-
💯 完美回答范例:
“看到 502,我首先怀疑后端服务没启动或进程崩了,或者 Nginx 配置的 Upstream 地址配错了。
看到 504,说明后端连接正常但处理太慢。我会去查后端日志看有没有慢 SQL,或者是不是死锁导致请求卡住超时了。”
📝 总结:一张图带你记忆
最后,给兄弟们整几个顺口溜,助你记忆:
- 200:皆大欢喜。
- 301:搬家了,不回来了;302:出差了,过几天回。
- 304:没改过,用旧的。
- 401:没身份证;403:有身份证但不让进。
- 404:查无此人。
- 500:代码写烂了。
- 502:后端挂了;504:后端慢了。
希望这篇文章能帮你把 HTTP 状态码彻底搞懂!下次面试官再问,直接把原理拍他脸上!😎