HTTP状态码大全:含义、产生原因及排查指南
HTTP 状态码大全:含义、产生原因及排查指南
HTTP状态码是日常服务器运维或者网络运维中不可或缺的一部分,它们告诉我们请求的处理结果。本文将详细介绍各类HTTP状态码的含义、产生原因,以及当遇到问题时如何进行排查,包括常用的Linux命令。
1. 请求到达服务端的情况及表现
1xx,2xx,3xx,4xx,5xx都是请求到达了服务器,不管是否给予了正确的返回,至少流量是到达了服务端.
关键区别:
- 1xx:请求已接收,需继续处理(信息性)
- 2xx:请求成功处理完成
- 3xx:请求需要客户端进一步操作
- 4xx:客户端请求有问题
- 5xx:服务器处理请求时出错
所有状态码(1xx-5xx)都表示请求已到达服务器,区别在于:
- 服务器是否成功处理
- 是否需要客户端进一步操作
- 错误责任方(客户端/服务器)
1xx (信息性状态码)
状态码 | 名称 | 含义 | 常见场景 |
---|---|---|---|
100 | Continue | 客户端应继续发送请求的剩余部分。 | 客户端发送大请求时,服务器先返回 100 确认可继续传输。 |
101 | Switching Protocols | 服务器同意切换协议(如从 HTTP 升级到 WebSocket)。 | WebSocket 连接建立时,服务器同意协议升级。 |
102 | Processing | 服务器已收到请求,正在处理(WebDAV 扩展状态码)。 | 长时间任务处理中,避免客户端超时。 |
103 | Early Hints | 服务器提前返回部分响应头(用于链接预加载优化)。 | 浏览器预加载资源(如 <link rel="preload"> )。 |
产生原因
1xx状态码通常由服务器在处理请求的早期阶段发送,用于与客户端保持通信。
排查方法
使用curl -v
命令查看详细请求过程:
curl -v http://example.com
使用tcpdump
抓包分析:
tcpdump -i eth0 -A port 80
2xx (成功状态码)
2xx (成功状态码)
- 请求已到达服务器并被成功处理
- 服务器返回了预期的响应内容
- 示例:200 OK表示请求完全成功
状态码 | 名称 | 含义 | 常见场景 |
---|---|---|---|
200 | OK | 请求成功,服务器已成功处理请求并返回数据。 | 正常访问网页或API,返回预期数据。 |
201 | Created | 请求已成功处理,并创建了新资源。 | POST 请求成功创建资源(如提交表单、上传文件)。 |
202 | Accepted | 请求已接受,但尚未处理完成(异步操作)。 | 长时间任务(如文件导出、大数据处理),服务器先返回接受状态。 |
203 | Non-Authoritative Information | 服务器成功处理请求,但返回的数据可能来自缓存或代理。 | 代理服务器或CDN返回缓存数据,而非原始服务器数据。 |
204 | No Content | 请求已成功处理,但无内容返回(响应体为空)。 | DELETE 请求成功删除资源,或前端无需更新页面的场景。 |
205 | Reset Content | 请求已成功处理,需重置客户端页面(如清空表单)。 | 表单提交后,服务器要求前端清空输入字段。 |
206 | Partial Content | 服务器成功处理部分请求(范围请求)。 | 断点续传下载(如视频、大文件分块加载)。 |
产生原因
2xx状态码表示服务器成功处理了请求,是Web应用中最常见的状态码类别。
排查方法
检查服务器日志:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
使用telnet
测试连接:
telnet example.com 80
3xx (重定向状态码)
3xx (重定向状态码)
- 请求已到达服务器
- 服务器决定需要客户端进一步操作才能完成请求
- 可能涉及URL变更或代理跳转
- 示例:301/302表示需要客户端重新发起请求
状态码 | 名称 | 含义 | 常见场景 |
---|---|---|---|
300 | Multiple Choices | 请求的资源有多个可选表示形式(如不同语言版本)。 | 服务器提供多个资源版本,需客户端选择(如 Accept-Language 头)。 |
301 | Moved Permanently | 永久重定向,请求的资源已永久移动到新URL。 | 网站改版、URL调整,搜索引擎会更新索引到新地址。 |
302 | Found | 临时重定向,请求的资源暂时移动到新URL。 | 网站临时维护、A/B测试、登录跳转等,搜索引擎仍保留原URL索引。 |
303 | See Other | 请求的资源可通过另一个URL获取(通常用于POST后的重定向)。 | POST 请求后重定向到GET请求的页面(避免重复提交表单)。 |
304 | Not Modified | 资源未修改,客户端缓存有效,直接使用本地缓存。 | 浏览器缓存机制,减少重复请求,提升加载速度。 |
305 | Use Proxy | 请求的资源必须通过代理访问(已弃用,现代浏览器不支持)。 | 历史遗留状态码,现代场景极少使用。 |
306 | Unused | 未使用(保留状态码,无实际意义)。 | HTTP/1.1 保留状态码,未来可能定义新用途。 |
307 | Temporary Redirect | 临时重定向,与302类似,但要求客户端保持请求方法不变。 | 临时跳转(如维护页面),确保POST请求不会变为GET。 |
308 | Permanent Redirect | 永久重定向,与301类似,但要求客户端保持请求方法不变。 | 永久URL变更,但需保持请求方法(如POST重定向后仍为POST)。 |
产生原因
3xx状态码表示请求需要进一步操作才能完成,通常涉及URL重定向。
排查方法
检查重定向链:
curl -L http://example.com
使用wget
跟踪重定向:
wget --max-redirect=0 http://example.com
检查Nginx/Apache重定向配置:
cat /etc/nginx/conf.d/your-site.conf
4xx (客户端错误状态码)
4xx (客户端错误状态码)
- 请求已到达服务器
- 服务器认为请求本身存在问题(客户端错误)
- 示例:404表示服务器找不到请求的资源
状态码 | 名称 | 含义 | 常见原因 |
---|---|---|---|
400 | Bad Request | 错误请求,服务器无法理解请求语法。 | 客户端发送了非法请求(如参数错误、格式错误)。 |
401 | Unauthorized | 未授权,请求需要身份验证。 | 未登录或登录过期,访问需权限的资源(如API密钥错误)。 |
402 | Payment Required | 需要支付(保留状态码,尚未广泛使用)。 | 未来可能用于付费内容访问控制。 |
403 | Forbidden | 禁止访问,服务器拒绝执行请求。 | IP被封禁、权限不足(如未付费用户访问付费内容)。 |
404 | Not Found | 资源未找到,请求的URL不存在。 | 页面被删除、URL输入错误、资源已移除但未设置重定向。 |
405 | Method Not Allowed | 请求方法不被允许(如GET请求发到只支持POST的接口)。 | API调用方式错误(如用GET请求写入操作)。 |
406 | Not Acceptable | 服务器无法生成客户端可接受的响应(如内容协商失败)。 | 客户端 Accept 头与服务器支持的格式不匹配。 |
407 | Proxy Authentication Required | 需要代理身份验证。 | 访问代理服务器时未提供认证信息(如公司内网代理)。 |
408 | Request Timeout | 请求超时,服务器等待客户端发送数据时间过长。 | 网络延迟或客户端未及时发送完整请求。 |
409 | Conflict | 请求与服务器当前状态冲突(如重复提交)。 | 并发修改冲突(如重复创建相同资源)。 |
410 | Gone | 资源已永久删除,且无转发地址。 | 页面被彻底删除且无重定向(比404更明确)。 |
411 | Length Required | 请求缺少 Content-Length 头(如POST请求未指定数据长度)。 | 客户端未正确设置请求头。 |
412 | Precondition Failed | 请求的预条件失败(如 If-Match 头校验不通过)。 | 并发控制失败(如ETag不匹配)。 |
413 | Payload Too Large | 请求体过大,超过服务器限制。 | 上传文件超过服务器配置的最大大小。 |
414 | URI Too Long | 请求的URL过长,服务器无法处理。 | 客户端生成了超长URL(如大量参数拼接)。 |
415 | Unsupported Media Type | 服务器不支持请求的数据格式(如错误的 Content-Type )。 | 客户端发送了服务器不支持的媒体类型(如上传非JSON数据到API)。 |
416 | Range Not Satisfiable | 请求的范围无法满足(如文件不存在或范围越界)。 | 断点续传时指定的范围无效。 |
417 | Expectation Failed | 服务器无法满足客户端的 Expect 头要求(如 Expect: 100-continue )。 | 客户端期望的行为未被支持。 |
418 | I’m a teapot | 幽默状态码(RFC 2324),表示服务器是茶壶,无法煮咖啡。 | 彩蛋状态码,实际服务中不会使用。 |
421 | Misdirected Request | 请求被发送到错误的服务器(如HTTP/2配置错误)。 | 反向代理或负载均衡配置错误。 |
422 | Unprocessable Entity | 请求语法正确,但语义错误(如验证失败)。 | 表单验证失败(如字段格式正确但值不合法)。 |
423 | Locked | 请求的资源被锁定(如文件被其他进程占用)。 | 并发控制场景(如文件编辑锁定)。 |
424 | Failed Dependency | 请求依赖的其他操作失败(如前置请求未完成)。 | 多步骤操作中某一步骤失败。 |
425 | Too Early | 服务器拒绝处理可能重放的请求(如TLS握手未完成)。 | 安全防护机制,防止请求重放攻击。 |
426 | Upgrade Required | 客户端需升级协议(如从HTTP升级到WebSocket)。 | 协议升级协商失败。 |
428 | Precondition Required | 请求需包含条件头(如 If-Match )以避免并发问题。 | 服务端要求客户端提供条件头以增强安全性。 |
429 | Too Many Requests | 请求过于频繁,触发限流。 | 爬虫或脚本高频访问,被服务器限制(如API调用超限额)。 |
431 | Request Header Fields Too Large | 请求头字段过大,超过服务器限制。 | 客户端发送了过大的请求头(如过多Cookie)。 |
451 | Unavailable For Legal Reasons | 因法律原因资源不可用(如政府审查)。 | 网站因版权或法律问题被屏蔽。 |
产生原因
4xx状态码表示客户端发送了错误的请求,问题通常出在客户端。
排查方法
检查请求头和请求体:
curl -v -X GET http://example.com/api
使用Postman或curl测试API:
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com/api
检查客户端代码中的请求逻辑
5xx (服务器错误状态码)
5xx (服务器错误状态码)
- 请求已到达服务器
- 服务器处理请求时发生内部错误
- 示例:500表示服务器内部错误
状态码 | 名称 | 含义 | 常见原因 |
---|---|---|---|
500 | Internal Server Error | 服务器内部错误,无法完成请求。 | 服务器代码崩溃、数据库故障等未知错误。 |
501 | Not Implemented | 服务器不支持请求的功能(如未实现的HTTP方法)。 | 客户端使用了服务器不支持的请求方法(如 PATCH )。 |
502 | Bad Gateway | 网关错误,代理服务器从上游服务器收到无效响应。 | 反向代理(如Nginx)与后端服务通信失败。 |
503 | Service Unavailable | 服务不可用,服务器暂时过载或维护。 | 网站流量激增、服务器宕机或计划内维护。 |
504 | Gateway Timeout | 网关超时,代理服务器等待上游服务器响应超时。 | 后端服务响应过慢,代理服务器主动断开连接。 |
505 | HTTP Version Not Supported | 服务器不支持请求的HTTP版本(如HTTP/3)。 | 客户端使用了服务器不支持的协议版本。 |
506 | Variant Also Negotiates | 服务器配置错误导致内容协商循环。 | 服务器内容协商配置错误(如 Vary 头设置不当)。 |
507 | Insufficient Storage | 服务器存储空间不足(如WebDAV扩展状态码)。 | 存储资源耗尽(如磁盘空间不足)。 |
508 | Loop Detected | 服务器检测到请求循环(如重定向过多)。 | 配置错误导致无限重定向(如 301/302 循环)。 |
510 | Not Extended | 客户端需扩展请求头才能完成请求(如RFC 2774)。 | 客户端未提供必要的扩展头信息。 |
511 | Network Authentication Required | 客户端需先完成网络认证(如运营商强制门户)。 | 公共Wi-Fi需登录认证后才能访问网络。 |
产生原因
5xx状态码表示服务器在处理请求时出现了错误。
排查方法
检查服务器资源使用情况:
top
free -h
df -h
检查Web服务器错误日志:
tail -n 100 /var/log/nginx/error.log
检查后端服务状态:
systemctl status your-service
journalctl -u your-service -n 100
检查数据库连接:
mysql -u username -p -h hostname
2. 请求未到达服务端的情况及表现
当请求未能到达服务器时,通常不会产生标准的HTTP状态码响应,而是会在客户端直接报错。常见情况及表现如下:
2.1 DNS解析失败
-
表现:
ERR_NAME_NOT_RESOLVED
(Chrome)或"服务器的域名解析失败"(浏览器提示) -
原因:域名无法解析为IP地址
-
客户端错误示例:
ping example.com # 返回:ping: example.com: Name or service not known
2.2 网络连接问题
-
表现:
ERR_CONNECTION_REFUSED
或"无法连接到服务器" -
原因:
- 本地网络故障
- 目标服务器IP不可达
- 防火墙拦截
-
客户端错误示例:
curl -v http://example.com # 返回:Failed to connect to example.com port 80: Connection refused
2.3 路由问题
-
表现:
ERR_CONNECTION_TIMED_OUT
或"连接超时" -
原因:
- 网络路由不可达
- 中间网络设备阻断
-
客户端错误示例:
traceroute example.com # 显示路由中断点
2.4 本地代理配置错误
- 表现:
ERR_PROXY_CONNECTION_FAILED
- 原因:代理服务器配置错误或不可用
2.5 客户端本地问题
- 表现:
ERR_CONNECTION_CLOSED
等 - 原因:
- 本地网络服务异常
- 本地防火墙阻止
- 浏览器缓存问题
诊断方法:
-
基础网络检查:
ping example.com nslookup example.com traceroute example.com # Linux tracert example.com # Windows
-
端口连通性测试:
telnet example.com 80 # 或 nc -zv example.com 80
-
DNS解析验证:
dig example.com
关键区别:
- 请求到达服务器:会收到HTTP状态码响应(1xx-5xx)
- 请求未到达服务器:客户端直接报错,无HTTP状态码返回
典型错误对比表:
情况 | 客户端表现 | 是否有HTTP状态码 | 诊断方法 |
---|---|---|---|
DNS解析失败 | 域名无法解析 | 无 | nslookup/dig |
连接被拒绝 | Connection refused | 无 | telnet/nc测试 |
路由超时 | Connection timed out | 无 | traceroute |
代理错误 | Proxy connection failed | 无 | 检查代理配置 |
本地网络问题 | 各种连接错误 | 无 | 基础网络诊断 |
总结:
请求未到达服务端时,客户端会直接报错而不会收到HTTP状态码。需要通过DNS、网络连通性等基础工具进行诊断,这与收到HTTP状态码(即使是非2xx状态码)的情况有本质区别。
3. 总结
通用排查工具
- curl - 强大的HTTP请求工具
curl -v http://example.com
curl -I http://example.com # 只获取头部信息
- wget - 下载工具,可用于测试重定向
wget --server-response http://example.com
- telnet - 测试网络连接
telnet example.com 80
- tcpdump - 网络抓包工具
tcpdump -i eth0 port 80 -w capture.pcap
- netstat - 查看网络连接
netstat -tulnp
- ss - 更现代的替代netstat的工具
ss -tulnp
- strace - 跟踪系统调用
strace -p <pid>
HTTP状态码是诊断Web应用问题的重要工具。理解各类状态码的含义和产生原因,掌握基本的排查方法,可以快速定位和解决问题。对于生产环境中的问题,建议:
- 首先检查服务器日志
- 使用curl或wget重现问题
- 检查网络连接和资源使用情况
- 逐步缩小问题范围
记住,状态码只是问题的表现,真正的原因可能隐藏在日志、配置或代码中。请求未到达服务端时,客户端会直接报错而不会收到HTTP状态码。需要通过DNS、网络连通性等基础工具进行诊断,这与收到HTTP状态码(即使是非2xx状态码)的情况有本质区别。