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→GET301 的严格版

结论:建站常用的跳转一律用 301。302 的问题在于浏览器不缓存,每次多一次往返;而 301 的问题是改不回来(缓存了),所以确定之前先用 302 测试。

nginx
# 全站 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 通常是文件权限问题,不是认证:

bash
# 确认 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内部错误看应用日志,多为代码异常
502Bad GatewayNginx 当反代时后端没起来
503不可用后端过载或主动下线维护
504Gateway Timeout后端处理太慢,超时

502 和 504 是反代场景的高频问题,一眼区分:

  • 502:连不上后端(服务没启动、端口写错);
  • 504:连上了但后端迟迟不返回(查询太慢、死锁)。
bash
# 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 快速验证

bash
# 只要状态码
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% 的场景了。