使用jQuery AJAX发送POST请求时PHP后端$_POST无法获取参数怎么办
问题排查及解决步骤
优先修复URL路径分隔符错误
你当前AJAX配置的URL使用Windows风格的反斜杠\\作为路径分隔符,Web标准URL必须使用正斜杠/。错误的路径分隔符会触发服务端301/302自动跳转,跳转过程中POST请求会被转为GET请求,参数全部丢失。
修复后的AJAX URL配置参考:url: window.location.origin + '/partsOfPages/ajax/changeStatus.php',检查浏览器请求实际发送情况
按下F12打开浏览器开发者工具,切换到「网络/Network」面板,重新触发请求:- 确认请求的
请求方法/Method是POST,没有出现301/302跳转记录 - 查看「载荷/Payload」标签,确认
ids、status、changeStatusRKO三个参数已经正常携带 - 查看「响应/Response」标签,确认返回的
print_r($_POST)输出确实为空
- 确认请求的
校验PHP侧请求解析是否正常
如果浏览器显示参数已经正常发送,修改PHP代码打印原始请求体,确认参数是否真的到达服务端:<?php // 打印原始请求体,不受PHP解析规则影响 var_dump(file_get_contents('php://input')); print_r($_POST);- 如果原始请求体有数据,
$_POST为空:确认服务端是否正确配置解析application/x-www-form-urlencoded格式的POST请求,检查是否有全局前置代码清空了$_POST变量 - 如果原始请求体也为空:回到上一步检查请求跳转、跨域配置问题
- 如果原始请求体有数据,
其他可能的问题排查
- 检查jQuery版本:旧版本jQuery不支持data对象末尾多余的逗号,可删除
changeStatusRKO: changeStatusRKO,后面的多余逗号 - 检查服务端重写规则:确认Nginx/Apache的重写配置没有把POST请求强制跳转为GET
- 确认没有跨域预检请求拦截:如果是跨域请求,OPTIONS预检请求被服务端拦截的话,实际POST请求的参数不会被PHP接收
- 检查jQuery版本:旧版本jQuery不支持data对象末尾多余的逗号,可删除
内容的提问来源于stack exchange,提问作者Максим Левченко
相关产品推荐
相关产品推荐

