Ubuntu 20.04基于Docker部署PHP,Post表单后偶发输出php://input内容
POST提交后test.php无理由输出php://input内容的解决方案
现场基本信息
- 宿主机系统:Ubuntu 20.04
- 容器环境:Docker 20.10.5(构建版本55c4c88)
- 异常表现:向仅写有
die语句的test.php提交POST表单时,响应首行无任何前置输出就直接返回php://input对应的原始请求体内容;手动关闭、重启PHP容器后,异常自动消失 - 业务代码:
前端提交表单:
test.php完整代码:<form action="test.php" method="post"> <label for="field">something</label> <input type="text" name="something"> <button type="submit">submit</button> </form><?php die; - 部署配置:自定义Docker服务配置参考公开开源仓库实现
根因说明
这类无主动输出却返回原始请求体的问题,不需要排查业务代码逻辑——因为重启容器即可恢复,说明问题来源于运行时的配置漂移,是PHP-FPM的执行流程被非预期的前置逻辑注入导致的。
排查与修复操作
- 检查PHP前置加载配置
进入PHP运行容器,执行php --ini遍历所有加载的配置文件,重点查看auto_prepend_file、auto_append_file两项的配置值。如果该值被意外设置为php://input,会强制所有PHP脚本执行前,优先把原始请求体内容作为前置脚本加载运行;如果请求体内容不符合PHP语法规则,引擎会直接输出原始文本,和当前现象完全匹配。由于这类配置改动是运行时内存生效,重启容器时会被镜像内置的默认配置覆盖,因此异常会自动消失。 - 检查Nginx FastCGI传参配置
进入Nginx运行容器,执行nginx -T导出全量站点配置,搜索是否存在fastcgi_param PHP_VALUE的配置项被意外写入auto_prepend_file=php://input的残留调试逻辑。这类配置通常通过Nginx热加载生效,不会触发进程重启,因此只有完全重启容器时,配置才会被重置为正确值。 - 排查挂载卷下的遗留调试脚本
检查站点根目录的挂载共享卷,是否存在之前调试遗留的自动读取php://input并输出的脚本。这类脚本因为关联了auto_prepend的加载规则被自动调用,容器重启后因为卷挂载的权限刷新,脚本无法被正常访问,异常就随之消失。
快速验证方法
当异常再次复现时,不要着急重启容器,在站点根目录创建临时探针脚本,内容为:
<?php phpinfo();
通过浏览器访问该脚本,重点核对auto_prepend_file、auto_append_file两项的当前生效值,就能快速定位是否存在前置加载的异常配置。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

