Typecho的Mirages主题中不能回复的解决方案

2022年04月19日

前几天,我将Typecho升级到了1.2.0,Mirages主题也是7.10.4最新版,在发表文章后我发现,博客的回复有问题,所有回复内容不能提交,点击了提交按钮没有反应,于是我就在线咨询了主题的作者,得到了问题原因和暂时的解决方法。

   和主题有关的问题是评论不成功时,失败的消息没有展示出来,但是你网站出错的原因是请求的时候 Referer 没有提交给服务器,老实说我不太清楚这个的原因,你可以先把Typecho 中, /var/Widget/FeedBack.php,87 – 111 行注释掉,暂时解决这个问题。

这个原因跟我之前的设置应该有关系,因为之前我在设置bilibili视频解析的时候,在head头部文件中加入了一行。

<meta name="referrer" content="no-referrer">

将这一行删除掉之后就可以解决不能回复的问题了,但是我还是需要使用bilibili视频的解析功能,所以我只能是参照主题作者给出的解决方法来处理。

if (empty($referer)) {
    throw new Exception(_t('评论来源页错误.'), 403);
}

$refererPart = parse_url($referer);
$currentPart = parse_url($this->content->permalink);

if (
    $refererPart['host'] != $currentPart['host'] ||
    0 !== strpos($refererPart['path'], $currentPart['path'])
) {
    //自定义首页支持
    if ('page:' . $this->content->cid == $this->options->frontPage) {
        $currentPart = parse_url(rtrim($this->options->siteUrl, '/') . '/');

        if (
            $refererPart['host'] != $currentPart['host'] ||
            0 !== strpos($refererPart['path'], $currentPart['path'])
        ) {
            throw new Exception(_t('评论来源页错误.'), 403);
        }
    } else {
        throw new Exception(_t('评论来源页错误.'), 403);
    }
}

按照主题作者的要求,把这个主题评论错误页的判断代码先注释掉,评论是没有错误提示和没有之前的没有反应的现像了,但是评论提交后,在后台审核页和文章页面都看不到该评论,如果将refrere那一行删除掉后,是可以评论了,但是评论后却有一个转圈的图标一直在转圈。

 

在/var/Widget/Security.php这个文件中,我们可以看到getReferer()这个函数,所以在回复的时候,Typecho应该是调取了系统浏览器的referrer来路,问题应该出在这里。

/**
 * 保护提交数据
 */
public function protect()
{
    if ($this->enabled && $this->request->get('_') != $this->getToken($this->request->getReferer())) {
        $this->response->goBack();
    }
}

1、我尝试过将上边那个源码中的getReferer()修改成getRequestUrl(),因为我看到某个博客上说过,在Typecho的反垃圾检测中,文章和页面调用的检测是不一样的,文章调用的是getReferer(),而页面调用的是getRequestUrl()这个,但是这么做仍然没有效果。

2、我尝试修改了/var/Widget/FeedBack.php文件中下面这段,但是也没有效果。我在 Feedback.php文件中看到有一个$referer变量是调用的getReferer()这个函数,因为我通过F12工具看过页面里的源码,发现在发送消息头的时候,会发送一个referer,显示的是当前的网址。

所以,我新建了一个自定义函数,是获取当前网页地址的,然后用来替换掉它的变量,但是同样没有效果。

/*
 * 这是新增的代码,替代 getReferer() 函数*/
public function typechon_get_referer()
{
    if (strpos($_SERVER["HTTP_HOST"], "www.python.hn.cn") !== false || strpos($_SERVER["HTTP_HOST"], "mangshe.python.hn.cn") !== false) {
        $tycode = $_SERVER["HTTP_HOST"];
    }
    return $tycode;
}
/** 检查来源 */
if ($this->options->commentsCheckReferer && 'false' != $this->parameter->checkReferer) {
    #$referer = $this->request->getReferer(); //这里改成
    $referer = typechon_get_referer();

 

解决方法:

1、因为Typecho的反垃圾回复的检测,所以我们需要关闭反垃圾检测功能和关闭检查评论来源页 URL 是否与文章链接一致。这两个功能。

2、官方给出的解决方法,将 <meta name=”referrer” content=”no-referrer”> 替换成 <meta name=”referrer” content=”same-origin”>

官方链接:https://github.com/typecho/typecho/issues/1414 https://forum.typecho.org/viewtopic.php?t=15595


sicnature ---------------------------------------------------------------------
Your current IP address is: 120.78.13.178
Your IP address location: 中国广东深圳 阿里云
Your IP address country and region: 中国 中国
Your current browser is:
Your current system is:
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source https://www.myzhenai.com.cn/post/4105.html

没有评论

发表评论

您的电子邮箱地址不会被公开。