记录将梧桐树下DZX3.4论坛转为https访问的坑

在很早以前就打算升级梧桐树下为https访问,印象里去年折腾了一次服务器,增加了openssl的支持,已经忘记怎么弄的了。当时申请了证书,因为用了加速乐的原因,加速乐收费版才可以使用ssl,当时网站访问太慢,不加速不行,就放弃折腾了。如今申请熊掌号,以及防止流量劫持,为更好的排名,不得不又折腾。好在去年把程序升级到了DZX3.4了,网上都说3.4对https支持很好了。
1.阿里云申请ssl证书,用的是Symantec免费版 SSL
阿里云控制台-》安全-》ssl证书-》购买证书

(不容易点出来这个免费的,我还以为取消了,多切换几次就出来了)

2.申请审核通过后,在证书列表可以看到下载,使用的是apahce服务器,所以下载了apache的。按照要求放在apache安装目录下的cert文件夹

3.网站开启https访问
打开 apache 安装目录下 conf 目录中的 httpd.conf 文件,找到以下内容并去掉“#”:
#LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
#Include conf/extra/httpd-ssl.conf

然后坑1出现,重启apache报错,缺少东西,一查,还得开启一个mod_socache_shmcb.so
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

4.配置apache安装目录下conf中extra目录的 httpd-ssl.conf 文件,让https访问走这里,百度了几种写法,找到一个好用的,然后将论坛80端口的vhost配置和这个结合,再加上阿里云下载证书页面的第三点配置出以下配置,然后将httpd-ssl.conf其他Listen 443以下的内容删除掉。
Listen 443
SSLStrictSNIVHostCheck off
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3
<VirtualHost *:443>
#这里的路径设置你的网站根目录
DocumentRoot "/网站的路径"
#这里xxxxx.com替换成你的域名
ServerName www.wtsxia.com
#这里的路径设置你的网站根目录
<Directory "/网站的路径">
Options FollowSymLinks ExecCGI
AllowOverride none
Order allow,deny
Allow from all
Require all granted
</Directory>
SSLEngine on
#你的公钥文件
SSLCertificateFile cert/证书.pem
#你的私钥文件(有的机构命名为private或者以你的域名为文件名命名)
SSLCertificateKeyFile cert/证书.key
#证书链文件(有的机构命名为CA)
SSLCertificateChainFile cert/证书.pem
<IfModule mod_rewrite.c>
#论坛的伪静态
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page\%3D$4&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3&%1
RewriteCond %{HTTP_HOST} !(^www.wtsxia.com$) [NC]
RewriteCond %{REQUEST_URI} (^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$)|(^/forum-(\w+)-([0-9]+)\.html$)
RewriteRule ^(.*)$ http://^www.wtsxia.com/$1 [L,R=301]
</IfModule>
</VirtualHost>

重启apache,还好没报错。

5.https方式访问网站,看是否生效,出现坑2 ,被加速乐拒绝访问了。。原来用了加速乐的加速服务,如果要使用ssl服务,要在加速乐配置,但是加速乐免费版不支持配置,于是放弃了加速乐,解析转回阿里云。生效太慢,强制刷新dns都没用,这里也纠结了好久,为了保证还能正常访问,改解析改了好多次,后来直接本地host来测试了。成功访问https,但是显示很多不安全,地址栏也没有小绿锁。

6.修改论坛相关设置和代码,将http改为https访问,找了几个资料都不成功,后来找到一篇靠谱的,使用了如下内容修改。
Ⅰ.解决 DiscuzTips 造成的不安全资源提示。
打开 source/plugin/manyou/Service/DiscuzTips.php ,在 echo $jsCode; 前加 // 将其注释掉。

Ⅱ.http:// 跳转至 https://
打开 source/class/class_core.php 文件,在
set_exception_handler(array('core', 'handleException'));

后面加入:
if($_SERVER['SERVER_PORT'] != '443' && $_SERVER['PHP_SELF'] != '/api/uc.php') {
if(!preg_match("/(Zidingyi|Bot|Crawl|Spider|slurp|sohu-search|lycos|robozilla)/i", $_SERVER['HTTP_USER_AGENT'])) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
} elseif(preg_match("/(Baidu|Google)/i", $_SERVER['HTTP_USER_AGENT'])) {
header('HTTP/1.1 403 Forbidden');
exit;
}
}

说明:当访问端口不为443(即https)时,如果不是搜索引擎则跳转到https页面,否则如果是百度或Google蜘蛛(这两个搜索引擎已支持收录https)则返回403禁止访问,避免重复收录 http 和 https 或优先收录了 http ,其它搜索引擎未定义,正常返回 http 页面(其它搜索引擎可能不支持收录 https ,因此开放 http 给他们)。
以上代码中“Zidingyi”可以任意修改,管理员使用以下UA可以不跳转到https,便于对http版进行调测:
Mozilla/5.0 (compatible; Zidingyi/2015; +http://www.wtsxia.com)
Ⅲ.把代码中http的链接改为https的。
Ⅳ.解决UCENTER通信失败的问题:
DISCUZ 开启https后ucenter通信失败解决方法,一般是做完301重定向https后通信失败的,下面是具体解决方法:
打开目录 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);
}

7.再次访问,还是好多不是https的,发现坑3,附件和资源主要是放在七牛的,以前单独配置过,后台还需要做一些配置。
全局-》性能优化-》服务器优化-》JS和css文件url将http改为https

全局-》上传设置-》基本设置-》本地附件url地址 设置为https的(这里也被坑好久,网上没提这个的,都不记得这里也有个地址了)

站长-》UCenter 设置-》UCenter 访问地址 设置为https
UCenter-》应用管理-》编辑应用 设置为https,设置后如果通信失败,需要做第六步解决通信失败的代码修改,不解决的话普通登录和QQ登录会出问题。
8.然后还是样式加载不出来,js和css、图片请求全部报错,然后访问链接,原来qiniu域名显示不安全,还是谷歌浏览器好啊,点https前面的提示,发现坑4原来证书是给七牛的,申请的证书是单独域名的,又去阿里云申请了qiniu域名的证书,七牛提供证书上传服务。
七牛后台-》ssl证书服务 从阿里云下载的证书文件里复制内容粘贴,证书内容不知道是什么,复制了两次才是对的。

然后去对象存储开启域名的https访问


9.想着没问题了吧,一访问,样式中的很多图片还是http的,找代码啊,发现都用了一个IMGDIR的全局变量,但就是找不到哪里赋值的。。网上搜这个才搜到第六步说的文章。需要在后台设置,界面-》风格管理-》找到用的模板-》编辑-》将路径写死,写https的,然后刷新css缓存,各种缓存。

10.可是我的就是死活不变成https啊,根据第六步的文章,提到这里(输出css缓存文件)可能设置识别不到的bug,对比后,梧桐树下的版本bug已经是修复的,我还在输出css缓存的方法打了最后的值,都是https,实在想不通后面哪里又被替换了。不折腾了,可能电脑浏览器问题,缓存太严重吧,隔一天再弄,至少访问网站不会报不安全了。
11.终于再次折腾时,发现了坑5,想着是不是更新 缓存的代码有问题,然后去看缓存,是https的,然后想着看css链接的内容是不是不一致,当新窗口打开时,懵了。qiniu的链接。。。怎么忘记这文件是缓存在七牛了,赶紧看七牛,文件最后更新时间17年。。赶紧删了七牛的文件,终于刷新了缓存,https成功显示小绿锁,至于有些页面有外链我就没管了,有些帖子里写死的http地址,手动改了几个看到的。还有一个小插曲,发现首页logo加载两次,一个https一个http,后来突然想起底部的友情链接放了logo,后台写死的。。。
ps:期间改动不知原因导致几次不能正常访问http直接用备份还原了。。莫名的出错找不到原因真的头疼。。三四天的零碎时间终于是成功了。。搞不定就休息,指不定下一次就恍然大悟了呢、