在使用phpEnv搭建的Nginx环境运行网站时,上传稍大一点的文件就返回413 Request Entity Too Large错误,这是新手非常常见的问题。413错误表示服务器拒绝处理当前请求,因为请求的实体内容(包括请求头和请求体)超过了Nginx允许的最大值。phpEnv默认的Nginx配置中,client_max_body_size通常设置为1m,也就是只允许1MB左右的请求,一旦上传的文件超过这个限制,Nginx会直接拦截请求并返回413,请求甚至根本不会到达PHP层面。下面详细介绍这个问题的原因与完整解决方案。

一、413错误的产生原理
Nginx在处理客户端请求时,会先解析请求头,再根据情况接收请求体。client_max_body_size指令规定了单个请求允许的最大体积,默认值只有1m。当请求体(例如POST上传的文件)或请求头总体积超过这个限制时,Nginx不会把请求转发给后端的PHP-FPM,而是直接返回413状态码。
需要注意一个细节:很多人以为413只和文件大小有关,其实请求头过大同样可能导致问题。如果客户端携带了超大Cookie、过长的自定义Header,Nginx会返回400或431错误,而不是413;413严格对应的是请求实体体积超限。因此在排查时要先弄清楚浏览器实际收到的状态码,再对症下药。可以通过浏览器开发者工具的Network面板查看返回码和请求详情,确认是413后再去修改Nginx配置。
二、在phpEnv中找到并修改Nginx配置
phpEnv安装目录下有专门的Nginx文件夹,例如默认路径类似D:\phpEnv\nginx\conf。Nginx主配置文件是nginx.conf,其中通过include指令引入了虚拟主机配置,通常位于vhost或conf.d目录下。如果只在nginx.conf的http块中修改,而虚拟主机配置中又单独定义了该指令,虚拟主机的值会覆盖http块的值,这就是很多人改了不生效的原因之一。
推荐的写法是在nginx.conf的http块中增加全局配置,同时在对应的站点配置文件的server块中确认没有更小的限制:
# 打开 D:\phpEnv\nginx\conf\nginx.conf
# 在 http { } 块内添加
http {
client_max_body_size 100m; # 允许最大100MB的请求体
client_body_buffer_size 256k; # 请求体缓冲区大小
client_body_timeout 120s; # 请求体接收超时时间
}
如果只想针对某个站点调整,可以修改该站点在vhost目录下的配置文件,在server块内添加client_max_body_size 100m;。修改完成后务必在phpEnv面板中重启Nginx服务,或者打开命令行执行nginx -s reload,否则配置不会生效。执行nginx -t可以检查配置文件语法是否有误,避免重启失败。
三、同步调整PHP的上传限制
解决了Nginx层面的限制后,还必须检查PHP自身的配置,否则上传仍然会失败,只是错误从413变成PHP的上传超限提示。PHP相关的参数主要有三个:upload_max_filesize控制单个文件的最大体积,post_max_size控制整个POST请求的最大体积,memory_limit控制脚本可用内存。它们的关系必须满足post_max_size大于upload_max_filesize,否则多文件同时上传时会出问题。
在phpEnv中切换PHP版本后,每个版本都有独立的php.ini文件,位于类似D:\phpEnv\php\php-8.0\php.ini的路径下。找到并修改以下配置:
upload_max_filesize = 100M post_max_size = 120M memory_limit = 256M max_execution_time = 300 max_input_time = 300
修改后同样需要重启PHP服务。如果phpEnv面板中显示了当前使用的php.ini路径,也可以写一个phpinfo页面确认Loaded Configuration File是否指向你修改的那个文件,避免改错版本。另外,如果使用了FastCGI方式,还要留意Nginx中fastcgi参数的fastcgi_read_timeout,大文件上传较慢时适当调大,防止504超时。
四、验证修改是否生效
所有配置修改完成并重启服务后,可以通过几种方式验证。最直接的是上传一个之前会报413的文件再试一次;也可以在站点根目录写一个测试页面,输出ini_get('upload_max_filesize')和ini_get('post_max_size')确认PHP限制已更新。如果仍报413,优先排查是否改错了配置文件、server块中是否有更小的覆盖值、以及Nginx是否真正重启成功。
还可以用curl模拟大请求体测试Nginx层面的限制:
# 生成一个50MB的测试文件 dd if=/dev/zero of=test.bin bs=1M count=50 # 用curl上传观察返回码 curl -v -F "file=@test.bin" http://127.0.0.1/upload.php
如果返回码不再是413而是进入业务逻辑,说明Nginx配置已经生效。总结来说,413错误的解决思路是分层排查:先确认Nginx的client_max_body_size,再确认PHP的upload_max_filesize和post_max_size,最后检查超时相关参数,按顺序调整并重启服务,问题基本都能解决。
phpEnvNginx 413错误client_max_body_size修改时间:2026-08-31 02:36:35