前面写了两篇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表情图片😄,如果不是太多就逐个页面找到、修改为内部链接吧,如果数量太多,可以在数据库中用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); } ......
评论