You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:33:40