將 Apache 的 .htaccess 轉換為 Nginx 設定檔,是一個經過審核的遷移步驟,而不是逐行的直接翻譯:htaccess 轉 Nginx 轉換工具只會針對它明確支援的有限指令子集輸出行內容,會在原始行號回報每個 RewriteCond、無法辨識的旗標,或無替換的破折號,並拒絕為無法安全替換的規則默默自行推算出 Nginx 對應語法。Apache 與 Nginx 用不同的請求處理模型解決相似的路由問題,因此乍看相同的 rewrite 規則,一旦跨越伺服器界線,行為就可能改變。貼上一段聚焦於 document-root 的摘錄,工具會回傳一小段片段,加上明確列出仍需由人工判斷的決策清單。在任何正式重新載入之前,執行 nginx -t、模擬代表性請求進行 staging、以及完整測試,並非可有可無的修飾 —— 它們才是確保永久重新導向、查詢字串、以及 HTTP 對 HTTPS 遷移不會破壞公開流量的關鍵。

convert htaccess to nginx config
convert htaccess to nginx config

htaccess 轉 Nginx 轉換工具實際上轉譯了什麼

這個工具基於刻意受限的契約運作:只有其解析器涵蓋的指令子集會被轉換,其餘內容會原封不動地交還給工程師。支援的 rewrite 形式包含一個 Apache RewriteRule 樣式、一個替換字串,以及一個以括號包住的旗標清單;其自動旗標集合刻意僅限於 L、R、R=301 與 R=302。Apache 的永久重新導向會對應到 Nginx 的 permanent 旗標,臨時重新導向會對應 redirect,而內部 last 規則則會對應 last

document-root 內 .htaccess 的樣式通常會比對移除目錄前綴後剩下的路徑,因此常以脫字符開頭且沒有前置斜線。Nginx 的 rewrite 樣式看到的則是已經以斜線開頭的 URI。轉換工具會在支援的根情境樣式前補上這個前置斜線,以彌補這個落差。這是 document-root 檔案一項已記載的範圍假設,並非適用於巢狀 .htaccess 情境、Alias 對應、或 location 專屬 Nginx 區塊的通用轉換。

另有三項非 rewrite 對應也包含在契約中。Options -Indexes 會轉為 autoindex off。本機的 ErrorDocument 404 路徑會轉為帶有相同路徑的 error_page 404。加上引號的 X-Robots-Tag Header set 值會轉為 add_header 行,保留原始值不變。註解會保留,RewriteEngine On 會被忽略,整個處理過程都在瀏覽器中完成 —— 輸入內容不會被傳送到任何地方。

為什麼這個工具傾向回報而不是猜測

一個會默默寫出看似合理但實際不等同的設定檔的轉換工具,比留下一份明確待辦的工具更危險。這個工具在以下三種特定情況下會發出警告而非自行生成內容,而這些警告本身會被視為輸出結果的一部分。

  • 未知的 rewrite 旗標。諸如 QSA、END、F、G、B 或 NC 等旗標,會以無法靠樣式替換抹除的方式改變請求處理,因此一旦某條規則帶有這些旗標,該行的轉換會整個停止。
  • RewriteCond 前導條件。條件可能以特定評估順序檢查 HTTPS 狀態、主機名稱、檔案、目錄、查詢字串、標頭,以及擷取群組。當 RewriteRule 跟在 RewriteCond 之後,工具會連同該規則一起抑制輸出 —— 因為輸出一條無條件的重新導向,可能會改變流量、產生迴圈,或暴露某個路由。
  • 單一破折號目標。若 RewriteRule 的替換字串只有「-」,通常會搭配改變存取或處理流程、卻不更動 URI 的旗標使用,而字面上的破折號並非安全的 Nginx 對應方式。

其他需要手動遷移的項目包含身分驗證、授權、防盜連、代理邏輯、CMS front-controller 規則、環境變數、條件式標頭、外部錯誤 URL,以及指令容器。這些內容都不會被輸出為 Nginx 設定。

如何在不破壞重新導向的前提下將 htaccess 轉為 Nginx 設定

這個工作流程把轉換後的內容視為更大工程任務中經過審核的片段,而不是一份已完成的 Nginx 設定。

  1. 開啟 htaccess 轉 Nginx 轉換工具,貼上一段聚焦於 document-root 的摘錄 —— 從涉及永久重新導向、HTTPS 標準化、或自訂 404 路徑的規則開始。
  2. 將輸出的片段與原始的 Apache 來源並列閱讀。警告會附帶原始行號,因此每個決策都能追溯回輸入檔中的對應位置。
  3. 逐條對照 Apache 的 mod_rewrite 介紹與 Nginx 指令文件,逐一解析每個帶行號的警告。
  4. 將每條審核過的內容放到正確的 Nginx 情境中 —— 主機層級的重新導向放在 server 區塊,路徑專屬的 rewrite 放在 location 區塊 —— 並以官方模組參考文件確認指令相容性。
  5. 在部署路徑之外備份目前線上的 Nginx 設定,並在進行任何 staging 變更前保留一個可還原的工作階段。
  6. 對組裝好的設定執行 nginx -t,仔細閱讀完整輸出,並在進入下一步前修正所有回報的語法或情境錯誤。
  7. 在 staging 或可逆的維護時段內實際請求具代表性的 URL:舊路徑、新路徑、查詢字串、HTTPS 變體,以及其他主機名稱。請確認回應中的 Location 標頭,而非僅憑瀏覽器網址列判斷。
  8. 只有當重新導向維持其預期的狀態碼、且快取層未出現過期行為時,才正式線上重新載入。

在可行的情況下,先從可控環境中的臨時重新導向開始,測試過舊路徑、新路徑、查詢字串、其他主機與 HTTPS 行為後,再切換為永久重新導向。瀏覽器與中間節點會快取永久回應,因此一旦目標寫錯,影響範圍會比臨時重新導向持續得更久。

從片段到可運作的 Nginx 情境

轉換工具的輸出是片段,而不是一份完整的 nginx.conf。它不會建立 http、server 或 location 區塊,不會選擇 listen 連接埠、不會設定 server_name、不會設定 TLS、不會指定 document root、不會保留 PHP 路由、不會設定 proxy 轉送,也不會定義 log。這些決策屬於實際的應用程式架構,必須在片段變得可載入之前補齊。

Nginx 核心的 error_page 文件與 headers 模組參考,規範了每行輸出的歸屬位置。轉換後的 Options -Indexes 行應放在不允許瀏覽的 location 區塊內,而本機 ErrorDocument 404 的輸出則應放在會解析錯誤頁面的 server 或相關 location 層級。X-Robots-Tag 的 add_header 輸出僅適用於它預期控制的回應,因此適用範圍至關重要。

組裝後的快速健全性檢查:以 nginx -t 確認設定可正確解析;發送幾個代表性請求的同時持續觀察 error log;並確認來自應用程式的 404 會沿著新的 error_page 路徑傳遞。一行語法正確的設定,對於其所在情境仍可能不正確,而這正是稽核步驟預期要揪出的那類錯誤。

支援的輸出與回報的警告

document-root .htaccess 中的輸入轉換工具的處理方式
RewriteRule 帶有 [L]、[R]、[R=301] 或 [R=302]以對應的 Nginx 旗標輸出(last、redirect、permanent);document-root 樣式會自動補上前置斜線
RewriteRule 帶有 [QSA]、[END]、[F]、[G]、[B] 或 [NC]該規則停止轉換;回報行號
RewriteRule 的替換字串為單一破折號 (-)保留該規則;回報行號
RewriteCond(任何變數、任何條件)永不輸出;配對的 RewriteRule 也一併抑制
RewriteEngine On忽略 —— Nginx 不需要對應的指令
Options -Indexes輸出為 autoindex off
ErrorDocument 404 /local-path輸出為帶有相同路徑的 error_page 404
Header set X-Robots-Tag "value"輸出為 add_header,值的引號維持原樣
其他狀態碼、外部錯誤 URL、環境變數、條件式標頭、指令容器於原始行號回報;需手動遷移

正是這份契約讓轉換工具能作為一份盤點助理發揮價值:它精準告訴工程師哪些行可以直接搬遷,哪些行在進入正式環境前仍需要人工處理。

當遷移變成一項工程工作

一份內容簡短、聚焦的 .htaccess,只包含少量重新導向和一條自訂 404 路徑,是這個轉換工具的合適規模。一旦規模更大,幾乎可以確定是一項需要 staging 環境、版本控管的 Nginx 設定、以及明確測試矩陣的工程遷移。

只要來源符合下列任一情況,就應將這次搬遷視為工程工作而非單純的文字替換:

  • 相依於 Apache 檔案型處理器的身分驗證與授權指令。
  • 帶有複雜條件鏈的防盜連規則。
  • 必須保留後端路由的 proxy 或 fastcgi_pass 邏輯。
  • 其 rewrite 鏈依賴檔案存在檢查的 CMS front-controller 規則。
  • 會影響後續 rewrite 的條件式標頭、環境變數、或 rewrite map。

稽核優先的工作流程能讓這份複雜度留在工程軌道之上:貼上一段聚焦的摘錄、檢視轉換後的數量、逐一解析所有警告、在版本控管的 Nginx 檔案中組裝結果,並於 staging 上驗證。如果警告清單的成長速度超過轉換出來的片段,正確的回應是放慢腳步,而不是把稽核步驟擱置一旁。

想深入了解,請參閱如何取得一份真正能運作的 Nginx 設定

想深入了解,請參閱如何在 cPanel 檔案管理員中建立 .htaccess 檔案