织梦上传文件限制如何调整

织梦默认上传限制较保守,附件、图片、视频上传经常因大小、类型被拒。调整上传限制涉及 PHP 配置、织梦参数、nginx 配置三层,任何一处未改到位都会导致上传失败。下面给出完整的调整方法与安全注意事项。

一、上传限制的三层控制

  • PHP 层:php.ini 中的 upload_max_filesizepost_max_size
  • 织梦层:后台"附件设置"中的最大文件大小、允许类型;
  • Web 服务器层:nginx 的 client_max_body_size

三者必须同时满足,取最小值生效。例如 PHP 允许 50M 但 nginx 限制 10M,上传 20M 文件仍会失败。

二、PHP 配置调整

编辑 /etc/php.ini(或 /etc/php/7.x/fpm/php.ini):

; 单个文件最大上传大小
upload_max_filesize=50M

; POST 请求体最大大小(必须 ≥ upload_max_filesize)
post_max_size=60M

; 内存限制(必须 ≥ post_max_size)
memory_limit=128M

; 最大执行时间(大文件上传耗时长)
max_execution_time=300

; 最大输入时间
max_input_time=300

修改后重启 PHP-FPM:

systemctl restart php-fpm
# 或
systemctl restart php7.4-fpm

三、Nginx 配置调整

编辑站点配置文件,在 http 或 server 块中加:

server {
    listen 80;
    server_name www.example.com;
    
    # 允许上传的最大请求体
    client_max_body_size 60M;
    
    # 上传超时
    client_body_timeout 300s;
    
    # ... 其他配置
}

修改后 nginx -t && nginx -s reload

四、织梦后台附件设置

登录后台 → 系统 → 系统基本参数 → 附件设置:

  • 上传文件最大大小:单位 KB,例如填 51200 表示 50MB;
  • 允许上传的文件类型:建议白名单 jpg|jpeg|gif|png|bmp|webp|pdf|zip|doc|docx|xls|xlsx|mp4
  • 上传文件保存目录:默认 /uploads/allimg/{yy}{mm},可按需调整;
  • 图片水印:根据需要开启。

五、按上传通道分别调整

1. 编辑器上传(ckeditor)

编辑器自带的上传限制在 /include/ckeditor/config.js 或对应插件配置中:

config.filebrowserUploadUrl='/plus/q.php';
config.maxImageSize=50 * 1024 * 1024; // 50MB

2. 缩略图上传

发布文章时的缩略图上传走 /dede/article_add.php/dede/article_edit.php,限制受后台附件设置控制。

3. 多图上传

图集功能走 /dede/album_add.php,单图大小受同样限制,但总大小受 post_max_size 控制。

若用宝塔面板,可在"软件商店—PHP—设置—上传限制"中直接调整,会自动同步 php.ini 与 nginx。

六、安全加固

1. 严格白名单

绝对禁止允许 php|php5|phtml|phar|htm|html|htaccess 等可执行或可解析类型:

// /include/uploadsafe.class.php
$cfg_upload_type='jpg|jpeg|gif|png|bmp|webp|pdf|zip|doc|docx|xls|xlsx|ppt|pptx|mp4|mp3';
$ext=strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if(strpos($cfg_upload_type, $ext)===false) exit('禁止上传此类型');

2. MIME 一致性校验

$finfo=finfo_open(FILEINFO_MIME_TYPE);
$mime=finfo_file($finfo, $_FILES['file']['tmp_name']);
$allow_mime=['image/jpeg','image/png','image/gif','application/pdf'];
if(!in_array($mime, $allow_mime)) exit('MIME 类型禁止');

3. uploads 目录禁止执行 PHP

location ~* /uploads/.*\.(php|php5|phtml|phar|cgi|pl|py)$ {
    deny all;
    return 404;
}

七、调整后验证

  1. 新建一篇测试文章,上传一张 30MB 图片,确认成功;
  2. 尝试上传 test.php,应被拒绝;
  3. 查看 /uploads/allimg/ 目录,确认文件正确写入;
  4. 查看 PHP 错误日志,确认无 Maximum execution time 报错。

八、常见问题排查

  • 上传大文件 413 错误:nginx client_max_body_size 太小;
  • 上传大文件 500 错误:PHP max_execution_time 太短;
  • 上传大文件卡在 100%:CDN 或反向代理超时,需调整 proxy_read_timeout
  • 上传类型不允许:织梦后台附件设置或 uploadsafe.class.php 白名单。

九、注意事项

  • 上传限制不是越大越好,过大会被攻击者利用上传超大文件耗尽磁盘与带宽;
  • 普通站点建议图片 ≤ 10MB、附件 ≤ 50MB、视频走第三方平台;
  • 会员上传通道必须更严格,限制单用户每日上传次数;
  • 调整后立即在 nginx 加固 uploads 目录执行权限,防止 webshell。
上传限制调整要在"用户体验"与"安全"之间找平衡,建议把 PHP、nginx、织梦三层一次性配齐,并把白名单与 MIME 校验作为必选项。调整完成后用真实文件做一次端到端验证,确认正常上传可用、危险类型被拒。把上传通道作为站点的高危入口持续监控,能在不影响业务的前提下最大限度降低风险。