把 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,或許是為了解決這個問題的,但我沒試,效果怎樣就不知了。


10 Comments

  • Lee Lin

    2015/08/08

    Dear,

    看了您的分享後,嘗試了wordpress的外掛,一試就成功全部變https了

    謝謝您

    Reply
    • tsaiid

      2015/08/08

      我沒試過那個 plugin, 但我覺得或許改用 Full mode CloudFlare SSL 來處理會更好一些

      Reply
  • Pingback: 改用 StartSSL 的 Class 1 免費憑證 | Tsai I-Ta's Blog

  • Yuyan Li

    2015/12/12

    請問MYSQL 那邊語法要寫在哪裡 (我是用GODADDY的CPANEL操作 )

    不好意思 我是新手..SOR

    Reply
    • tsaiid

      2015/12/12

      GoDaddy 我沒用過,要問他們才知道。

      Reply
      • Yuyan Li

        2015/12/13

        好的,謝謝

        Reply
  • Hi

    2016/02/12

    我想請問一下,如果要使用CloudFlare的CDN,又要使用自己申請的Let’s Encrypt憑證,有辦法嗎?
    因為我原本有申請Let’s Encrypt憑證,但發現啟用CloudFlare後,憑證就變成他們的了…

    Reply
    • tsaiid

      2016/02/12

      剛剛試了一下,的確沒辦法既用 LE 的憑證,又用 CloudFlare 的 CDN,不過,變成他們的又有什麼關係呢?

      Reply
      • Hi

        2016/02/12

        經過粗略的比較,似乎Let’s Encrypt比CloudFlare來的安全。參考工具https://ssl-tools.net

        Reply

Leave a Reply