Traefik 本身不控制 PHP 文件上传大小,真正起作用的是 PHP 的 upload_max_filesize、post_max_size 及 memory_limit,以及 Traefik 的 maxRequestBodyBytes 配置(需 ≥ post_max_size)。

traefik 本身不控制 PHP 文件上传大小
Traefik 是反向代理,它不会解析 HTTP 请求体,更不会干预 PHP 的 upload_max_filesize 或 post_max_size。你改 traefik 配置却发现上传还是被拒,大概率是 PHP 或其运行环境(如 PHP-FPM、Nginx/Apache)在拦截——traefik 只负责把请求转发过去,中间没“卡”文件大小。
PHP-FPM 场景下真正起作用的三个配置项
如果你用的是 PHP-FPM(绝大多数 Docker + Traefik 组合都如此),上传失败通常由以下三处共同决定,缺一不可:
-
upload_max_filesize:PHP 允许单个上传文件的最大体积(如100M) -
post_max_size:整个 POST 请求体上限,必须 ≥upload_max_filesize(如128M) -
client_max_body_size(若前置有 Nginx)或fastcgi_read_timeout(超时导致中断)
注意:memory_limit 也得足够大,否则大文件解析时会 OOM;建议设为 256M 或更高。
traefik 需要配的仅是请求体转发限制
Traefik 默认允许最大 4MB 的请求体,超过会直接返回 413 Request Entity Too Large。这不是 PHP 拒绝的,是 traefik 自己拦的。解决方法是在对应路由的中间件中设置 maxRequestBodyBytes:
立即学习“PHP免费学习笔记(深入)”;
http:
middlewares:
upload-limit:
headers:
customRequestHeaders:
# 可选:加个 header 方便调试
retry: {}
# 关键:放开 body 大小限制
maxRequestBodyBytes: 1073741824 # 1GB,单位是字节
然后在你的服务路由中引用它:
发卡宝是一个专业的软件卡密等虚拟商品在线交易平台,拥有多种兑换方式,费率低,结算快,正规企业平台一直稳定运营,24小时不间断提供自动发卡服务。【模板说明】试用版自带一套模板(响应式)【环境支持】PHP环境 / 200M或以上空间大小 / 开启父路径 / 设置index.php为默认首页 / 目录写入权限需要开启【数据库】MySQL【安装步骤】将文件上传至空间目录,运行“http://域名/inst
labels: - "traefik.http.routers.php-app.middlewares=upload-limit"
⚠️ 容易踩坑:这个值必须 ≥ PHP 的 post_max_size,否则请求根本到不了 PHP 层。
Docker 环境中 PHP 配置生效的关键点
很多人改了 php.ini 却没生效,是因为容器内 PHP 配置加载顺序或覆盖方式不对:
- 不要只改宿主机挂载的
php.ini,确认容器内实际加载的是哪个(运行php --ini查看) - Dockerfile 中用
RUN echo 'upload_max_filesize = 200M' >> /usr/local/etc/php/conf.d/uploads.ini更可靠 - 如果用
php:apache镜像,还要检查.htaccess或 Apache 的LimitRequestBody - 重启 PHP-FPM 进程(不是只 restart 容器):
docker exec -it php-fpm-container kill -USR2 1或直接docker restart
最稳妥的验证方式:写个 phpinfo() 页面,搜索 upload_max_filesize 和 post_max_size,看值是否是你设的,且状态栏显示 “Local Value” 和 “Master Value” 一致。
别漏掉 client 端的 max_file_size 隐藏字段(如果表单里写了),它只是前端提示,不影响后端限制,但容易让人误判问题位置。










