Unity发送POST请求到PHP服务端无法获取$_POST数据问题求助
可能原因及排查方案
重定向导致参数丢失
UnityWebRequest默认跟随301/302重定向时,会自动将POST请求转为GET请求,原本的POST参数会全部丢失。常见触发场景包括:请求地址写的是HTTP但服务器强制跳转HTTPS、域名带www跳转不带www(或反过来)、路径末尾缺/被服务器补全跳转。
排查方法:在C#代码的成功分支输出www.responseCode,如果返回值为301/302,直接将请求地址改成跳转后的最终地址即可。PHP配置导致POST解析失败
检查php.ini中的以下配置项:request_order配置值需包含P,否则PHP不会填充$_POST数组post_max_size配置值小于你发送的内容大小,会导致POST数据被清空variables_order配置如果缺失P也会影响$_POST生成
排查方法:在PHP脚本顶部添加phpinfo();查看上述配置实际值。
输入流被提前读取导致
$_POST为空
PHP的php://input流是只读一次的,如果你的应用有前置中间件、公共引入文件提前调用了file_get_contents('php://input'),后续PHP就无法再解析流内容填充$_POST数组。
排查方法:在savedata.php最顶部添加以下调试代码,查看原始请求内容是否存在:<?php var_dump(file_get_contents('php://input')); var_dump($_SERVER['CONTENT_TYPE']); var_dump($_SERVER['REQUEST_METHOD']); ?>如果原始输入有内容、但
$_POST为空,基本可以确定是输入流被提前读取,或者请求Content-Type不是PHP支持的表单格式。请求头设置错误
虽然WWWForm默认会自动设置Content-Type: application/x-www-form-urlencoded,但如果你后续手动调用www.SetRequestHeader覆盖了Content-Type为application/json等其他值,PHP无法将对应格式的内容解析到$_POST中。WebGL平台跨域预检问题
如果你的项目打包为WebGL版本,跨域请求时浏览器会先发送OPTIONS预检请求,若PHP侧没有正确处理OPTIONS请求直接返回,后续实际POST请求可能无法正常到达,或者你拿到的是OPTIONS请求的响应(OPTIONS请求无POST参数)。服务器安全规则拦截
服务器部署的WAF、Apache的mod_security、Nginx的安全规则可能会拦截你的POST请求,将参数清空或者直接拦截请求。可以检查服务器的访问日志、安全日志确认请求是否被拦截。
内容的提问来源于stack exchange,提问作者BrainChemist

