今天搜到了這篇教學:「在 WordPress 設定 HTTPS,強制使用 SSL 安全加密協定教學」,也來著手把自己和 pupudog 的 blog 都改成 https 連線,但步驟和文中的有些不同,做個記錄。
CloudFlare 提供了免費的 SSL 服務
很久之前就已經開始用 CloudFlare 的 DNS 和 CDN 服務了,去年 9 月他們開始提供 Universal SSL 時,我只把後台的 wp-admin 改成強制用 https,也就是在 wp-config.php
中加入:
define('FORCE_SSL_ADMIN', true);
CloudFlare 的 HTTPS 設定有幾個不同的 level:
- Flexible
- Full
- Strict
Flexible 是個有點特殊的狀況,訪客和 CloudFlare 間是加密連線,但 CloudFlare 和自己的 server 間是非加密連線;再進階一點的 Full 是兩個連線都是加密連線,但從 CloudFlare 到自己的 server 間不要求一定是正式的 SSL certificate;而 Strict 就是兩個連線都是正式的 SSL certificate。(官方說明)
如果自己的機器沒辦法開 HTTPS 的話,用 Flexible 方案也不錯,而對我們這種沒錢去買 SSL certificate 的,也可以用 Full mode 這種佛心的方案。
根據這篇教學:「在 WordPress 設定 HTTPS,強制使用 SSL 安全加密協定教學」的方法設定,我會用到的幾個步驟是:
將文章內容中圖片的 url 改成相對連結
以前習慣的連結是 http://
或 https://
開頭,一定會使用給定的 protocol 連線,相對連結即是只以 //
開頭,會根據當下網頁用的 protocol 來連線。
這是個全面性修改的大工程,而且有可能會造成 database 損毀,請小心。
進入 mysql 的 interface, 使用下面的 query 做替換。
UPDATE wp_posts SET post_content = ( Replace (post_content, 'src="http://', 'src="//') ) WHERE Instr(post_content, 'jpeg') > 0 OR Instr(post_content, 'jpg') > 0 OR Instr(post_content, 'gif') > 0 OR Instr(post_content, 'png') > 0;
為了 cover 到用單引號的連結(正常的狀況應該相當少),可再加做:
UPDATE wp_posts SET post_content = ( Replace (post_content, "src='http://", "src='//") ) WHERE Instr(post_content, 'jpeg') > 0 OR Instr(post_content, 'jpg') > 0 OR Instr(post_content, 'gif') > 0 OR Instr(post_content, 'png') > 0;
透過 mod_rewrite 將 http 連線導向 https
在 .htaccess
檔案中加入:
# Force HTTPS RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
更新 WordPress 網站的設定
在「設定」>「一般」內更新 WordPress 位址以及網站位址,改成 https://
開頭。
這種強制 redirect 配上 Flexible 模式會造成重新導向迴圈
此時如果自己的機器上有開 HTTPS,而且搭配 Flexible 方案的話,會遇到「這個網頁含有重新導向迴圈」(ERR_TOO_MANY_REDIRECTS
) 的問題,這也不意外,照理說在 Flexible mode 下,CloudFlare 和你的 server 間本來應該是非加密連線的,因此,如果自己的機器上有開 https,又做了強制 redirect,在 CloudFlare 應該設為 Full 模式才對。
BTW, 有個 wordpress plugin: CloudFlare Flexible SSL,或許是為了解決這個問題的,但我沒試,效果怎樣就不知了。