前几天,我将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 ---------------------------------------------------------------------
I P 地 址: 18.117.254.236
区 域 位 置: 美国马萨诸塞
系 统 信 息:
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普 | 海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
没有评论