HTTP 状态码与请求方法速查:看日志时不用再猜
看 Nginx 日志、调接口、配跳转,本质上都在跟状态码打交道。记住常用的十几个就够了,剩下的知道属于哪一类、该往哪个方向查就行。
一、先看首位数字
| 类别 | 含义 | 排查方向 |
|---|---|---|
| 1xx | 信息,协议内部用 | 一般见不到 |
| 2xx | 成功 | 检查返回内容对不对 |
| 3xx | 重定向 | 检查跳转目标与是否循环 |
| 4xx | 客户端错误 | 我的请求有问题,查 URL、权限、参数 |
| 5xx | 服务端错误 | 服务器有问题,查日志、后端、资源 |
这条分界线最实用:4xx 改请求,5xx 改服务。看到 500 就别反复刷新页面了。
二、2xx:成功但不都一样
| 码 | 含义 | 典型场景 |
|---|---|---|
| 200 OK | 成功 | 常规请求 |
| 201 Created | 已创建 | POST 新建资源成功 |
| 204 No Content | 成功但无内容 | DELETE 成功,前端不用刷新 |
| 206 Partial Content | 部分内容 | 断点续传、视频拖动 |
206 是 Range 请求的产物。如果你配了视频或大文件下载却不支持 206,用户拖动进度条会卡。
三、3xx:301 和 302 到底选哪个
这是最常被搞混的一对:
| 码 | 含义 | 浏览器行为 | 用途 |
|---|---|---|---|
| 301 | 永久重定向 | 缓存跳转,下次直接去新地址 | 域名更换、http→https、www 归一 |
| 302 | 临时重定向 | 每次都先问原地址 | 临时维护页、A/B 测试 |
| 307 | 临时,保持方法 | 不改 POST→GET | 需要保留请求方法时 |
| 308 | 永久,保持方法 | 不改 POST→GET | 301 的严格版 |
结论:建站常用的跳转一律用 301。302 的问题在于浏览器不缓存,每次多一次往返;而 301 的问题是改不回来(缓存了),所以确定之前先用 302 测试。
# 全站 https + www 归一,用 301
server {
listen 80;
server_name bzii.cn www.bzii.cn;
return 301 https://www.bzii.cn$request_uri;
}302 会把 POST 悄悄变成 GET(历史遗留行为),导致表单数据丢失。要保留方法就用 307/308。
四、4xx:我的请求哪里错了
| 码 | 含义 | 最常见原因 |
|---|---|---|
| 400 | 请求格式错 | JSON 解析失败、参数缺失 |
| 401 | 未认证 | 没带 token,或 token 过期 |
| 403 | 无权限 | 认证了但没权限;Nginx 下多为目录权限 |
| 404 | 不存在 | 路径错 / SPA 没配 try_files |
| 405 | 方法不允许 | 用 POST 去请求只支持 GET 的接口 |
| 429 | 请求太频繁 | 触发限流,看 Retry-After 头 |
401 与 403 的区别值得记牢:
- 401:你是谁?—— 没登录;
- 403:我知道你是谁,但你不能看这个 —— 登录了没权限。
Nginx 里的 403 通常是文件权限问题,不是认证:
# 确认 nginx 工作用户(通常是 www-data)
grep "^user" /etc/nginx/nginx.conf
# 确认目录有读、有执行权限(目录需要 x 才能进入)
namei -l /var/www/baize/index.html
sudo chown -R www-data:www-data /var/www/baize
sudo chmod -R 755 /var/www/baize五、5xx:服务器这边的问题
| 码 | 含义 | 排查 |
|---|---|---|
| 500 | 内部错误 | 看应用日志,多为代码异常 |
| 502 | Bad Gateway | Nginx 当反代时后端没起来 |
| 503 | 不可用 | 后端过载或主动下线维护 |
| 504 | Gateway Timeout | 后端处理太慢,超时 |
502 和 504 是反代场景的高频问题,一眼区分:
- 502:连不上后端(服务没启动、端口写错);
- 504:连上了但后端迟迟不返回(查询太慢、死锁)。
# 502 排查:后端活着吗?
curl -v http://127.0.0.1:3000
ss -lntp | grep 3000
sudo tail -20 /var/log/nginx/error.log
# 504 排查:加大超时,同时优化后端
# nginx 侧临时放宽
proxy_read_timeout 120s;六、请求方法:语义比用法重要
| 方法 | 语义 | 幂等 | 说明 |
|---|---|---|---|
| GET | 读取 | 是 | 不修改服务端状态,可被缓存 |
| POST | 创建 | 否 | 每次调用可能产生新资源 |
| PUT | 整体替换 | 是 | 传完整资源 |
| PATCH | 局部修改 | 否 | 只传变更字段 |
| DELETE | 删除 | 是 | 重复调用结果一致 |
| HEAD | 只要响应头 | 是 | 探活、取元信息 |
| OPTIONS | 询问支持的方法 | 是 | CORS 预检用 |
幂等的意思是「调用一次和调用多次,服务端状态一样」。GET/PUT/DELETE 幂等,POST 不幂等——所以表单提交要防重复提交,而刷新一个 GET 页面是安全的。
七、用 curl 快速验证
# 只要状态码
curl -o /dev/null -s -w "%{http_code}\n" https://www.bzii.cn
# 看完整跳转链(-L 跟随,-I 只要头)
curl -sIL https://www.bzii.cn | grep -iE "^HTTP|^location"
# 指定方法看 405
curl -X POST -o /dev/null -s -w "%{http_code}\n" https://www.bzii.cn
# 一次看多个指标
curl -o /dev/null -s -w "code=%{http_code} redirect=%{num_redirects} ttfb=%{time_starttransfer}s total=%{time_total}s\n" -L https://www.bzii.cn状态码不需要背,按类别判断方向 + 记住高频那十几个,就够应付 90% 的场景了。
