3步搞定wordpress允许上传rar完整流程
刚接了个老客户的急活,对方网站是十年前的 WordPress 老站,后台上传素材时死活卡住。我一看报错信息,心里咯噔一下:又是这老毛病。很多站长或者刚入行的前端小白,一遇到“备案流程一头雾水”或者服务器配置报错,第一反应就是慌。其实,不管是 ICP 备案让人摸不着头脑,还是 WordPress 后台死活不让传压缩包,本质都是环境配置没对齐。今天不扯虚的,直接上干货,把 wordpress允许上传rar 的 完整流程 掰开了揉碎了讲清楚。
咱们做网站的,最怕的就是“黑盒操作”。你点一下上传,它转半天圆圈,然后弹个“File type not permitted”或者类似的红色警告。这时候别急着重装系统,90% 的情况是 PHP 配置或者插件冲突在捣鬼。下面这套方案,是我在十几个实际项目中反复验证过的,稳得很。
项目背景与需求:为什么非要传 RAR?
先说下背景。这次合作的是个做工业零部件出口的外贸公司。他们的产品图都是高清原图,单个文件就有 10-20MB,而且为了方便客户批量下载技术资料,运营同事习惯把所有 PDF 图纸打包成 RAR 或 ZIP 格式。
问题来了。WordPress 默认的 upload_mimes 数组里,压根就没有 application/x-rar 这个类型。也就是说,WordPress 的“门卫”(check_filetype 函数)一看文件格式不对,直接就把人拦在门外了。
更坑的是,这个站还在国内服务器。运营同事之前自己折腾过备案,结果被管局驳回三次,理由分别是“域名未实名认证”和“服务器 IP 不一致”。这就是典型的 备案流程一头雾水。很多设计师转前端的朋友,技术底子不错,但对国内这套“域名-服务器-备案”的绑定逻辑理解不深。
根据 中国互联网络信息中心(CNNIC) 发布的最新互联网域名服务统计报告,国内活跃域名中,企业站占比依然很大,而其中因配置不当导致的安全漏洞和数据丢失案例,每年都在上升。所以,解决这个问题不仅是传个文件的事,更是为了合规和安全。
这次的需求很明确:
- 允许后台上传 RAR 和 ZIP 文件。
- 确保上传后的文件能正常下载,不被 WAF(Web 应用防火墙)拦截。
- 不破坏原有网站的 SEO 结构,不引入新的安全风险。
- 给运营同事一个傻瓜式的操作指引,别再让我天天远程救火。
技术选型:别被插件绑架
很多新手一看传不了文件,就去后台搜“Upload Any File”或者“Allow More File Types”这种插件。
听我一句劝:能用代码解决的,绝不用插件。
为什么?
- 性能损耗:每个插件都会增加数据库查询和 PHP 加载时间。老站本来数据库就冗余,再塞个插件,首页加载速度直接掉档,SEO 排名跟着喝西北风。
- 安全黑盒:第三方插件的代码你审过吗?很多劣质插件存在 SQL 注入或文件上传漏洞。一旦黑客利用这个漏洞上传 Webshell,整个站就挂了。
- 维护成本:WordPress 一升级,插件兼容性就崩。到时候你排查半天,发现是插件冲突,删了又得重新配置。
当然,如果你是非技术人员,或者站点非常庞大,维护团队人手不足,用插件也是可以的。推荐两个相对安全、更新及时的插件:
- Upload Any File:功能全,支持自定义 MIME 类型。
- File Upload Manager:界面友好,适合运营人员使用。
但既然你是想搞懂 完整流程,咱们就走硬核路线,通过修改 functions.php 或者子主题代码来实现。这也是面试前端或全栈岗位时,面试官最爱问的“底层原理”题之一。
核心实现:代码改哪里?怎么改?
动手之前,先备份!备份!备份!
重要的事情说三遍。去 FTP 或者宝塔面板里,把当前的 functions.php 文件下载一份存本地。万一改错了,网站白屏,你还能有救。
1. 修改允许上传的文件类型
登录 WordPress 后台,找到“外观” -> “文件编辑器”(如果没有这个选项,直接用 FTP 连接服务器,进入 wp-content/themes/你的主题名/ 目录,打开 functions.php)。
在文件末尾添加以下代码:
/*** 允许 WordPress 上传 RAR 和 ZIP 文件* * @param array $types 允许的 MIME 类型数组* @return array 修改后的 MIME 类型数组*/
function allow_rar_and_zip_upload( $types ) {// 添加 RAR 文件类型$types['rar'] = 'application/x-rar';// 添加 ZIP 文件类型$types['zip'] = 'application/zip';// 顺便加上 7z,以防万一$types['7z'] = 'application/x-7z-compressed';return $types;
}
add_filter( 'upload_mimes', 'allow_rar_and_zip_upload' );
代码解析:
upload_mimes是 WordPress 提供的 Filter Hook,专门用来过滤允许上传的文件类型。- 我们定义了一个函数
allow_rar_and_zip_upload,接收$types数组,往里塞入rar、zip、7z三种类型及其对应的 MIME 值。 - 最后通过
add_filter挂钩到 WordPress 核心流程中。
保存文件,刷新后台,再去媒体库上传试试。这时候,文件选择器里应该已经能看到 RAR 格式了。
2. 解决 PHP 上传大小限制
传文件类型只是一半,另一半是 大小限制。
WordPress 默认的 upload_max_filesize 和 post_max_size 通常只有 2M 或 8M。运营同事传个 50MB 的 RAR 包,直接报“The uploaded file exceeds the upload_max_filesize directive in php.ini”。
这里有三种改法,推荐程度依次递增:
方法一:修改 .htaccess(仅限 Apache 服务器)
在网站根目录的 .htaccess 文件中添加:
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300
注意:post_max_size 必须大于或等于 upload_max_filesize,否则 PHP 会直接拒绝处理请求。
方法二:修改 wp-config.php(不推荐,但有效)
在 define('WP_DEBUG', false); 下方添加:
@ini_set( 'upload_max_filesize' , '64M' );
@ini_set( 'post_max_size', '64M');
@ini_set( 'max_execution_time', '300' );
注意:这种方式只在服务器允许 PHP 通过 ini_set 修改配置时有效。很多 Nginx 环境或共享主机是不支持的。
方法三:修改服务器 PHP 配置(最彻底,推荐)
如果你是 VPS 或独立服务器,直接去控制面板(如宝塔、cPanel)修改 PHP 版本设置。
在 php.ini 文件中找到:
upload_max_filesize = 64M
post_max_size = 64M
修改后重启 PHP 服务。这是最干净、最稳定的方案,因为它是在服务器层面生效,不依赖 WordPress 的版本或插件。
避坑指南:
如果你用的是 Nginx,光改 PHP 配置还不够,Nginx 自身也有 client_max_body_size 限制。需要在 Nginx 配置文件的 server 或 location 块中添加:
client_max_body_size 64M;
然后重载 Nginx 配置:nginx -s reload。
上线与优化:别忽略了安全与备案
代码改完,功能通了,是不是就完事了? No No No。这时候才是最考验功力的地方。
1. WAF 拦截问题
很多云服务商(如阿里云、腾讯云)或安全插件(如 Wordfence、iThemes Security)默认会拦截 .rar 和 .zip 文件,因为它们常被用于上传恶意脚本。
如果上传成功,但下载时返回 403 Forbidden,大概率是 WAF 在拦截。
- 解决方案:在安全插件的白名单里,添加
/wp-content/uploads/目录的下载权限,或者针对特定 IP 段放行。 - 更安全的做法:不要直接暴露原始文件路径。可以写一个简单的 PHP 脚本,验证用户权限后,再
readfile()输出文件内容,而不是直接让浏览器访问静态文件。
2. 备案与域名的关联
回到开头提到的 备案流程一头雾水。 很多设计师转前端的朋友,技术很强,但不懂国内的合规要求。
- 域名实名:根据 中国互联网络信息中心(CNNIC) 的规定,所有 .cn 及 .com 等主流后缀域名,必须完成实名认证。未实名的域名,解析到国内服务器后,会被运营商直接阻断访问,提示“域名未备案”。
- 备案主体:企业站必须用营业执照备案,个人站用身份证。备案期间,网站必须能访问(即“备案前置”),但这与“备案后访问”是两个概念。
- 常见驳回原因:
- 网站内容与备案主体不符(比如个人备案,网站却是公司宣传页)。
- 服务器 IP 与备案时的 IP 不一致(换了服务器必须变更备案)。
- 照片不清晰、网站截图缺失。
建议:在部署新站或迁移服务器前,先去工信部备案管理系统(https://beian.miit.gov.cn/)查询域名状态。如果是新域名,先实名认证(通常 1-3 个工作日),再提交备案。备案期间,可以先把代码部署到海外服务器或临时域名测试,等备案通过后再切换解析,避免网站长时间无法访问影响 SEO。
3. 性能优化
上传大文件后,服务器 CPU 和内存压力会增大。
- 开启 OPcache:加速 PHP 执行。
- 使用对象存储:如果 RAR/ZIP 文件很大且访问频繁,建议上传到阿里云 OSS 或腾讯云 COS,通过 CDN 加速。这样不仅减轻了 Web 服务器压力,还能提高下载速度。
- 配置 WordPress 媒体库使用 S3 兼容协议(使用插件如 "Amazon S3 and CloudFront" 或 "WPS3")。
经验总结:从救火队员到架构师
这次项目搞完,我复盘了一下,发现几个值得记录的经验:
- 最小化原则:能改配置不改代码,能改代码不用插件。插件是最后的手段,而不是第一选择。
- 全链路思维:解决一个上传问题,要看 PHP、Nginx、WAF、服务器带宽、备案状态,甚至还要看运营同事的操作习惯。孤立地看问题,永远治标不治本。
- 文档化:每次解决完问题,一定要写操作手册。这次我给运营同事写了一份《文件上传规范及常见问题排查指南》,里面包含了:
- 哪些文件类型可以传
- 文件大小限制是多少
- 如果报错,先看哪三个地方
- 备案变更的流程链接 这份文档发出去后,我远程支持的频率直接降了 80%。
对于设计师转前端的朋友,我想说:技术是基础,业务是核心,合规是底线。 你不仅要会写 CSS 和 JS,还要懂 PHP 的配置,懂 Nginx 的调优,懂国内的备案规则,甚至懂一点法律常识(比如用户隐私协议)。这才是全栈工程师的价值所在。
薪资方面,目前国内一线城市(北上广深),具备全栈能力、能独立负责项目上线的前端工程师,年薪普遍在 25w-40w 之间;二三线城市也在 15w-25w 左右。但如果你只会切图,不懂后端配置和安全,天花板会很低。
最后,留个问题给大家: 你的网站用的什么技术栈?是原生 PHP 还是 WordPress?有没有遇到过因为备案或服务器配置导致的“灵异”故障?评论区聊聊,咱们一起避坑。