phpenv需同步调大nginx的client_max_body_size和php的post_max_size、upload_max_filesize及memory_limit,并用file_get_contents('php://input')手动解析json,同时配置options预检响应以支持跨域post。

phpEnv 默认不支持大体积 JSON POST 请求,必须手动调大 Nginx 和 PHP 两层限制,否则直接返回 413 错误。
修改 Nginx 的 client_max_body_size
phpEnv 的 Nginx 配置文件通常位于 C:\phpEnv\nginx\conf\nginx.conf(Windows)或 /usr/local/phpenv/nginx/conf/nginx.conf(Linux/macOS)。不能只改 server 块,必须在 http 块顶层设全局值,否则 location 级配置可能被忽略:
- 在
http {开头后立即添加:client_max_body_size 100M; - 如果只想针对 API 路由生效,可在对应
location ~ \.php$或location /api/块内再加一遍该指令 - 改完必须重启 Nginx:
phpenv nginx restart(Windows)或sudo phpenv nginx restart(Linux/macOS)
调整 PHP-FPM 的 post_max_size 和 upload_max_filesize
phpEnv 的 PHP 配置文件路径一般是 C:\phpEnv\php\php.ini 或 /usr/local/phpenv/php/php.ini。注意:即使你发的是纯 JSON、不带文件,post_max_size 仍会拦截整个请求体:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 确保
post_max_size≥client_max_body_size(例如都设为100M) -
upload_max_filesize可设小些(如20M),但不能大于post_max_size - 必须同时检查
memory_limit是否足够(JSON 解析会占用额外内存,建议 ≥256M) - 改完执行:
phpenv php restart(Windows)或sudo phpenv php restart(Linux/macOS)
PHP 代码中正确读取 JSON POST 数据
即使 Nginx 和 PHP 都放开限制,$_POST 依然为空——这是正常行为。JSON 数据不会自动填充到 $_POST,必须手动读取原始流:
- 用
file_get_contents('php://input')获取完整 JSON 字符串 - 立刻用
json_decode($json_string, true)解析,检查json_last_error()是否为JSON_ERROR_NONE - 不要依赖
getallheaders()判断Content-Type,Nginx 可能未透传;应直接尝试解析,失败则返回 400 - 示例片段:
$raw = file_get_contents('php://input'); $data = json_decode($raw, true); if ($data === null && json_last_error() !== JSON_ERROR_NONE) { http_response_code(400); exit(json_encode(['error' => 'Invalid JSON'])); }
绕过 OPTIONS 预检失败的常见陷阱
前端若用 fetch 发送 application/json,浏览器会先发 OPTIONS 请求。phpEnv 自带的 Nginx 默认不处理它,导致跨域 POST 卡在预检阶段:
- 在对应
location块里加:if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' 'https://your-frontend.com'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain charset=UTF-8'; return 204; } -
Access-Control-Allow-Origin不能填*,否则带withCredentials时会被浏览器拒绝 -
Content-Type必须出现在Access-Control-Allow-Headers中——不是它的值(如application/json),而是 header 名本身
最容易被忽略的是:phpEnv 的 Nginx 和 PHP 配置文件可能有多个副本(比如不同 PHP 版本各一份),改错文件会导致看似重启了却毫无效果。务必确认你编辑的是当前启用版本所加载的 nginx.conf 和 php.ini。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










