V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
roustar31
V2EX  ›  SSL

分享下 Discuz! X3.2 启用 SSL 的过程

  •  
  •   roustar31 · 2016-11-02 20:04:42 +08:00 · 7764 次点击
    这是一个创建于 2943 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Discuz! X3.2 本身对 HTTPS 的支持很有限,程序本身支持,但还有很多地方需要调整和修改的。
    站点全部链接默认 HTTPS ,无任何 HTTP 链接通过 301 跳转到 HTTPS 。 浏览器显示绿色安全标志,无“不安全内容”提示。
    HTTPS SSL
    具体来说,我们需要从以下 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 加载脚本删除就行。
    非楼主层如果有点评,那么点评者头像不是 HTTPS 开头,也需要修改一个文件来适配: template/default/forum/viewthread_node_body.htm (约 180 行),搜索 div class="psta vm">,将下面一行注释掉或者删除。
    打开浏览器,使用开发者工具或者查看源码逐一排查加载的非 HTTPS 资源并修改。

    后台设置的修改完善
    在后台还有一些设置,可能会干扰 https 的使用
    后台 >全局 > 站点 URL ,改为 https 开头的
    后台 > 站长 > UCenter 设置 > UCenter 访问地址,修改为 https 开头的
    UCenter 后台 > 应用管理 > 应用的主 URL ,修改为 https 开头。修改后可能会显示通讯失败,如果 UC 和论坛程序安装在同一机器,此失败可无视,实测可以和 UC 正常通讯不影响(测试是否正常通讯程序的 Bug ),如果 UC 和论坛程序不在一台机器上,有可能不能通讯。 另外在 后台 > 全局 > 域名设置 中的一些设置也可能使 https 失效,如果更新缓存后论坛默认连接还是 HTTP ,请删除 后台 > 全局 > 域名设置 > 应用域名 > 默认 里面的默认域名(一般去 forum.php 尾巴这里会有内容,为了 HTTPS 请删除)。

    模板的调整
    主要在模板的 foot.html 以及 header.html 等文件中,使用工具逐一排查模板文件中写死的 HTTP 链接,修改为 HTTPS 。

    数据库的调整
    在论坛这种交互社区中,经常回复发帖时会有出现主域名的链接,在没有 HTTPS 之前,链接都是 HTTP 开头,这个时候,我们需要修改数据库,运行下面的 mysql 命令更新数据库,将 HTTP 替换为 HTTPS :
    进入 DZ 后台:站长 – 数据库 – 升级

    UPDATE pre_forum_post SET message=REPLACE(message,'http://www.repaik.com','https://www.repaik.com');
    请将 www.repaik.com 替换为自己的域名

    需要注意的是,出于安全考虑, Discuz 后台默认情况下禁止 SQL 语句直接执行,只能使用常用 SQL 当中的内容,如果想自己随意书写 SQL 升级语句,需要将程序文件 config/config_global.php 当中的$_config[admincp][runquery] 设置修改为 1 。

    PS :百度联盟已经支持 HTTPS 加载。所以哪些担心开启 HTTPS 没法赚广告费的同学可以放心了。

    这是我博客更换证书的一篇文章,点击可以送个 IP 。

    6 条回复    2017-10-30 02:11:35 +08:00
    jdle
        1
    jdle  
       2016-11-06 07:56:27 +08:00
    你这样伪静态不失效?
    roustar31
        2
    roustar31  
    OP
       2016-11-07 08:23:46 +08:00
    @jdle 这个和伪静态有什么关系?不影响伪静态
    ladyv2
        3
    ladyv2  
       2017-01-06 19:33:19 +08:00
    这样修改不行的, UC 通讯会失败。用户更换头像什么的都会出问题
    roustar31
        4
    roustar31  
    OP
       2017-03-26 14:24:17 +08:00
    @ladyv2 我站都开 HTTPS 大半年了,毫无问题。。。
    lofky7
        5
    lofky7  
       2017-06-23 15:31:32 +08:00
    你好,
    问一下,论坛按照你的教程开启了全站 https

    但是为什么论坛的板块地址还是 http 的,并没有自动转换成 https

    https://bbs.liuxuesheng8.com/
    tinglai
        6
    tinglai  
       2017-10-30 02:11:35 +08:00
    关联链接不支持 SSL,要在哪改,填写了 https 的网址会变成 http://https//www 这样的链接
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2437 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:02 · PVG 00:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.