Discuz! X3.2 实现全站 HTTPS 终极教程

Discuz! X3.2 本身对HTTPS的支持很有限,程序本身支持,但还有很多地方需要调整和修改的。
真正的全站HTTPS就是:
1)站点全部链接默认HTTPS,无任何HTTP链接通过301跳转到HTTPS。

2)浏览器显示绿色安全标志,无?#23433;?#23433;全内容”提示。




具体来说,我们需要从以下6个方面来实现我们最终的效果。
 
一、服务器前端程序的配置
一般来说,大家多使用Nginx作为前端程序,关于Nginx开启HTTPS的教程,网上有很多,你可以参考这篇文章:https://aotu.io/notes/2016/08/16/nginx-https/。
这是本论坛的Nginx配置文件,Nginx版本为1.8.0。
server
{
        listen 80;
        server_name www.repaik.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /data/web/www.repaik.com;
        return 301 https://$server_name$request_uri;
        #HSTS
    }
server
    {
        listen 443 ssl;  
        #listen [::]:80;
        server_name www.repaik.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /data/web/www.repaik.com;
        #SSL Start
        ssl_certificate /root/ssl.crt;    
        ssl_certificate_key /root/ssl.key;  
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        #SSL End
        include discuzx.conf;
        #error_page   404   /404.html;
        location ~ [^/]\.php(/|$)
        {
            # comment try_files $uri =404; to enable pathinfo
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
             fastcgi_param HTTPS $https if_not_empty;
            fastcgi_index index.php;
            include fastcgi.conf;
            #include pathinfo.conf;
        }
 
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }
 
        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }
 
        access_log off;
    }
 
二、Discuz判断服务器是否使用SSL的修补和完善
Discuz判断服务器是否使用SSL的代码不适合Nginx+CGI的情况,即PHP-FPM。这个时候我们需要修改以下文件:
Discuz采用 $_SERVER[‘HTTPS’] 的方式来判断SSL,但是因为我的VPS架构问题(nginx+php-fpm),无法采用这种方式识别,所以需要对Discuz程序进行一些调整(使用 $_SERVER[‘SERVER_PORT’] 来判断)。
 
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;
 
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
 
三、除去非HTTPS内容避免提示”不安全内容“
Source/plugin/manyou/Service/DiscuzTips.php ,最后的那段JS加载脚本删除就?#23567;?
非楼主层如果有点评,那么点评者头像不是HTTPS开头,也需要修改一个文件来适配:template/default/forum/viewthread_node_body.htm(约180行),搜索div class="psta vm">,将下面一行注释掉或者删除。
打开浏览器,使用开发者工具或者查看源码逐一排查加载的非HTTPS资源并修改。
 
四、后台设置的修改完善
在后台还有一些设置,可能会干扰https的使用
后台 >全局 > 站点URL,改为https开头的
后台 > 站长 > UCenter设置 > UCenter 访?#23454;?#22336;,修改为https开头的
UCenter后台 > 应用管理 > 应用的主URL,修改为https开头。修改后可能会显?#23601;?#35759;失败,如果UC和论坛程序安装在同一机器,此失败可无视,实测可以和UC正常通讯不影响(测试是否正常通讯程序的Bug),如果UC和论坛程序不在一台机器上,有可能不能通讯。
另外在 后台 > 全局 > 域名设置 中的一些设置?#37096;?#33021;使https失效,如果更新缓存后论坛默认连接还是HTTP,请删除 后台 > 全局 > 域名设置 > 应用域名 > 默认 里面的默认域名(一般去forum.php尾巴这里会有内容,为了HTTPS请删除)。
 
五、模板的调整
主要在模板的foot.html以及header.html等文件中,使用工具逐一排查模板文件?#34892;此?#30340;HTTP链接,修改为HTTPS。
 
六、数据库的调整
在论坛这种交互社区中,经常回复发帖时会有出现主域名的链接,在没有HTTPS之前,链接都是HTTP开头,这个时候,我们需要修改数据库,运行下面的mysql命令更新数据库,将HTTP替换为HTTPS:
进入DZ后台:站长 – 数据库 – 升级
UPDATE pre_forum_post SET message=REPLACE(message,'http://www.nisvie.tw','http://www.nisvie.tw');
#请将www.nisvie.tw替换为?#32422;?#30340;域名
 
需要注意的是,出于安全考虑,Discuz后台默认情况下禁止 SQL 语句直接执行,只能使用常用 SQL 当中的内容,如果想?#32422;?#38543;意书写SQL升级语句,需要将程序文件config/config_global.php当中的$_config[admincp][runquery] 设置修改为1。
 
PS:发帖时,百度联盟已经支持HTTPS加载。所?#38405;?#20123;担心开启HTTPS没法赚广告费的同学可以?#21028;?#20102;。


本博客所有文章如无特别注明均为原创——作者:小和 复制或转载请以超链接形式注明转自 小和博客
原文地址《Discuz! X3.2 实现全站 HTTPS 终极教程
分享到:更多

相关推荐

网友评论(0)