最近部署了几个discuz的https,有新站也有旧站。挺多坑的,在这里总结整理下。
首先是无论新站、老站都要做的:
一、部署https证书(这个不说了,有兴趣搜一下我之前写的文章,有问题留言)
二、Discuz程序支持
其实 Discuz! X3 开始,已经加入了对https的支持,如果你使用https访问论坛,论坛中的链接都会变成https。如果你发现大部分链接都已经使用了https,就代表Discuz已经自动识别了,此时,可以跳过本步,直接进入下一步。
Discuz采用 $_SERVER[‘HTTPS’] 的方式来判断SSL,但是使用nginx无法采用这种方式识别,所以需要对Discuz程序进行一些调整(使用 $_SERVER[‘SERVER_PORT’] 来判断)。
1、打开source/class/discuz/discuz_application.php(约第187行处):
$_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
修改为:
$_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
2、打开uc_server/avatar.php(约第13行处):
define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
修改为:
define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
3、后台设置
在后台还有一些设置,可能会干扰https的使用
a. 后台 > 站长 > UCenter设置 > UCenter 访问地址,修改为https开头的
b. UCenter后台 > 应用管理 > 应用的主URL,修改为https开头
另外在 后台 > 全局 > 域名设置 中的一些设置也可能使https失效,如果进行了之前的几步还是无法启用,可以暂时删除这里的设置试试。
c.清理缓存,设置完成之后,需要清理缓存,使设置生效。
这些完成之后,如果是新站的话,应该进入全https模式了。如果是旧站,可能还有一些问题,需要根据具体情况,以下是我碰到的问题。
1. {STYLEIMGDIR}和部分style图片调用链接依旧是http
打开 source/function/cache/cache_styles.php ,查找以下三项:
$cssdata = !preg_match('/^http:\/\//i', $data['styleimgdir']) $cssdata = !preg_match('/^http:\/\//i', $data['imgdir']) $cssdata = !preg_match('/^http:\/\//i', $data['staticurl'])
将其中的 /^http:\/\//i 替换为 /^http/i ,保存覆盖。
2. 管理员登陆出现DiscuzTips的问题
这个可以直接去模板的foot删除,也可以打开 source/plugin/manyou/Service/DiscuzTips.php ,在 echo $jsCode; 前加 // 将其注释掉。
3. 开启https后ucenter通信失败
打开目录 uc_server/model/misc.php 文件;
找到69行(如下图),插入下面代码:
if (substr($url, 0, 5) == 'https') { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($post) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } if ($cookie) { curl_setopt($ch, CURLOPT_COOKIE, $cookie); } curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); return curl_exec($ch); }
如果有新的问题会继续更新,欢迎留言提问