2025年3月27日更新
好不容易搞定了,结果手欠又去改设置,问题再一次出现。
缓存的作用肯定有,所以匿名用户基本都是可以正常显示,而已登录用户使用的不是缓存,就会出现“创建缩略图出错:文件丢失”错误。
尝试新建条目并上传文件也是一样出错,这下缓存也是新的,匿名和已登录用户一样无法显示了。
把MediaWiki的设置和AWS设置又试了一遍,都没用。原图是可以上传到到OSS上的,但就是无法创建缩略图。
最后发现是因为防盗链功能导致的,关掉就好了。昨天测试完之后今天又开启了,结果……
如果非要开防盗链,那么记得将空 Referer设为允许,我就是吃了这个亏。
今天在修改某个条目时发现,信息框中的图片消失不见了,提示“创建缩略图出错:文件丢失”错误。而如果使用匿名账户浏览同一个页面却是正常的。

匿名用户默认使用的是 Timeless 主题,而登录用户使用的是 Vector 2022 主题。尝试将登录用户的默认主题改成 Timeless,还是一样报错。
从页面的源代码来看,缩略图是存在的。而且登录用户点击错误处的链接,是可以正常显示图片,也能够在媒体查看器中正常查看图片的。甚至通过 cargo 查询也能正常显示缩略图。
右下角最后一张就是通过 cargo 查询生成的缩略图。
为什么会出现这种现象呢?根据两天来的排查,大概的原因如下:
一、$wgGenerateThumbnailOnParse设置问题
在很多文档或者网友们的设置中都能看到将$wgGenerateThumbnailOnParse设置为 false 的情况,然后我就盲目跟风,在配置文件中增加了如下代码:
$wgGenerateThumbnailOnParse = false;
网上对此设置有一个解答:
如果$wgGenerateThumbnailOnParse为false,则删除缩略图无伤大雅;需要时会重新生成缩略图。如果为真,则只有在解析页面时才会生成缩略图;如果删除缩略图,则最终会出现损坏的图像链接。
所以当解析页面时生成无法生成缩略图或者找不到原本的缩略图,那么就会出现错误。
二、OSS的权限问题
由于网站已经运行了很久才开始使用 OSS 功能,所以文件传输过程中是否发生过遗漏已经无从查起了。并且刚开始 Bucket 被我设置为了公共读写,那么即便是匿名用户其实都可以进行读写,用不用 RAM 规则都无所谓。而在将 OSS 设置为私有之后,情况就不一样了,一旦某个设置出错就会导致文件无法读写,尤其是写操作。
其中 OSS 设置方面可能涉及读写权限、Bucket 授权策略、访问控制 RAM、防盗链、跨域设置、镜像回源、域名管理等几个方面,还会涉及到 CDN 的配合,但凡其中某一项出状况都可能会影响使用。
RAM 则可能是因为 AccessKey 有网络访问限制。
上图是阿里云工单工程师发给我的,在我重新创建了一个新的 AccessKey 后出现了无法写入的情况。
如果是设置问题,可以查看日志,然后找阿里云的工程师解答。
三、opcache缓存机制作祟
这个坑之大,以至于我整整花了两天时间没找到问题出在哪里。为什么?因为每次我修改配置之后,系统使用的还是缓存内容,只要缓存不更新就不可能有任何改变。
直到我关闭AWS扩展之后,它还是在报Error: Could not write file "mwstore://AmazonS3/local-public/x/x/xxxxxx.jpg"的错误或者在可视化浏览器中显示internal api error Aws\S3\Exception\S3Exception错误。
刚开始我还以为它跟 BookStack 一样,要在数据库里手动修改路径,结果无论用 AmazonS3 还是 CDN 域名或者是 OSS 域名都没有任何记录。然后我才意识到问题可能出在缓存,并且时间上也对应得上。因为最近正好在研究 MediaWiki 的缓存设置(详见《MediaWiki的缓存配置》一文),并且我将缓存更新时间改为了 0,也就意味着一直不会有更新。
; 多长时间(以秒为单位)后重新检查是否需要更新缓存中的文件(生产环境强烈建议设为0)
opcache.revalidate_freq = 0
之所以匿名用户和登录用户在同一个页面上出现上述两种不同的情况,应该也是缓存的原因(不过有可能是文件缓存而非 opcache 缓存,同样见《MediaWiki的缓存配置》一文)。
问题解决
第一步当然是关闭 opcache 缓存功能,然后再将 $wgGenerateThumbnailOnParse 设置为 true 或者干脆删除该行代码。提示“创建缩略图出错:文件丢失”的错误消失,之前缺少的缩略图都重新生成成功。
之前好多次都吃亏吃在浏览器缓存上,这次直接就倒在了服务器缓存上,看来真要时时刻刻留心缓存对调试的影响。