php页面空白主因是后端未返回有效HTML:先查响应头与状态码,200但Content-Length:0或Content-Type:text/plain表明PHP无输出;用curl直连PHP-FPM验证;查traefik日志中status及duration。

PHP 页面在 Traefik 下返回空白页,先看响应头和状态码
Traefik 本身不执行 PHP,它只是反向代理。页面空白大概率是后端(比如 PHP-FPM 容器)没返回有效 HTML,或返回了 204/304/500 但被静默处理。用浏览器开发者工具的 Network 面板看 status 和 Content-Type:如果是 200 OK 但 Content-Length: 0 或 Content-Type: text/plain,说明 PHP 没输出,或输出被 error_reporting 和 display_errors 抑制了。
- curl 直连 PHP-FPM 容器(绕过 Traefik)验证是否真空白:
curl -v http://php-container:9000/index.php(注意:9000 是 FPM 默认监听端口,不是 HTTP 端口) - Traefik 日志里搜
status=200或status=500,重点看duration是否极短( - 检查响应头是否有
X-Powered-By: PHP—— 没这个头,说明请求根本没进 PHP,可能路由规则写错或中间件拦截了
检查 Traefik 的服务与路由配置是否匹配 PHP 后端协议
Traefik 默认按 HTTP 协议转发,但 PHP-FPM 是 FastCGI 协议,不能直接对接。常见错误是把 service 指向了 php:9000 这类 FPM 地址,而没配中间层(如 nginx 或 caddy)。Traefik 无法原生 talk FastCGI。
- 确认你的 PHP 服务暴露的是 HTTP 接口(例如用 nginx + php-fpm 组合,nginx 监听 80,再 upstream 到 php-fpm),Traefik 只代理 nginx 的 80 端口
- 如果硬要用 Traefik 直连 PHP,必须加一层适配 —— 比如用
php-server(基于 swoole)或php-builtin-server(仅开发用),并确保它监听 TCP HTTP 端口(如 8000) - 检查
traefik.yml或 docker labels 中的traefik.http.routers.xxx.rule:路径前缀是否漏了/?比如写成Path: phpapp而非PathPrefix: /phpapp,会导致 404 静默转为空白
PHP 容器内错误未输出,靠日志定位真实原因
空白页最常因 PHP 解析失败、扩展缺失、权限问题或 require 路径错误导致 fatal error,但 display_errors=Off 时只返回空响应。
- 进 PHP 容器执行:
php -l /var/www/html/index.php检查语法错误;php -m | grep mysqli看扩展是否加载 - 查看 PHP 错误日志(不是 Apache/Nginx 日志):
tail -f /var/log/php/error.log或容器 stdout(如果 error_log = stderr) - 临时在
index.php开头加三行强制报错:ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL);
error_reporting(E_ALL);—— 注意:这仅对当前脚本生效,且需确保没被 .htaccess 或 php.ini 全局覆盖
- 检查文件权限:
www-data用户能否读取.php文件?能否写入session.save_path?ls -l /var/www/html/看属主是否为www-data:www-data
Docker 网络与 Traefik 动态配置导致服务不可达
Traefik 依赖容器 label 或 file provider 加载路由,如果 PHP 容器启动顺序不对、网络未就绪或 label 写错,Traefik 就会返回 502 或空响应(取决于超时设置)。
立即学习“PHP免费学习笔记(深入)”;
- 运行
docker network inspect traefik_default(网络名以你实际为准),确认 PHP 容器和 Traefik 在同一网络,并有正确 IP 分配 - 检查容器 label 是否启用 Traefik:
docker inspect php-app | jq '.[0].Config.Labels',应包含类似"traefik.http.routers.php.rule=Host(\"example.com\")" - Traefik 启动参数是否带
--providers.docker=true且指定了正确的--providers.docker.endpoint=unix:///var/run/docker.sock - 如果用了
traefik.http.services.php.loadbalancer.healthcheck,而 PHP 容器没开健康检查端点(如/healthz),可能导致 Traefik 认为服务 down,拒绝转发
Traefik 下 PHP 空白页真正卡点往往不在 Traefik 本身,而在「谁在执行 PHP」和「错误是否透出」这两个环节。很多人花半天调 Traefik 配置,最后发现是 php-fpm.sock 权限不对,或者 index.php 第一行就 require 'vendor/autoload.php' 失败却没日志。盯住容器日志和 curl 直连结果,比反复改 router rule 更快。