實作:將 WordPress 由 Http 轉做 Https

今 年 ( 2018年 ),因 為 Google 霸 權 的 關 係 ,已 經 有 好 多 位 朋 友 需 要 把 自 己 的 Website 由 Http 轉 為 Https ( 都 是 搵 食 的 website,佢 地 唔 想 因 為 無 Https 而 排 名 下 滑 )。把 網 站 由 Http 轉 做 Https,簡 單 說 就 是 將 沒 有 加 密 的 連 線 變 為 有 加 密 的 連 線 ,這 可 以 大 大 減 少 給 別 人 網 路 截 聽 所 帶 來 的 保 安 風 險 。

為 什 麼 Https 在 以 前 不 流 行 呢 ?難 道 以 前 的 網 絡 罪 犯 比 較 少 麼 ?當 然 不 是 。以 前 不 流 行 的 原 因 ,是 因 為 Https 所 需 要 的 SSL certificate 十 分 昂 貴 ,動 不 動 要 幾 千 蚊 美 金 一 年 ( SSL Certificate 是 要 定 期 更 新 的 ,所 以 是 每 年 幾 千 蚊 美 金 )。但 幾 年 前 開 始 有 免 費 的 SSL certificate 服 務 ,更 可 以 全 自 動 更 新 ,設 定 一 次 就 可 以 一 勞 永 逸 ,所 以 近 幾 年 Https 就 開 始 越 來 越 流 行 。

要 將 一 個 網 站 由 Http 轉 為 Https,本 身 已 經 唔 係 易 事 。對 於 要 將 wordpress 由 Http 轉 做 Https,更 是 難 上 加 難 。今 次 我 就 用 misterngan.com 為 例 ,示 範 一 次 「不 完 美 」的 教 學 吧 。

首 先 要 說 明 一 下 ,轉 Https 是 為 了 搜 尋 器 的 排 名 ,但 我 個 人 認 為 ,搜 尋 器 排 名 並 不 是 網 上 搵 錢 的 全 部 。在 某 些 地 域 ,facebook like 和 facebook share 的 數 量 ,在 一 眾 網 民 心 目 中 依 然 佔 有 十 分 重 要 的 地 位 。

因 為 facebook 的 like 和 share是 根 據 完 整 網 址 來 統 計 的 ,所 以 「http://www.misterngan.com/」和 「https://www.misterngan.com/」對 facebook 來 說 是 兩 條 完 全 獨 立 的 不 同 網 址 ,所 以 之 前 多 年 由 http 儲 下 來 的 like 和 share,都 是 不 能 帶 到 新 的 https 的 網 址 的 。所 以 ,基 本 上 你 的 網 站 一 由 Http 轉 做 Https,所 有 like 和 share 都 會 由 零 開 始 。假 如 你 很 有 這 方 面 的 疑 慮 ,我 建 議 你 還 是 保 留 Http 的 舊 網 站 ,另 建 一 個 新 的 Https 網 站 比 較 好 ( 用 不 同 的 domain ),到 幾 年 後 新 網 站 漸 漸 取 代 了 舊 網 站 ,才 把 舊 網 站 直 接 砍 掉 。

用 同 一 個 domain 同 時 提 供 Http 和 Https 又 得 唔 得 呢 ?理 論 上 當 然 可 以 。以 Apache Web Server 為 例 ,預 設 Http 和 Https 的 存 取 位 置 本 來 就 是 分 開 的 ( 分 別 為 public_html 和 private_html )。你 完 全 可 以 為 Http 和 Https 提 供 兩 個 完 全 不 同 的 網 站 。但 事 實 上 甚 少 有 人 會 這 樣 做 ,我 想 主 要 原 因 是 管 理 上 十 分 麻 煩 吧 。例 如 你 要 更 改 網 站 ,每 個 更 改 都 要 做 兩 次 ,煩 死 人 吧 ?

好 了 ,廢 話 就 此 打 住 ,先 看 看 我 如 何 將 misterngan.com 由 Http 轉 做 Https 吧 。之 前 好 多 朋 友 都 同 我 講 ,容 乜 易 丫 ,裝 個 plug-in 就 得 啦 。我 正 正 就 想 同 大 家 講 ,第 一 ,plug-in 係 絕 對 可 以 唔 裝 既 ;同 第 二 ,plug-in 唔 係 萬 能 ,有 好 多 野 係 plug-in 做 唔 到 既 。所 以 ,我 這 個 教 學 係 唔 需 要 裝 任 何 額 外 的 wordpress plug-in 既 。

其 實 要 轉 Https,第 一 步 唔 係 搞 你 個 wordpress,而 係 要 搞 你 個 web server。在 設 定 好 web server 之 前 ,千 萬 千 萬 千 萬 別 動 你 的 wordpress site,任 何 plug-in 都 唔 好 裝 ,任 何 設 定 都 唔 好 改 !!!

以 misterngan.com 為 例 ,我 們 要 先 登 入 hosting 公 司 的 後 台 管 理 系 統 ( 通 常 係 cPanel 或 者 DirectAdmin )。先 找 到 有 關 SSL certificate 設 定 的 地 方 。

然 後 再 找 一 找 有 沒 有 支 援 的 免 費 SSL certificate 服 務 ,最 好 有 埋 自 動 更 新 的 。通 常 按 照 管 理 介 面 上 面 幾 個 簡 單 的 步 驟 ,就 可 以 完 成 設 定 ,係 無 乜 難 度 既 。

如 果 你 的 Server 不 支 援 免 費 的 SSL certificate,你 可 以 打 上 去 hotline 問 一 問 。今 時 今 日 在 香 港 ,大 部 分 hosting 公 司 都 有 支 援 免 費 的 SSL certificate 服 務 。如 果 你 問 清 楚 之 後 真 係 無 ,唔 駛 諗 ,計 劃 定 轉 hosting 公 司 啦 。

不 過 ,就 算 是 同 一 間 hosting 公 司 ,Server 也 有 新 有 舊 ,在 舊 Server 真 的 未 必 會 支 援 免 費 SSL certificate。這 是 因 為 在 共 用 server 的 環 境 更 新 有 機 會 影 響 到 其 他 舊 客 戶 ,所 以 hosting 公 司 真 的 未 必 會 更 新 。但 通 常 只 要 你 肯 問 ,hosting 公 司 都 會 建 議 把 你 的 website 搬 到 新 Server 的 ( 搬 新 server 通 常 都 免 費 ,但 網 站 程 式 兼 容 問 題 你 就 得 自 理 ,例 如 PHP 升 左 級 有 D 舊 function deprecated 影 響 到 你 個 網 站 運 作 ,hosting 公 司 係 唔 會 睬 你 既 )。

設 定 好 SSL certificate 都 仲 未 完 事 ,你 仲 要 去 設 定 好 web server 有 關 Https 的 部 分 。以 misterngan.com 為 例 ,就 在 domain settings 裡 面 。我 們 要 先 enable「Secure SSL」,並 且 設 定 好 要 把 「private_html」指 向 「public_html」。這 是 因 為 我 們 想 把 原 有 的 舊 WordPress 直 接 轉 為 Https,而 唔 係 想 要 另 外 建 立 多 一 個 WordPress。

完 成 以 上 的 步 驟 ,就 可 以 去 瀏 覽 器 ,嘗 試 一 下 打 開 Https 的 網 站 ( https://www.misterngan.com/ )。如 果 見 得 到 自 己 個 WordPress 的 首 頁 ,你 就 已 經 成 功 左 一 大 半 。現 階 段 你 的 wordpress 應 該 係 有 好 多 error 的 ,但 唔 緊 要 ,我 們 下 面 的 步 驟 ,就 是 要 消 除 這 些 error 的 。

首 先 我 們 登 入 wordpress 的 admin panel,去 「Settings」>「General」,將 wordpress 的 網 址 改 為 https。

define('FORCE_SSL_ADMIN', true);

然 後 ,在 wordpress 裡 面 有 一 個 選 項 ,可 以 強 迫 admin panel 一 定 要 用 https 才 能 登 入 的 。要 啟 用 這 個 功 能 ,我 們 要 在 wp-config.php 檔 案 裡 面 加 入 上 面 的 這 一 行 程 式 碼 。

再 之 後 ,如 果 你 的 舊 post 裡 面 有 很 多 多 媒 體 檔 案 連 結 的 話 ,那 些 連 結 都 會 失 效 的 。這 叫 做 「 mixed content warning」。這 是 因 為 在 Https 的 網 頁 ,所 有 連 結 或 者 引 用 的 資 源 ,全 部 都 必 須 要 係 Https。最 明 顯 的 就 係 舊 post 的 圖 會 全 部 唔 見 晒 ,因 為 所 有 圖 片 的 連 結 依 然 是 http 的 。

如 果 我 叫 你 一 個 個 舊 post 咁 修 改 ,你 一 定 會 打 死 我 。其 實 我 們 可 以 直 接 登 入 database,打 一 兩 個 command 就 update 晒 整 個 資 料 庫 。以 misterngan.com 為 例 ,我 們 用 的 是 MySql database,管 理 database 的 就 是 phpMyAdmin。

登 入 phpMyAdmin 之 後 ,看 一 看 你 wordpress 用 的 是 那 一 個 資 料 庫 。我 們 的 資 料 庫 是  misterngan_wp1。如 果 你 唔 確 定 是 那 一 個 資 料 庫 ,你 可 以 在 wp-config.php 裡 面 找 回 有 關 的 資 料 。

# Update post content (images, iframes, scripts, etc.)
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://yoursite.com', 'https://yoursite.com');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.yoursite.com', 'https://www.yoursite.com');

# Update post content subdomains if any
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://subdomain.yoursite.com', 'https://subdomain.yoursite.com');

# Update comment author pingbacks
UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'http://yoursite.com', 'https://yoursite.com');
UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'http://www.yoursite.com', 'https://www.yoursite.com');

我 們 只 要 輸 入 以 上 的 SQL command,就 會 自 動 更 新 所 有 舊 post 的 content。如 果 你 的 舊 post 有 一 些 外 部 的 資 料 ,也 可 以 用 類 似 的 方 法 更 改 。( 請 把 yoursite.com 改 回 你 用 的 domain name )

# Update youtube links
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.youtube.com', 'https://www.youtube.com');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://img.youtube.com', 'https://img.youtube.com');

例 如 上 面 的 兩 個 SQL command 就 會 把 舊 post 裡 面 的 youtube link 由 http 改 為 https。

到 了 現 在 ,你 的 wordpress 絕 大 部 的 東 西 應 該 都 可 以 正 常 運 作 的 了 。你 已 經 可 以 宣 佈 你 的 wordpress 已 經 成 功 由 http 轉 左 去 https 了 。

不 過 ,由 於 互 聯 網 上 的 所 有 連 接 到 你 的 wordpress 的 連 結 ,都 依 舊 是 http 開 頭 的 ,包 括 各 大 搜 尋 器 的 搜 尋 結 果 ,所 以 ,我 們 還 是 要 將 所 有 http 的 request,都 自 動 轉 跳 去 https。一 般 來 說 ,我 們 會 叫 這 種 轉 跳 做 301 redirect。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

在 你 的 wordpress 網 站 的 root 的 位 置 ( 以 我 們 來 說 就 是 public_html ),打 開 或 者 創 建 一 個 叫 「.htaccess」的 檔 案 ,把 上 面 的 幾 行 command 複 製 到 檔 案 裡 面 。

然 後 我 們 在 瀏 覽 器 輸 入 沒 有 https 的 舊 網 址 ( 例 如 http://www.misterngan.com/ ),看 看 會 不 會 自 動 轉 跳 到 帶 有 https 的 新 網 址 ,如 果 成 功 ,就 代 表 設 定 正 確 。以 後 不 管 是 使 用 者 ,或 者 是 google 或 是 facebook 的 crawler,都 會 由 你 的 舊 網 址 自 動 到 達 你 的 新 的 網 址 。

Tada!至 此 ,一 般 的 設 定 就 完 成 了 ,而 你 的 (我 的 )facebook like 和 share 都 無 晒 了 。恭 喜 恭 喜 。

再 之 後 ,就 是 wordpress 原 本 安 裝 的 舊 plug-in,你 要 逐 一 檢 查 它 們 是 不 是 正 常 運 作 ,不 能 正 常 運 作 的 ,你 可 以 嘗 試 deactivate 再 activate 一 次 。如 果 唔 得 就 uninstall 再 reinstall 一 次 。如 果 都 係 唔 得 ,就 只 能 另 外 找 代 替 品 的 了 。

以 misterngan.com 為 例 ,全 部 plug-in 在 前 台 都 可 以 正 常 運 作 ,有 幾 個 在 後 台 會 出 現 一 些 error。花 時 間 另 找 plug-in 也 是 十 分 麻 煩 的 事 ,而 且 很 可 能 會 lose data,又 或 者 要 去 舊 post 逐 一 更 改 設 定 ,所 以 我 自 己 的 底 線 係 ,只 要 在 前 台 能 正 常 運 作 ,後 台 的 一 點 點 error 就 由 它 吧 。

再 後 續 要 做 的 ,就 是 更 新 你 在 外 面 登 記 的 其 他 服 務 的 登 記 網 址 ( 這 就 和 wordpress 的 設 定 無 關 了 )。例 如 google search console / google webmaster / google analytics 之 類 ,你 都 要 重 新 加 入 新 的 網 址 或 者 修 改 舊 的 網 址 ( 總 之 都 要 轉 為 https://www.misterngan.com/)。很 多 服 務 都 會 將 http 和 https 當 成 是 兩 個 獨 立 不 同 的 網 站 ,所 以 大 部 分 的 這 些 服 務 你 都 要 重 新 登 記 新 的 網 站 / 網 址 。

最 後 ,介 紹 一 篇 有 趣 的 文 章 給 大 家 ,我 自 己 就 試 黎 試 去 都 得 唔 返 之 前 的 facebook like 和 share ( canonical url 和 og:url 我 都 改 過 了 ,都 係 完 全 無 效 果 ),就 留 給 大 家 自 己 去 嘗 試 一 下 吧 。

How to Recover Your Facebook Shares after Moving from HTTP to HTTPS

如 果 大 家 之 前 有 like 過 或 者 share 過 我 的 舊 文 的 話 ,就 唔 好 忍 手 了 ,再 次 去 幫 我 like 或 share 吧 。哈 哈 哈 哈 哈 哈 。

ctleung張先生,男性,肖龍。
職業:I.T. Consultant
簡介:不好好讀書;七尺差五寸,手長過膝,雙耳垂肩;性寬和,寡言語,喜怒不形於色。據說少時曾斬白蛇於鳳凰山下……

This entry was posted in Computer & Network and tagged , , , , , , , . Bookmark the permalink.

2 Responses to 實作:將 WordPress 由 Http 轉做 Https

  1. JT says:

    我想請問為何我的網站安裝了SSL憑證後,卻顯示為「資訊或不安全」?沒有鎖頭符號,只有i 外圍一個圈。在iPhone 上這個網站也沒顯示鎖頭。Click 入去Chrome寫住:你與這個網站的連線可能有安全漏洞。然後下面有三個圖示:
    1)憑證(安全)
    2)目前使用兩個cookie
    3)網站設定
    謝謝!

    • C.T. Leung says:

      這很明顯是你的SSL憑證有錯誤。可能是SSL憑證和瀏覽的網址不乎,也可能是SSL憑證已經過期,又或者你的SSL憑證並不是由信任的單位發出。

Leave a Reply to JT Cancel reply

Your email address will not be published. Required fields are marked *