解决方法:
编辑var/Typecho/Request.php,在isSecure方法中追加两个判断条件即可:

|| (!empty($_SERVER['HTTP_X_CLIENT_SCHEME']) && !strcasecmp('https', $_SERVER['HTTP_X_CLIENT_SCHEME']))
|| (!empty($_SERVER['REQUEST_SCHEME']) && !strcasecmp('https', $_SERVER['REQUEST_SCHEME']))

1.jpg


原因分析:

环境是阿里云CDN + 阿里云虚拟主机Nginx版,均开启了强制HTTPS,设置回源端口443,回源协议HTTPS。也有测试直接把域名解析到主机,问题仍然存在。

打开后台登陆页面会发现样式丢失,右击查看源代码发现加载样式的link标签与提交表单的form标签的地址都是http开头的,所以我猜测是Typecho没有检测到当前请求时HTTPS,所以输出了http链接导致浏览器不进行加载。而同样的配置在自己部署的宝塔面板上就不会出现这个问题。

经过一系列字符串搜索,找到判断是否为https的代码在var/Typecho/Request.phpisSecure方法中,主要是根据$_SERVER的内容判断的,于是我注释掉原先的代码,写上return true;保存测试,后台登陆节目生成的链接果然正常了。

定位了问题点就简单了,用print_r($_SERVER);exit();输出服务器接收到的内容,再对比这里的判断代码,SERVER_PORT被检测成了80,其他参数则是没有,难怪会检测错误。

SERVER.png

观察发现多出了REQUEST_SCHEMEHTTP_X_CLIENT_SCHEME,加上对这两项的检测就好了

标签: none

添加新评论