踩坑
背景
最近突然发现自己的网盘首页上不去了,然而其他页面却能打开,唯独首页不行,怪异。
出现问题前后没动过源码,onedrive 账号当然也没有问题,查了 api 手册貌似也没有变动,重启服务器也是一样的情况,怎么回事呢。
发现主机服务商帮我自动升级了 PHP 版本,猜想应该是由于版本升级带来的兼容性问题。
问题描述
无法打开 OneIndex 的首页(根目录),但其他页面可以正常访问,尝试过重启甚至重装都是一样的情况。
这里我的 OneIndex 是自己以及别的大佬魔改后的 OneIndexN,但从代码上分析,应该所有的未经修复的 OneIndex 版本都会出现该问题。
解决方法
修改 /lib/onedrive.php
的 urlencode
方法:
static function urlencode($path){
if($path == '/') return ""; // 在最开始加入这一行
foreach(explode('/', $path) as $k=>$v){
if(empty(!$v)){
$paths[] = rawurlencode($v);
}
}
return @join('/',$paths);
}
以 GitHub - xieqifei/OneindexN 为例,这一行代码应被加在此处。
问题应当被成功解决,现在应该可以正常访问首页(根目录)了。
分析原因
经过排查,应该是由于 PHP 版本升级(我这里是被升级到了 8.2),/lib/onedrive.php
中的 urlencode
方法出现了问题。
这个方法的作用应该是将 $path
分割后重新拼接,但对于根目录的情况,由于上下文传入的 $path
仅为一个斜杠 '/'
,处理的过程中出于某种原因而没有起到作用,最终使得 $path
不合法。导致在后续发起请求时传入错误的参数,从而出现异常。因而解决方法就是在开头进行特判。
没有仔细分析,推测是其中的某一行代码所调用的字符串处理方法在新版本中有不同的实现。
当然,其实也有可能是 onedrive 的 api 原本支持上述错误,而后 api 更新时不再支持,这样也会出现此问题,但我认为更可能为前一种情况。
附录
参考文献
版权信息
本文原载于reincarnatey.net,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。