前面寫了兩篇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); } ......
评论