把 Blog 都換成 HTTPS 連線

今天搜到了這篇教學:「在 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,或許是為了解決這個問題的,但我沒試,效果怎樣就不知了。