前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkPHP5 PC微信浏览器下突然无法访问

ThinkPHP5 PC微信浏览器下突然无法访问

作者头像
jwj
发布2023-12-16 09:39:44
1300
发布2023-12-16 09:39:44
举报

最近接到反馈,说网站无法在电脑微信上打开,提示 页面错误!请稍后再试~,开启调试模式后发现报 Undefined offset: 1 in Lang.php line 204

问题定位

经过排查,应该是微信浏览器近期进行了更新,给服务器传递了 Accept-Language: *。 然后框架的多语言自动侦测逻辑不严谨,导致了此次错误。

出错文件:library/think/Lang.php 出错代码:

代码语言:javascript
复制
        if (isset($_GET[self::$langDetectVar])) {
            // url 中设置了语言变量
            $langSet = strtolower($_GET[self::$langDetectVar]);
        } elseif (isset($_COOKIE[self::$langCookieVar])) {
            // Cookie 中设置了语言变量
            $langSet = strtolower($_COOKIE[self::$langCookieVar]);
        } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            // 自动侦测浏览器语言
            preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
            $langSet     = strtolower($matches[1]);
            $acceptLangs = Config::get('header_accept_lang');

            if (isset($acceptLangs[$langSet])) {
                $langSet = $acceptLangs[$langSet];
            } elseif (isset(self::$acceptLanguage[$langSet])) {
                $langSet = self::$acceptLanguage[$langSet];
            }
        }

关键定位:

代码语言:javascript
复制
// 自动侦测浏览器语言
preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
// 这里没有判断 preg_match 是否匹配到内容,直接就使用 $matches[1] ,然后就报错了
$langSet     = strtolower($matches[1]);

解决办法

解决办法很简单,先判断 preg_match,再执行后续代码。

调整后代码:

代码语言:javascript
复制
        if (isset($_GET[self::$langDetectVar])) {
            // url 中设置了语言变量
            $langSet = strtolower($_GET[self::$langDetectVar]);
        } elseif (isset($_COOKIE[self::$langCookieVar])) {
            // Cookie 中设置了语言变量
            $langSet = strtolower($_COOKIE[self::$langCookieVar]);
        } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches)) {
            // 自动侦测浏览器语言
            $langSet     = strtolower($matches[1]);
            $acceptLangs = Config::get('header_accept_lang');

            if (isset($acceptLangs[$langSet])) {
                $langSet = $acceptLangs[$langSet];
            } elseif (isset(self::$acceptLanguage[$langSet])) {
                $langSet = self::$acceptLanguage[$langSet];
            }
        }

影响版本

目前主要发现影响 ThinkPHP 5.0 和 5.1 版本,已向官方提交修复,但这两个版本已停止更新,不确定是否会合并。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题定位
    • 解决办法
      • 影响版本
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档