近日,本站所使用的主题中许多图片资源都失效了——或者说,除了保存在本站内的图片资源都失效了。由于此问题在去年也出现过,很容易就知道是cdn又出了问题。但这次失效持续的时间有些太长,这使得我决定更换cdn。选择一家cdn服务是一个较麻烦的事,而当前已失效的cdn似乎是比较出名、效果最好的一个。那就没办法了,反正本站的资源也不多,于是就干脆把这些外链的资源也保存在本站上吧。

首先,我们要找到这些外链资源在哪。本站之前使用的cdn服务是jsdelivr提供的,他们提供的链接格式如下:

https://cdn.jsdelivr.net/gh/user/repo@version/file

也就是说,资源是存放在GitHub上的公开仓库中。本站使用的是:

https://cdn.jsdelivr.net/gh/Fuukei/Public_repository@latest/vision/some_directory/*.*

也就是Fuukei大佬名下的公开仓库中的资源(在此再次向开发这款Sakurairo主题的大佬们致谢)。因此,将该仓库中的vision文件夹下载下来,并上传到服务器的 /home/wwwroot/default 文件夹中(老实说这一步我有些怀疑会不会存在一些版权问题,虽然该主题按GPL 2.0协议共享,但似乎关于这一点没有明确说明。因此如果不行的话就只能再想办法了)。然后,我们在主题设置里(感谢作者在主题设置里提供了修改资源链接的选项,就不用去翻代码一点点找了)将所有由jsdelivr提供的cdn更换为:

https://www.gravertino.xyz/vision/some_directory/*.*

这样,该主题中的绝大部分资源的可访问性就恢复了。为什么要说绝大部分呢?因为首页的数个图标依然不能正常显示。按F12进入浏览器控制台查看错误信息,显示404,即找不到该资源。这就很奇特了。查看该资源的域名,是

https://s.nmxc.ltd/sakurairo_vision/@2.5//*.*

看上去也是一个cdn的链接。在Fuukei大佬的仓库中,同样找到了一个名为sakurairo_vision的仓库。此时我就想之前一样,干脆保存到本地好了。但在iro设置里,我发现资源路径是

https://s.nmxc.ltd/sakurairo_vision/@2.5/

而sakurairo_vision的仓库中还有多级子目录。因此,如果我直接把资源路径替换为服务器上的路径,此时访问资源依然会404,因为资源链接会成为:

https://www.gravertino.xyz/sakurairo_vision/*.*

当然,我也可以直接找到首页失效资源所在的子目录,然后放进设置里的路径中去。但这样显然会影响其他不在该目录中的资源。说来也奇怪,本站中还有许多来自sakurairo_vision的资源,为什么其他资源没有失效呢?此时我注意到那个资源链接中奇怪的双斜杠,这使我意识到,应该是主题的代码出了问题,使得某级子目录没有被正确的填入链接中。

那么,打开主题的代码文件,尝试找到bug并修复。老实说我根本不懂php,因此也只能瞎猫撞死耗子。幸运的是真让我撞上了。在layout文件夹中的all_opt.php文件中,有这么一行代码:

$social_display_icon = iro_opt('vision_resource_basepath').iro_opt('social_display_icon').'/';

感谢大佬们的命名如此的清晰易懂,看上去这个 vision_resouce_bashpath 应当就是在设置中填入的目录。而不知是何原因,后面的函数 iro_opt('social_display_icon') 返回了空值,使得出现了那个诡异的双斜杠。因此我本着大力出奇迹的精神,将其修改为:

$social_display_icon = iro_opt('vision_resource_basepath').'display_icon/sakura/';

这样,首页的数个资源就能正常加载了,除了仅剩的一个电子邮件的图片资源还是404状态。经过一番查找,在layout文件夹下的imgbox.php找到了负责生成电子邮件图片资源链接的代码:

if (iro_opt('email_name') && iro_opt('email_domain')):?>
        <li><a onclick="mail_me()" class="social-wangyiyun" title="E-mail"><img loading="lazy"
        alt="E-mail"
                    src="<?=iro_opt('vision_resource_basepath')?><?=iro_opt('social_display_icon')?>/mail.png" /></a></li>
    <?php
    endif;

那么,很显然,也是同样的问题。因此我将倒数第三行代码修改为:

src="<?=iro_opt('vision_resource_basepath')?>display_icon/sakura/mail.png" /></a></li>

自此,一切正常。

当然,这里的这种修复方法只是权宜之计,如果作者那边修改了资源文件的目录,或者主题更新,那么这些资源又将失效。真正的修正应该是找出为什么 iro_opt() 在输入 'social_display_icon' 时会返回空值。不过,这就不是我一个根本不懂php的人能搞定的了。说不定下个版本作者就修复了呢(笑。