今天搜到了這篇教學:「在 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,或許是為了解決這個問題的,但我沒試,效果怎樣就不知了。
Lee Lin
2015/08/08Dear,
看了您的分享後,嘗試了wordpress的外掛,一試就成功全部變https了
謝謝您
tsaiid
2015/08/08我沒試過那個 plugin, 但我覺得或許改用 Full mode CloudFlare SSL 來處理會更好一些
Pingback: 改用 StartSSL 的 Class 1 免費憑證 | Tsai I-Ta's Blog
Yuyan Li
2015/12/12請問MYSQL 那邊語法要寫在哪裡 (我是用GODADDY的CPANEL操作 )
不好意思 我是新手..SOR
tsaiid
2015/12/12GoDaddy 我沒用過,要問他們才知道。
Yuyan Li
2015/12/13好的,謝謝
Hi
2016/02/12我想請問一下,如果要使用CloudFlare的CDN,又要使用自己申請的Let’s Encrypt憑證,有辦法嗎?
因為我原本有申請Let’s Encrypt憑證,但發現啟用CloudFlare後,憑證就變成他們的了…
tsaiid
2016/02/12剛剛試了一下,的確沒辦法既用 LE 的憑證,又用 CloudFlare 的 CDN,不過,變成他們的又有什麼關係呢?
Hi
2016/02/12經過粗略的比較,似乎Let’s Encrypt比CloudFlare來的安全。參考工具https://ssl-tools.net
tsaiid
2016/02/12看起來是要加入他們的 Business or Enterprise plan 才可以吧!(see Certificate type section)