上周马马虎虎搭完网站后一直有俩bug,一是网站所有a 标签全都有target="_black" 属性导致网站不管点哪儿都会新开网页影响用户体验;二是启用附件托管类插件后都会出现附件图片无法正常上传的问题,奇怪的是这个bug只会在上传图片时出现,如果是上传其他类型的文件就没问题。网上搜了搜,发现第一个问题似乎是因为网站不是80/443端口导致的,当时因为还在处理备案所以就暂时没管。

然而今天,处理备案的工作人员打电话说我id快过期了不能备案,于是我一怒之下就租了个国外的服务器懒得折腾了 。迁移完网站后,申请了个SSL博客挂在了443上,第一个bug果然就没了,但图片上传问题还是存在,折腾了一会儿也解决了。

首先先看下控制台报错信息:

控制台
控制台

Uncaught SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at Function.jQuery.parseJSON (jquery.js?v=17.10.30:25)
    at c.Uploader.FileUploaded (write-post.php:1105)
    at c.Uploader.dispatchEvent (plupload.js?v=17.10.30:1)
    at c.Uploader.trigger (moxie.js?v=17.10.30:1)
    at v.L.v.onload (plupload.js?v=17.10.30:1)
    at v.<anonymous> (moxie.js?v=17.10.30:1)
    at Array.<anonymous> (moxie.js?v=17.10.30:1)
    at A (moxie.js?v=17.10.30:1)
    at Object.l [as inSeries] (moxie.js?v=17.10.30:1)

emmmm... 似乎并没啥卵用,再看看ajax请求:

ajax request
ajax request

<br/><b>Warning</b>: getimagesize(/www/wwwroot/blog/usr/uploads/2021/12/30/1640822659.png): failed to open stream: No such file or directory in<b>/www/wwwroot/blog/usr/plugins/VOID/Plugin.php</b> on line <b>270</b><br/>[
    "https:\/\/cdn.cirno.me\/usr/uploads\/2021\/12\/30\/1640822659.png",
    {
        "cid": "77",
        "title": "\u8bfe\u8868.png",
        "type": "png",
        "size": 104826,
        "bytes": "103 Kb",
        "isImage": true,
        "url": "https:\/\/cdn.cirno.me\/usr/uploads\/2021\/12\/30\/1640822659.png",
        "permalink": "https:\/\/cirno.me\/attachment\/77\/"
    }
]

这里答案就很显而易见了,尽管我们设置了附件远程储存(比如腾讯云cos),这里的getimgsize()的参数依旧是老typecho的上传路径,这也说明了为啥只有上传图片会报错,因为非图片文件就不会调用这个方法。所以初步判断,应该是一个插件未做此类适配导致的。找了找,果然在网站自带的Void插件中发现了问题:

void code
void code

里面方法调用的路径一直是Typecho的根目录开头,解决办法也很简单,把__TYPECHO_ROOT_DIR__改成你远程图片的根目录就行了