注意本文已过时

造成问题的函数已在 v1.2.0 更新中被删除,故本文不再对任何新版本有效。出现此问题的旧版本用户,请更新至最新版本。

网站刚从本地挪到线上,发现无法上传文件。首先想到的是 nginx 或者 PHP 的上传文件限制,检查后发现没有问题。

上传失败
上传失败

TroubleShooting

经过搜索与排查,发现是 Typecho 自身的问题。Typecho 会检测是否运行在 BAE、SAE、ACE 中,由 Common::isAppEngine() 函数处理。如果检测到,即禁用数个功能,其中包括文件上传功能。虽然我们不处于这些环境中,但第四行中的 getenv('SERVER_SOFTWARE') 会返回形如 nginx/1.x.x 的 WebServer 信息,导致错误的判断。本站在本地时使用 Windows 操作系统和 XAMPP,故不存在此环境变量,网站正常运行。

var/Typecho/Common.php#L440
1
2
3
4
5
6
7
public static function isAppEngine(){
return !empty($_SERVER['HTTP_APPNAME']) // SAE
|| !!getenv('HTTP_BAE_ENV_APPID') // BAE
|| !!getenv('SERVER_SOFTWARE') // BAE 3.0
|| (ini_get('acl.app_id') && class_exists('Alibaba')) // ACE
|| (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false) // GAE;
}

在上传文件时,会进行如下判断。导致直接退出上传逻辑,引发错误。

var/Widget/Upload.php#L97
1
2
3
if (!self::checkFileType($ext) || Typecho_Common::isAppEngine()) {
return false;
}

Fix

编辑 var/Typecho/Common.php 文件:找到 isAppEngine() 函数,直接 return false;


萌ICP备20229066 | Build by C2iCs | Powered by Hexo and Stellar 1.27.0
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本“页面”访问 次 | 👀总访问 次 | 🍖总访客

开往-友链接力