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

ESP32使用http.addHeader()添加Host请求头返回404问题排查

解决ESP32 HTTPClient添加Host头返回404的问题

我之前调试ESP32网络请求时也碰到过一模一样的情况——Postman里配置IP+Host头能正常拿到结果,放到ESP32的HTTPClient里就返回404。结合你的代码和问题场景,我来拆解下原因和解决办法:

核心原因:请求头不完整

Postman在发送请求时,会自动带上一堆标准HTTP头(比如User-Agent、Connection),但ESP32的HTTPClient默认是极简模式,只会发送最基础的头信息。像ifconfig.me这类服务器会校验请求的完整性,缺少必要的头就会返回404,哪怕你已经加了Host头也没用。

另外,旧版本的ESP32 Arduino Core里,HTTPClient处理IP地址请求时,对自定义Host头的优先级处理有小bug,可能导致你添加的Host头被覆盖或者未正确发送。

修复后的代码示例

你可以补充几个关键的标准头,同时确保头的添加顺序(虽然你试过前后,但配合其他头后顺序的影响会消失):

String new_url = "http://34.117.59.81/ip";
String host = "ifconfig.me";
HTTPClient http;

http.begin(new_url.c_str());

// 必须添加的核心头
http.addHeader("Host", host.c_str());
http.addHeader("User-Agent", "ESP32-Client/1.0"); // 模拟标准客户端标识,很多服务器会校验
http.addHeader("Connection", "close"); // 符合HTTP/1.1的连接规范

int httpResponseCode = http.GET();

// 后续处理逻辑
if (httpResponseCode == HTTP_CODE_OK) {
  String publicIp = http.getString();
  Serial.println("获取到的公网IP: " + publicIp);
} else {
  Serial.print("请求失败,响应码: ");
  Serial.println(httpResponseCode);
}

http.end();

额外排查建议

  1. 抓包验证请求头:可以用Wireshark在ESP32所在的网络里抓包,直接查看发送的HTTP请求头,确认Host头是否真的被包含在内;
  2. 升级Arduino Core版本:如果用的是比较旧的ESP32核心库,建议升级到最新版,很多HTTPClient的头处理bug已经被修复;
  3. 尝试指定端口:虽然默认80端口可以省略,但你可以试试把URL写成http://34.117.59.81:80/ip,同时Host头保持ifconfig.me,部分服务器对端口的存在性敏感。

你判断"返回404说明网络连通正常"是完全正确的,问题就出在请求头的完整性上,补充完必要的头之后应该就能正常拿到公网IP了。

内容的提问来源于stack exchange,提问作者Nigel Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:03:15