当前位置

Drupal网站改http为https访问

James Qi 在 2016年11月29日 - 13:47 提交
内容摘要:前面写了两篇SSL认证方面的博文:《申请免费的SSL证书,开通https网站》、《https多网站1个IP多个SSL证书的Apache设置办法》,看上去也不是那么复杂,但实际在做http到https站......

  前面写了两篇SSL认证方面的博文:《申请免费的SSL证书,开通https网站》、《https多网站1个IP多个SSL证书的Apache设置办法》,看上去也不是那么复杂,但实际在做http到https站点迁移的过程中还是有一些细节需要注意,这里把Drupal网站中遇到的一些问题记录下来。

  • 官方文档:Enabling HTTP Secure (HTTPS)
  • Settings:Drupal 7中如果支持混合HTTPS和HTTP sessions,需要设置settings.php,添加$conf['https'] = TRUE;,但Drupal官方推荐将所有http重定向到https,纯粹的https网站就无需设置$conf['https'];
  • 内部链接:Drupal本身有很多地方都是调用的内部链接,例如站点本身的css/js,以及模板中用l函数做的链接,但还是会有部分地方用的完整http链接,例如本博客中用CKEditor做的文章之间的链接,又如CKEditor插入的Smiley表情图片smiley,如果不是太多就逐个页面找到、修改为内部链接吧,如果数量太多,可以在数据库中用SQL语句查询、替换,或者编写一个PHP程序来遍历、修改;
  • 外部图片、外部JS:这些嵌入的部分如果是http的都不被允许,浏览器要么提示网页部分不安全,要不就根本不显示,需要改为https的或者内部网址,百度分享代码的修改办法请看网页做的baiduShare,还有一些需要改动的:QQ客服代码;
  • 模块、模板修改:要检查一下自定义模块以及修改过的模板如html.tpl.php等,如果有些php程序以前只考虑到http而在https下会出错的话,就需要修改适应两种情况,例如以前判断http://是固定的7个字符,所以在程序中写了7这个数字,而https://却变为8个字符,按照以前的程序就会出错
      //$domain=substr($base_url,7);
      $domain = strtok($base_url,'//');
      $domain = strtok('/');
    ;如果使用了DrupalGap模块,需要修改drupalsite/mobile-application/app/settings.js中的Drupal.settings.site_path设置,http://改为https://或者//,否则浏览器判断有Mixed Content而不能正常运行;
  • Cron运行:如果关闭了网站菜单中的Cron设置,而是改用/etc/crontab中用wget运行的话,在证书首要域名不是当前网址域名的情况下就会报错(ERROR: certificate common name "chahaoba.cn" doesn't match requested host name "chahaoba.com". To connect to chahaoba.com insecurely, use '--no-check-certificate'.),需要在命令行中加入--no-check-certificate参数,http建议改为https,留着http也会自动跳转到https,但那个参数还是需要的;补充找到一个更好的办法:yum update wget升级wget就可以;
  • 重定向:推荐将所有http重定向到https,在.htaccess中设置两行
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
  • 机器人协定:修改robots.txt(或者我们设置的robots.php),sitemap的http改为https;
  • 网站地图:修改sitemap模块设置,将baseURL改用https协议,重新生成全部网站地图;
  • 外部接口:如果微信公众号开发的时候调用网址写的http,也需要在微信公众号管理后台改为https才行,同样还有QQ账号登录、微博账号登录等;
  • 测试工具:Qualys SSL Labs
  • 提交搜索:到Google Webmaster Tools、百度站长平台等地方去提交新的https的URL、网站地图等,等过几个月http访问全部指向https没有问题后,可以删除以前提交过的http站点。

  后面发现其它问题我再继续补充本文。


  补充两个判断http还是https的PHP函数,可以放在自定义模块中,或者放在某个PHP页面中:

function is_ssl() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

function http_https() {
    $request_protocol = is_ssl() ? 'https' : 'http';
    return $request_protocol;
}

  is_ssl()返回是否为SSL访问,http_https()返回“http”或者“https”。


  补充修改xmlsitemap.pages.inc中的代码,这是以前修改过的地方,再改部分片段:

......
      } elseif (substr($line_input,0,10) == '<url><loc>') {
        if (is_ssl()) {
                $line_input = str_replace('http://','https://',$line_input);
        } else {
                $line_input = str_replace('https://','http://',$line_input);
        }
......
      } elseif(substr($line_input,0,14) == '<sitemap><loc>') {
        if (is_ssl()) {
                $line_output = str_replace('http://','https://',$line_input);
        } else {
                $line_output = str_replace('https://','http://',$line_input);
        }
      } else {
        $line_output = $line_input;
      }
......

  这样可以兼容各种情况。


  再补充纯中文网站的修改xmlsitemap.pages.inc的办法:

......
  if ($scheme && file_stream_wrapper_valid_scheme($scheme) && $fd = fopen($uri, 'rb')) {
    while (!feof($fd)) {
      // james qi 2017-1-21 //print fread($fd, 1024*16);
      // modify start
      $line_input = fgets($fd);
      if (substr($line_input,0,10) == '<url><loc>') {
        $line_output = str_replace('http://','https://',$line_input);
      } elseif (substr($line_input,0,14) == '<sitemap><loc>') {
        $line_output = str_replace('http://','https://',$line_input);
      } else {
        $line_output = $line_input;
      }
      print $line_output;
      // modify end
    }
    fclose($fd);
  }
......

 

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
验证码
本问题用于测试您是否为人类访问者,避免自动垃圾发贴。
图形验证
键入显示在图片中的字符