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

PHP会话与JS Fetch API兼容问题求助

问题排查与解决方案

核心问题原因

你的Fetch请求存在请求体格式与Content-Type不匹配的错误,同时该错误和session_start()的执行逻辑叠加,导致会话与POST数据解析均出现异常:

  • 你用FormData构造请求体,却手动指定了Content-Type: application/x-www-form-urlencoded。FormData默认生成multipart/form-data格式的请求体,与你设置的Content-Type完全不兼容,PHP无法正确解析$_POST数据。
  • 当session_start()执行时,PHP会处理会话Cookie(发送Set-Cookie头或验证现有Cookie),触发输出缓冲机制,间接导致PHP无法读取格式不匹配的请求体;而注释掉session_start()后,PHP跳过会话处理,反而能通过兼容行为读取到原始请求体并解析。

修复方案(二选一)

方案1:保留FormData,移除手动设置的Content-Type

让浏览器自动处理FormData对应的Content-Type头:

const body = new FormData();
body.append('foo', "bar")
fetch(`/tracking`, {
    credentials: "same-origin",
    method: "POST",
    body
})

此时浏览器会自动添加类似multipart/form-data; boundary=----WebKitFormBoundaryxxx的正确请求头,PHP能正常解析$_POST,session_start()也可正常处理会话。

方案2:使用URLSearchParams发送x-www-form-urlencoded格式数据

若确实需要发送application/x-www-form-urlencoded格式数据,改用URLSearchParams替代FormData:

const body = new URLSearchParams();
body.append('foo', "bar")
fetch(`/tracking`, {
    credentials: "same-origin",
    method: "POST",
    body,
    headers: { "Content-Type": "application/x-www-form-urlencoded" }
})

该格式与你设置的Content-Type完全匹配,PHP能正确解析$_POST,会话功能也会恢复正常。

验证修复效果

修改后可使用以下调试代码测试:

<?php
session_start();
var_dump($_POST);
var_dump($_SESSION);
http_response_code(200);
die();

此时应能看到$_POST['foo']的正确值,且后续请求中$_SESSION['foo']会被正常保留。

内容的提问来源于stack exchange,提问作者Simon Trichereau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:13:00