核心成果: - REDCap 15.8.0成功部署在Docker环境 - 登录功能正常,管理员账户: Admin/Admin123! - MySQL 8.0 + PHP 8.1 + Apache 2.4环境验证通过 问题解决: 1. 修复ERR_CONTENT_DECODING_FAILED错误 - 强制禁用Apache deflate模块 - PHP配置关闭zlib.output_compression - 自动注释REDCap源码中的压缩设置 2. 修复Base URL配置错误 - 更新redcap_config表中的redcap_base_url - 统一DocumentRoot与访问路径 3. 修复登录失败问题(CRLF污染) - 删除database.php末尾的PHP结束标签 - 创建.gitattributes规范换行符 - 验证REDCap官方源码无此问题 技术改进: - 添加密码重置工具脚本 - 完善docker-entrypoint.sh启动脚本 - 创建详细的部署问题解决记录 - 建立PHP配置文件最佳实践 部署文档: - REDCap本地Docker开发环境部署方案 - REDCap生产环境部署决策报告(ECS vs SAE) - 部署问题解决记录(含根因分析) 下一步: - Day 2: 开发REDCap API Adapter - 实现与IIT Manager Agent的数据对接
2.9 KiB
REDCap ERR_CONTENT_DECODING_FAILED 错误排查与修复指南
如果在浏览器访问 REDCap 时遇到 net::ERR_CONTENT_DECODING_FAILED 200 (OK),说明数据包在传输过程中被“弄脏”了。以下是按优先级排序的 4 种解决方案:
1. 禁用 PHP 的 zlib 输出压缩 (最常见原因)
REDCap 内部有时会尝试自己控制输出压缩,如果你的 php.ini 里也开启了 zlib.output_compression,两者冲突就会导致解码失败。
操作步骤:
-
找到你挂载到 Docker 容器里的 php.ini 文件。
-
搜索 zlib.output_compression。
-
将其设置为 Off:
zlib.output_compression = Off -
重启 Docker 容器:docker-compose restart redcap-web。
2. 检查并清理 PHP 文件的 BOM 头
如果你编辑过 database.php 或 config.php,并使用了 Windows 记事本,可能会在文件开头插入一个不可见的 UTF-8 BOM 字符。这个字符会抢在 Gzip 报文头之前发送,导致浏览器解压失败。
操作步骤:
- 使用 VS Code 或 Notepad++ 打开 database.php。
- 检查右下角的编码格式。如果是 UTF-8 with BOM,请将其更改为 UTF-8 (无 BOM)。
- 确保 <?php 标签前面没有任何空格或换行。
3. 屏蔽 PHP 报错对输出流的干扰
如果 PHP 开启了 display_errors,那么在 REDCap 尝试发送压缩页面时,如果代码报了一个 Notice 或 Warning,这些文字信息会直接塞进压缩流里,导致整个包损坏。
操作步骤:
在 php.ini 中临时关闭报错显示,看看页面能否恢复:
display_errors = Off
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
注:如果关闭后能访问了,说明代码里有报错,你需要去查看 docker-compose logs redcap-web 里的具体错误原因。
4. 检查临时目录 (temp) 的写入权限
REDCap 在处理输出缓冲时需要写入 temp 目录。如果权限不足,PHP 会报错,进而引发上述的解码失败。
操作步骤:
在宿主机执行以下命令,确保容器内的目录可写:
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/temp
docker exec -it redcap-web chmod -R 775 /var/www/html/temp
5. 常见原因总结表
| 可能原因 | 表现 | 解决方法 |
|---|---|---|
| zlib 压缩冲突 | 页面随机性报错 | 关闭 zlib.output_compression |
| BOM 字符污染 | 始终报错 | 将 PHP 文件保存为“无 BOM 的 UTF-8” |
| PHP 报错混入 | 升级或安装后初次访问 | 检查日志并关闭 display_errors |
| 文件截断 | 页面加载一半报错 | 增加 memory_limit 或 max_execution_time |
快速测试
你可以尝试在浏览器中使用“无痕模式”访问。如果无痕模式依然报错,则 100% 是服务器端的配置问题,请重点执行 第 1 步。