现象描述
进入 WordPress【工具 → 站点健康 → 信息 → 媒体处理】查看参数:
- upload_max_filesize = 20M
- post_max_size = 20M
PHP 配置已经调整完成,刷新后台,媒体上传页面依然提示:最大上传文件大小:1 MB
上传大于 1MB 文件直接报错,很多人反复修改 php.ini、.user.ini无效,陷入死循环。
原理复盘
很多开发者误以为上传限制只由 PHP 管控,完整请求链路顺序:
客户端 → Nginx/Apache → PHP → WordPress
限制优先级从上到下,上游拦截后,请求根本抵达不了 PHP。
Nginx 默认
client_max_body_size 1M,请求在进入 PHP 之前直接截断。WordPress 读取 PHP 配置显示 20M,但实际上传被 Web 服务器拦截,出现参数与前台提示不一致的诡异现象。
一、先修复 PHP 配置隐患(基础规范)
当前配置缺陷:post_max_size建议大于 upload_max_filesize。
文件 + 表单附加数据会占用 POST 体积,两者相等极易触发隐性超限。
推荐最终配置(.user.ini /php.ini 通用)
ini
upload_max_filesize = 20M
post_max_size = 24M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
修改完成重载 PHP-FPM。
二、最高概率解决方案:调整 Nginx 请求体限制(宝塔 / Nginx 服务器必做)
宝塔面板操作
网站 → 设置 → 配置文件,在 server { } 内部添加一行:
nginx
client_max_body_size 30M;
保存配置,重载 Nginx。
注意:不要写在 location 段,优先放置在 server 层级;单位区分大小写,
30m小写同样生效。
独立服务器直接修改 nginx.conf
全局配置 /etc/nginx/nginx.conf
nginx
http {
client_max_body_size 30M;
}
执行重载命令
bash
nginx -t
systemctl reload nginx
三、第二大诱因:WordPress 多站点(Multisite)强制限制
多站点上传限制优先级高于 PHP 参数,极易被忽略。
操作路径:
【我的站点 → 网络管理 → 设置 → 网络设置】
找到 最大上传文件大小
⚠️ 单位是 KB!
如果这里填写 1024(1MB),直接覆盖所有服务端配置。
需要支持 20MB,修改为 20480,保存。
四、插件 / 主题拦截排查
安全插件、迁移插件、媒体优化插件、WAF 类插件可以通过代码强制覆盖上传上限。
快速验证方案:
- 后台全部插件临时禁用
- 切换回 WP 默认主题
- Ctrl+F5 强制刷新页面,查看上传上限是否恢复正常 若恢复,逐个启用插件定位限制来源。
五、CDN、云 WAF、防火墙层面限制
如果网站接入 Cloudflare、阿里云 WAF、腾讯云 CDN:
部分服务商免费套餐默认请求体上限 100MB 以内,但少数自定义规则会限制为 1MB。
排查方式:
临时域名直连服务器(绕过 CDN)测试上传,能正常上传即可确认是 CDN 侧限制,前往对应后台调整请求大小限制。
六、修改完成后的标准验证步骤
- 重载 PHP-FPM、Nginx
- 浏览器强制刷新(Ctrl+F5,清除页面缓存)
- 进入媒体添加页面查看上限提示
- 准备 1.5MB 测试文件,尝试上传验证
七、应急替代方案(来不及调整配置)
大型压缩包、备份文件不要走 WP 后台上传:
使用 SFTP/FTP 上传至对应目录解压:
- 主题包:
wp-content/themes/ - 插件包:
wp-content/plugins/媒体文件:直接上传wp-content/uploads,可配合插件同步入库。
常见踩坑总结
- 只改 PHP,不改 Nginx
client_max_body_size,90% 场景依旧失败 post_max_size ≤ upload_max_filesize,埋下隐性上传失败隐患- 多站点管理员忘记网络设置内独立上传限制
- 修改配置后没有重载服务,浏览器缓存导致判断失误
.user.ini文件名写错,缺少开头小数点