ESP8266向XAMPP的PHP文件POST数据无参数问题排查
ESP8266 POST请求返回302且$_POST为空修复方案
核心根因
302跳转+HTTP请求格式不规范是这类问题的两个核心诱因:
- ESP8266 AT固件默认自动跟随302跳转,跳转时会把原POST请求转为GET请求,请求体直接丢弃,最终PHP拿到的是空参数的GET请求,所以字段全空
- 手动构造HTTP请求时换行符、Content-Length、Content-Type配置错误,会导致Apache无法解析请求体,$_POST为空
分步修复步骤
1. 先关闭ESP8266自动重定向,定位302来源
先执行以下AT指令关闭自动跳转,拿到302响应的真实跳转地址:
AT+SYSSTORE=0 // 临时修改参数不写入flash,避免改乱默认配置 AT+HTTPREDIR=0 // 关闭自动跟随3xx跳转
之后重新发POST请求,看返回的302响应头里的Location字段:
- 如果Location是带末尾斜杠的地址/其他路径,后续请求直接用Location里的完整路径即可绕开跳转
- 如果Location是域名地址,说明你没带正确的
Host请求头,补全Host头为192.168.1.103即可
2. 严格校验手动构造的POST请求格式
如果你是通过AT+CIPSTART建立TCP连接手动拼HTTP请求,90%的参数丢失问题都是格式不符合规范导致,必须严格遵循以下要求:
- 所有换行必须使用
\r\n(CRLF格式),不能只发\n(LF格式) - HTTP请求头和请求体之间必须留一个空行(即连续两个
\r\n) Content-Length必须严格等于请求体的字节长度,不能多算空行、不能少算参数字符Content-Type必须设置为application/x-www-form-urlencoded,用其他值PHP不会自动把请求体解析到$_POST数组
验证可用的最小请求模板如下,直接替换参数即可:
POST /insert.php HTTP/1.1 Host: 192.168.1.103 Content-Type: application/x-www-form-urlencoded Content-Length: 21 Connection: close Col_1=123&Col_2=456
对应的AT发送流程:
AT+CIPSTART="TCP","192.168.1.103",80 // 等返回CONNECT OK后,计算完整HTTP请求的总字节数,填入CIPSEND参数 AT+CIPSEND=XXX // 等模块返回>提示符后,一次性发送拼好的完整HTTP请求,等待SEND OK和服务器返回即可
3. 服务端侧验证请求是否送达
在insert.php开头加调试代码,直接读取原始请求输入,绕过$_POST的解析逻辑确认是否真的收到参数:
<?php // 调试用,问题解决后可删除 file_put_contents('./post_debug.log', date('[Y-m-d H:i:s] ').file_get_contents('php://input')."\r\n", FILE_APPEND); // 原有业务逻辑
- 如果日志文件里没有你发的参数串,说明ESP8266侧请求没发对,回到第二步检查格式
- 如果日志里有完整参数串但$_POST为空,检查Content-Type是否配置正确
4. 高频踩坑点排查
- 不要省略Host头:HTTP/1.1协议强制要求带Host头,缺失的话Apache默认虚拟主机配置会返回302跳转
- 不要提前断开TCP连接:发完请求后等待服务器返回即可,加
Connection: close头让服务器主动断开,避免请求没发完就断连导致参数丢失 - 不要在参数里加多余空格:参数串
Col_1=xxx&Col_2=yyy不要在等号、&符号前后加空格,否则会被当成参数名/值的一部分
内容的提问来源于stack exchange,提问作者Daveolw1
相关产品推荐
相关产品推荐

