注意本文已过时
造成问题的函数已在 v1.2.0 更新中被删除,故本文不再对任何新版本有效。出现此问题的旧版本用户,请更新至最新版本。
网站刚从本地挪到线上,发现无法上传文件。首先想到的是 nginx 或者 PHP 的上传文件限制,检查后发现没有问题。
TroubleShooting
经过搜索与排查,发现是 Typecho 自身的问题。Typecho 会检测是否运行在 BAE、SAE、ACE 中,由 Common::isAppEngine()
函数处理。如果检测到,即禁用数个功能,其中包括文件上传功能。虽然我们不处于这些环境中,但第四行中的 getenv('SERVER_SOFTWARE')
会返回形如 nginx/1.x.x
的 WebServer 信息,导致错误的判断。本站在本地时使用 Windows 操作系统和 XAMPP,故不存在此环境变量,网站正常运行。
1 | public static function isAppEngine(){ |
在上传文件时,会进行如下判断。导致直接退出上传逻辑,引发错误。
1 | if (!self::checkFileType($ext) || Typecho_Common::isAppEngine()) { |
Fix
编辑 var/Typecho/Common.php
文件:找到 isAppEngine()
函数,直接 return false;
。