將網站從 HTTP 升級到 HTTPS,已經不是「要不要做」,而是「越早做越好」的基本工程。HTTPS 不只保護使用者與伺服器之間的傳輸資料,還會直接影響 Google 搜尋排名、Core Web Vitals 評分、瀏覽器信任標示,甚至 AI 搜尋引擎是否願意推薦您的網站。在 Apache 伺服器上,透過 .htaccess 設定 301 重導向,是最快、最不需動到原始碼的做法。本文將從 SSL 憑證確認、.htaccess 規則寫法、實務情境(WordPress / Cloudflare / Nginx / IIS)到常見錯誤排查,提供完整的中文操作指南,適合網站管理員、行銷人員與第一次接觸 .htaccess 的中小企業主閱讀。
為什麼一定要把網站升級為 HTTPS?
很多網站主以為 HTTPS 只是「加上一個鎖頭圖示」,但實際上它影響的層面遠超過視覺。從 2018 年 Chrome 開始把所有 HTTP 網站標記為「不安全」之後,HTTPS 已經是網站的標準配備,而不是加分項目。
HTTPS 不只是「加密」,更是搜尋引擎信任、瀏覽器信任、使用者信任的三重門檻。
HTTPS 對網站的四個核心影響:
什麼是 .htaccess?它的角色與限制
.htaccess 是 Apache 伺服器專用的設定檔,它的全名是 Hypertext Access(超文本存取設定)。檔名以一個點開頭,代表它是隱藏檔案,沒有副檔名。它的特色是「目錄層級生效」——放在哪個目錄,就只控制該目錄與其子目錄的行為。
.htaccess 能做哪些事?
- URL 重導向(包括 HTTP→HTTPS、www→non-www、舊網址→新網址)
- 網址美化(把
?id=123改寫成/article/123/) - 密碼保護特定目錄(Basic Authentication)
- IP 封鎖、防盜連、防垃圾爬蟲
- 自訂錯誤頁(404、500 等)
- 強制下載特定副檔名、設定快取標頭
.htaccess 的限制與風險
雖然 .htaccess 功能強大,但有幾個重要限制必須先理解,否則容易「改了沒生效」或「整站爆 500 錯誤」:
| 限制項目 | 說明 | 對應做法 |
|---|---|---|
| 僅限 Apache | Nginx、IIS、Caddy 不讀取 .htaccess |
改用各自的設定檔(見第五章) |
| 需要 AllowOverride | 主機若關閉 AllowOverride All,規則無效 |
聯絡主機商開啟,或使用 vhost 設定 |
| 需要 mod_rewrite | 301 重導向依賴此模組 | 聯絡主機商確認已啟用 |
| 語法錯誤會 500 | 一個多餘字元就讓整站當機 | 修改前先備份原檔 |
| 效能略低於 vhost | 每個請求都會讀檔,造成微幅延遲 | 正式環境可考慮搬到 vhost |
.htaccess 前,務必先用 FTP / SFTP 下載一份備份,命名為 .htaccess.bak。萬一規則寫錯導致 500 錯誤,可以立刻把備份檔覆蓋回去。沒有備份就動手,是最常見的災難起點。
四個步驟完成 HTTP 轉 HTTPS
以下是最標準的 4 個步驟流程,從前置確認、找檔案、寫規則到測試,每一步都有實務細節需要注意。
-
確認 SSL 憑證已正確安裝
在寫任何重導向規則之前,網站必須已經能透過
https://正常開啟。如果 HTTPS 版本連不上,卻先設定強制跳轉,瀏覽器只會顯示「無法建立安全連線」。多數虛擬主機商(SiteGround、Bluehost、戰國策、捕夢網等)都提供免費 Let's Encrypt 憑證,在主機後台一鍵啟用即可。在瀏覽器手動輸入https://yourdomain.com,確認頁面能載入、網址列出現鎖頭圖示、且沒有「您的連線不是私人連線」警告,才算憑證安裝成功。可用 SSL Labs Server Test 進一步檢測憑證等級,目標為 A 或 A+。 -
找到或建立 .htaccess 檔案
用 FTP 工具(FileZilla、WinSCP、Cyberduck)連線到主機,進入網站的根目錄(通常是
public_html、www或htdocs)。如果已存在.htaccess,直接下載編輯;如果沒有,可在本機建立純文字檔再上傳。注意:Windows 系統不允許「以點開頭、沒有副檔名」的檔名,可先命名為htaccess.txt上傳後再到主機改名。FileZilla 預設不顯示隱藏檔。請點擊「伺服器」→「強制顯示隱藏檔」,才能看到.htaccess。 -
加入 301 重導向規則
在
.htaccess檔案最上方新增以下三行規則。如果檔案中已有RewriteEngine On,則只需要加入後面兩行,避免重複宣告造成衝突。WordPress 網站的.htaccess通常已有# BEGIN WordPress區塊,請把 HTTPS 規則放在該區塊「之前」,而不是塞進區塊內,以免 WordPress 更新時被覆蓋。 -
上傳、清快取、跨瀏覽器測試
存檔上傳後,先用無痕視窗測試,避免瀏覽器快取干擾。輸入
http://yourdomain.com應自動跳轉到https://,測試多個內頁(http://yourdomain.com/about、http://yourdomain.com/products/123)是否也都正確跳轉。同時使用 Chrome、Safari、Firefox 各測一次。用 httpstatus.io 輸入網址,可看到完整跳轉鏈。理想結果是「http://→ 301 →https://→ 200」,只有一次跳轉。如果出現 302、多次跳轉或 307,需回頭檢查規則。
.htaccess 標準規則(三行版本)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
每一行做什麼?
RewriteEngine On——啟動 Apache 的 URL 重寫引擎,是所有 RewriteRule 的前提。RewriteCond %{HTTPS} off——只在「當前連線不是 HTTPS」時才執行下一行,避免已是 HTTPS 的請求被重複處理造成迴圈。RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]——把使用者送往「同一主機、同一路徑,但改用 HTTPS」的網址。[L]代表這是最後一條規則,[R=301]代表永久重導向。
進階寫法:同時處理 www / non-www
如果同時想統一網址(例如把 www.yourdomain.com 也導到 yourdomain.com),可以用單一規則同時處理 HTTPS 與網域正規化,避免兩段規則造成雙重跳轉(http→https→non-www,共兩次跳轉會輕微影響 LCP):
RewriteEngine On
# 同時強制 HTTPS + 去除 www (合併為單次跳轉)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\\\\\\\\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
RewriteCond 改成 RewriteCond %{HTTP_HOST} !^www\\\\\\\\.,並將 RewriteRule 調整為 https://www.%{HTTP_HOST}%{REQUEST_URI}。非 www 與 www 二選一即可,不要兩個版本都對外開放,否則會被 Google 視為重複內容。
為什麼一定要用 301 而不是 302?
301 與 302 都能達到「網址跳轉」的效果,但對搜尋引擎來說,兩者意義完全不同。錯用 302 是 HTTPS 升級最常見、也最致命的 SEO 錯誤之一。
| 項目 | 301 永久重導向 | 302 暫時重導向 |
|---|---|---|
| 適用情境 | 網址永遠改變(HTTPS 升級、換網域、合併網站) | 短期活動頁、維護頁、A/B 測試 |
| 權重傳遞 | 傳遞 95% 以上的 PageRank | 幾乎不傳遞,搜尋引擎保留舊網址 |
| 索引更新 | Google 會把舊網址替換為新網址 | Google 持續索引舊網址 |
| 瀏覽器快取 | 會被快取(下次直接到 HTTPS) | 不快取(每次都要再問伺服器) |
| HTTPS 升級 | ✓ 正確選擇 | ✕ 嚴重錯誤 |
不同環境的對應寫法(WordPress / Cloudflare / Nginx / IIS)
並不是每個網站都跑在純 Apache 上。如果您的環境是 WordPress、有掛 Cloudflare、用 Nginx 或 Windows IIS,規則寫法會略有不同。以下分四個情境說明。
情境一:WordPress 網站
WordPress 預設使用 Apache,所以 .htaccess 規則完全適用。但要注意三件事:
- HTTPS 跳轉規則放在
# BEGIN WordPress區塊「之前」,避免 WordPress 更新固定網址設定時覆蓋。 - 到「設定 → 一般」把「WordPress 位址」與「網站位址」都改為
https://開頭,否則後台會仍生成 HTTP 連結。 - 使用 Better Search Replace 或 WP-CLI 把資料庫內所有
http://yourdomain.com替換為https://yourdomain.com,解決混合內容(Mixed Content)問題。
.htaccess,可安裝外掛「Really Simple SSL」。它會自動處理跳轉與混合內容修正,但跳轉是透過 PHP 執行,效能與相容性略遜於原生 .htaccess 規則。長期建議改回 .htaccess 規則,並停用該外掛。
情境二:有掛 Cloudflare 的網站
Cloudflare 會在使用者與您的伺服器之間架一層 CDN/代理,因此 HTTPS 跳轉有兩種做法,而且不能兩種同時做,否則容易產生無限迴圈。
.htaccess 規則。但因 Cloudflare 與伺服器之間用 HTTP 連線時,%{HTTPS} 會顯示 off,容易造成迴圈。.htaccess 規則。如果一定要伺服器端執行,需改用 X-Forwarded-Proto 判斷。若一定要在伺服器端執行 HTTPS 強制,Cloudflare 環境下應改用以下規則:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
情境三:Nginx 主機
Nginx 不讀取 .htaccess,所有規則必須寫在 nginx.conf 或 sites-available/ 的 server block 內。以下是對應的 server block 寫法,放在監聽 80 port 的區塊裡:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://yourdomain.com$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
# ... SSL 憑證與其他設定 ...
}
修改後使用 sudo nginx -t 檢查語法,確認 syntax is ok 後,執行 sudo systemctl reload nginx 重新載入設定(不要用 restart,否則會中斷連線)。
情境四:Windows IIS 主機
IIS 使用 web.config 取代 .htaccess,需安裝「URL Rewrite Module」。對應的規則寫在 <system.webServer> 區塊內:
<rewrite>
<rules>
<rule name="HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
redirectType="Permanent" />
</rule>
</rules>
</rewrite>
.htaccess;
Nginx → nginx.conf 的 server block;
IIS → web.config 的 rewrite rules;
Cloudflare → 直接用 Edge 端「Always Use HTTPS」最省事。
HTTP 轉 HTTPS 常見錯誤與排查
即使規則寫對,實務上仍可能出現「跳轉沒生效」「整站 500」「無限迴圈」等問題。以下整理六個最常見錯誤與排查方向:
-
無限重導向迴圈(ERR_TOO_MANY_REDIRECTS)
最常見原因:Cloudflare 與
.htaccess同時設定 HTTPS 強制,或 Cloudflare SSL 模式設為「Flexible」。排查:關掉其中一個,並把 Cloudflare SSL 模式改為「Full」或「Full (Strict)」。 -
500 Internal Server Error
幾乎都是
.htaccess語法錯誤,或主機未啟用mod_rewrite。排查:把備份檔覆蓋回去,確認網站恢復後逐行加入規則,排除哪一行有問題;若仍 500,請主機商確認mod_rewrite與AllowOverride All是否啟用。 -
混合內容警告(Mixed Content)
HTTPS 頁面內仍載入 HTTP 的圖片、CSS、JS,導致鎖頭圖示變灰色或紅色三角形。排查:用 Chrome DevTools 的 Console 查看警告,逐一把資源網址改成
https://或協定相對網址//yourdomain.com/...。WordPress 可用 Better Search Replace 批次處理。 -
回傳 302 而非 301
常見於 WordPress 外掛、Cloudflare Page Rules 預設、或寫成
[L,R](漏寫 301)。排查:用 httpstatus.io 確認回傳碼;若不是 301,檢查外掛設定與.htaccess是否完整寫出[L,R=301]。 -
部分頁面沒跳轉
通常是
.htaccess放錯目錄(放在子目錄而非根目錄),或被其他更早的 RewriteRule 攔截。排查:確認.htaccess在public_html(或對應根目錄),並把 HTTPS 規則放在所有規則「之前」。 -
SSL 憑證錯誤(NET::ERR_CERT_INVALID)
憑證未涵蓋所有子網域(例如只有
yourdomain.com沒有www.yourdomain.com),或憑證已過期。排查:用 SSL Labs Server Test 檢測,確認憑證涵蓋的網域與到期日;Let's Encrypt 預設 90 天到期,要設定自動續約。
升級後必做的 SEO 收尾檢查
301 規則生效只是「技術完成」,但搜尋引擎與內部連結還需要時間追上。以下五件事必須在 HTTPS 上線後 48 小時內完成,避免排名暫時下滑或流量斷層:
- 到 Google Search Console 新增 HTTPS 版本網站資源,並重新提交 sitemap.xml
- 更新
sitemap.xml與robots.txt,內部所有網址都改為https:// - 檢查 Google Analytics 4 的網址設定,把預設網址從
http://改為https:// - 檢查並更新所有外部反向連結(從合作網站、部落格、社群、Email 簽名檔)
- 更新 Open Graph 標籤、Schema.org 結構化資料中所有
url欄位
第一層「Header 層」用 httpstatus.io 確認所有舊網址都回傳 301 並指向 HTTPS;第二層「Content 層」用 Chrome DevTools 開啟首頁與重要內頁,確認沒有 Mixed Content 警告;第三層「Search Console 層」確認 HTTPS 資源已正常收到曝光與點擊數據,通常 1-2 週內就會看到舊 HTTP 資源流量下降、HTTPS 資源流量上升。
結論:.htaccess 是最快、但最需要謹慎的 HTTPS 升級方式
透過 .htaccess 設定 HTTP 轉 HTTPS 重導向,只需要三行程式碼就能完成,但背後牽涉到 SSL 憑證、Apache 模組、CDN 環境、瀏覽器快取與 SEO 索引轉移等多個環節。動手前先備份、選對 301、針對環境(Apache / Nginx / IIS / Cloudflare)用對寫法,並在上線後完成 Search Console、sitemap、Analytics 的收尾,才能讓這次升級既安全又對 SEO 有正面效益。
升級前可用以下五個問題自我檢查:
- SSL 憑證是否已正確安裝,
https://版本能直接開啟且無警告? - 是否已備份原
.htaccess為.htaccess.bak? - 主機環境是否確定為 Apache?(若為 Nginx / IIS / Cloudflare 需改用對應寫法)
- 規則是否使用
[L,R=301]永久重導向,而非 302? - 升級後是否同步更新 Search Console、sitemap、Analytics 與內部連結?
.htaccess 規則,能同時改善資安、SEO、品牌信任與 AI 引用率,投資報酬率是所有 SEO 操作中最高的。如果想進一步了解網站 SEO 優化,可以參考新視野 SEO 教學指南。
常見問答 FAQ
沒安裝 SSL 憑證可以直接設定 .htaccess 強制 HTTPS 嗎?
.htaccess 規則只是告訴瀏覽器「請改用 HTTPS 連線」,但實際的加密傳輸必須由伺服器上的 SSL 憑證來完成。如果沒有憑證就強制跳轉,使用者只會看到「無法建立安全連線(NET::ERR_CERT_AUTHORITY_INVALID)」的紅色錯誤頁,等於整個網站打不開。正確順序是:1. 先到主機後台安裝 Let's Encrypt 免費憑證(多數虛擬主機商如 SiteGround、Bluehost、戰國策、捕夢網都支援一鍵安裝);2. 用瀏覽器手動輸入 https://yourdomain.com 確認能正常開啟、出現鎖頭圖示;3. 確認無誤後再加入 .htaccess 規則。如果主機商不支援免費憑證,可考慮升級主機或改用 Cloudflare 提供免費 SSL。
修改 .htaccess 之後網站變成 500 錯誤怎麼辦?
.htaccess 修改後出現,九成以上是語法錯誤或主機未啟用 mod_rewrite。緊急處理流程:1. 立刻把備份檔 .htaccess.bak 重新命名覆蓋回去,確認網站先恢復正常。2. 用文字編輯器(VS Code、Notepad++)打開新規則檢查:是否有多餘空白、中文標點符號被誤打進去、引號是否成對、[L,R=301] 是否完整。3. 把規則一行一行加回去,每加一行就上傳測試,找出哪一行造成 500。4. 若三行都正確仍 500,請聯絡主機商確認伺服器是否啟用了 mod_rewrite 模組與 AllowOverride All 設定。台灣常見虛擬主機商預設都已啟用,但部分共用主機或便宜 VPS 可能需要主動申請。
HTTPS 升級會讓 SEO 排名下降嗎?
Cloudflare 已經有 "Always Use HTTPS",還需要在 .htaccess 加規則嗎?
.htaccess 加 HTTPS 強制規則,容易產生無限重導向迴圈(ERR_TOO_MANY_REDIRECTS),原因是 Cloudflare 與您的伺服器之間可能用 HTTP 通訊(取決於 SSL 模式設定),%{HTTPS} 變數會回傳 off,造成規則一直觸發。最佳實務是「邊緣端處理 HTTPS,源伺服器只處理應用邏輯」:1. Cloudflare 儀表板 → SSL/TLS → 設為 Full 或 Full (Strict);2. SSL/TLS → Edge Certificates → 開啟 Always Use HTTPS 與 Automatic HTTPS Rewrites;3. 把 .htaccess 內的 HTTPS 強制規則註解掉或移除。如果一定要在伺服器端執行(例如未來可能撤掉 Cloudflare),則必須改用 RewriteCond %{HTTP:X-Forwarded-Proto} !https 判斷,而非 %{HTTPS} off。