|
|
最近折腾 xiuno 的时候,碰到一个老生常谈的问题:上传附件的限制到底该怎么设,既要防止空间被滥用,又别把正常用户逼走。这里把我的一些踩坑和折中思路写下来,供有同样困惑的站长参考。
先说默认体验。xiuno 本身的上传规则比较“保守”,很多模板或老插件还停留在几年前的设定:单文件大小偏小、可允许的后缀名不齐、缩略图策略简单粗暴
,甚至有的还写死了 MIME 检测,结果就是用户一上传 PSD、HEIC、甚至稍大一点的 MP4,就红字报错。更麻烦的是,服务端环境各家各配:Nginx、PHP-FPM、CDN 缓存层、xiuno 自己的 conf,多层都有阈值,任何一环没对齐,都会出现“看起来能传,其实传不上”的诡异现象。
我先把定位思路说清楚:别急着改代码,先画一条“上传链路”。浏览器前端限制 -> 站点 JS/插件校验 -> Nginx client_max_body_size -> PHP upload_max_filesize / post_max_size -> PHP 临时目录空间 -> xiuno 白名单/大小限制 -> 存储(本地或对象存储)写入权限与回源。逐步放大阈值,边测边
观察日志。尤其关注 Nginx 的 error.log、PHP 的 error_log 和 xiuno 的调试输出,配合浏览器 Network 面板看返回码与耗时。比如 413 大概率是 Nginx 限制,200 但无附件记录常见是 PHP 临时目录满了,返回 500 则优先看权限与对象存储回写失败。
具体到参数,给一组我实践中过得去的“兼顾日常”的基线,供对照:
- Nginx: client_max_body_size 128m;fastcgi_read_timeout 120s(更大视频站点再提)。
- PHP: upload_max_filesize=128M;post_max_size=128M;max_file_uploads 至少 20;memory_limit 不低于 256M;临时目录 tmp 留足空间并定时清理。
- 前端与 xiuno
前端与 xiuno 配置:把允许的后缀名从常见图片扩展到 docx、xlsx、pdf、zip、rar、7z、psd、ai、mp3、mp4、heic 等;单文件上限与服务端一致设 128MB,分角色区分更稳妥(新用户 20MB,老用户 128MB,版主以上 512MB)。如果用到断点续传或分
块上传的插件,务必确认前后端切块大小一致,且服务器超时时间要覆盖最慢用户的网络情况;否则“99% 失败”的投诉会把你逼疯。
安全这块别偷懒。单靠后缀名白名单不够,最好叠加 MIME 检测与内容签名校验,拒绝伪装脚本;图片开启 EXIF 清理,避免暴露位置信息;对可执行类文件(如 php、sh、bat)无条件拦截,即便压缩包里也要做深度检测。病毒扫描可以接入 clamd 或三方 API,至少对首发用户与高风险后缀做抽检。再加一道频率限制:按用户、IP、时间窗统计上传次数与总量,触发阈值就降速或临时禁用上传入口,既防滥用也控成本。
说到用户体验,两个细节很关键:进度与失败可恢复。大文件必须有实时进度条与剩余时间预估,失败后能重试而不必 |
|