.htaccess 轉換到 nginx 的遷移作業有兩個實際的切入點:一個是在本機對複製出來的檔案執行命令列腳本,另一個是在瀏覽器中運作的線上轉換器,它會回傳一個可直接送審的 Nginx 片段,並針對無法翻譯的內容附上行號編列的警告。這個選擇至關重要,因為 Apache 以目錄為基礎的 .htaccess 模型,與 Nginx 集中式的伺服器和 location 區塊並不能互換;任何會靜默改寫條件、陌生旗標或別名專屬模式的轉換器,都可能產生語法上看似正確、實際上卻會改變流量行為、造成重新導向迴圈,或把您原本無意搬遷的路由暴露出來的設定。在 CI 內進行大量變更時,命令列管線速度較快,但它通常只會印出一個「已轉換」的結果,並不會告訴您它實際讀懂的是哪些輸入行。一款會公開自身限制並顯示警告的瀏覽器內線上轉換器,則能把這次遷移變成一份有計數、可稽核的清單,清楚標示哪些已翻譯、哪些仍須對照 Apache 與 Nginx 文件進行人工檢視。

命令列 vs 線上:實際差異為何
兩種做法都試圖解決同一個問題——把為 .htaccess 撰寫的 Apache 設定,轉換成具有相同可觀察效果的 Nginx 設定——但信任模型並不相同。命令列工具(包括在程式碼代管平台上常見的開放原始碼腳本)會從磁碟讀取檔案,執行正規表示式或手寫的解析器,然後在同目錄下或寫入標準輸出產出輸出檔。審閱者必須把輸入與輸出並排,靠肉眼進行差異比對。當腳本遇到 RewriteCond、不熟悉的旗標或別名專屬規則時,這個流程並不會出錯——它只是略過該行,或是吐出一個看起來合理的結果就繼續往下走。
在瀏覽器中運作的線上轉換器會接收貼上的片段、永不碰觸磁碟,並回傳兩個不同的產物:一段轉換後的片段,以及一份對應到原始行號的警告清單。審閱者可以貼上單一段落,計算有幾行被改動、有幾行被拒絕翻譯,並判斷被拒絕的那些行是否本來就不該存在於 Nginx 中。htaccess to Nginx Converter 採用的正是這個模式:輸入內容從不離開頁面,輸出結果則圍繞著工具能證明自己讀懂的範圍來組織。
命令列轉換器在處理 .htaccess 上的不足之處
在這個任務上被引用最廣泛的開放原始碼命令列專案,會自我形容為「真的很基本」,並內建一套為常見 CMS 前端控制器調校過的小型正規表示式替換。對於快速的初稿來說很實用,但它們並不會逐一列出哪些行已成功轉換、哪些是被默默捨棄的,也不會在 RewriteCond、QSA、END、F、G、B 或 NC 等旗標上停下來,以一種可在輸出中清楚看見的方式發出警告。如果腳本判斷某個旗標與它認得的某項「夠接近」,您往往要等到正式伺服器上的冒煙測試才會發現——此時的症狀通常是重新導向迴圈,或是某個昨天在 Apache 上還能正常運作的路由變成了 404。
命令列管線還需要一份複製、執行環境,通常還得安裝套件。對於擁有該機器的 CI 作業來說沒問題,但對只想開個瀏覽器分頁、把單一舊站的 40 行片段轉一下的開發者而言,就是額外負擔。而在 CI 中對五十個站台執行同一支腳本的作業,會繼承同樣的盲點卻無人察覺,因為建置紀錄只會顯示綠色的結束代碼,而非逐行的稽核軌跡。希望精確掌握改動內容的審閱者,必須自行撰寫這份稽核紀錄,通常是與他們所信任的某份手工改寫參考檔進行 diff 比對。
為何瀏覽器內的線上轉換器更安全
支持瀏覽器內線上轉換器的安全論點雖然範圍窄,但確實成立。第一,輸入內容並不會被上傳:處理作業都在頁面上執行,貼上的文字不會被送到遠端伺服器,審閱者也可以透過觀察網路分頁來親自驗證。對於包含內部主機名稱、測試路徑或其他團隊不希望寫進第三方紀錄的組態檔,光是這一點就足以讓人傾向選用瀏覽器內工具。第二,刻意設計的轉換器所具備的狹隘契約本身也是一種安全特性。它不會試圖翻譯每一條 Apache 指令,而是會明確公告自己涵蓋的範圍——僅含以方括號列出、且旗標只包含 L、R、R=301 或 R=302 的 RewriteRule 樣式;Options -Indexes;本機的 ErrorDocument 404 路徑;以及加上引號的 X-Robots-Tag 標頭——其餘一律拒絕猜測。
第三,帶有行號的警告讓輸出結果變成一份查核清單。如果轉換器回報「line 7: RewriteCond present, not translated — manual review required」,審閱者就知道第 7 行必須手動遷移,且第 8 行緊接其後的規則是被刻意省略、而非不慎被捨棄。同樣的特性在撰寫良好的 CLI 工具中也能實現,但預設情況下很少主動顯示,運行它的 CI 系統也幾乎不會留下紀錄。對於一次性的單站遷移而言,使用一款範圍明確且有文件記載的瀏覽器內轉換器,是風險較低的選擇。
如何使用 htaccess to Nginx Converter
- 開啟 htaccess to Nginx Converter,從 document-root 的 .htaccess 中貼上一段焦點集中的片段——也就是包含 rewrite、目錄列表控制、本機 404 以及任何 X-Robots-Tag 標頭的部分。認證、proxy 與前端控制器區塊暫時擺一邊。
- 執行轉換,逐行閱讀警告清單。每條警告都會標出原始行號、工具未翻譯的指令,以及原因。在把轉換後的片段視為可信之前,請對照 Apache mod_rewrite introduction 以及相關的 Nginx 模組文件,逐一處理每條警告。
- 將每一行輸出放到正確的 Nginx 上下文中。為 document-root .htaccess 樣式產生的 rewrite 行,預期是放在 server 或 location / 區塊中,而不是放在符合不同前綴的巢狀 location 裡。autoindex off、error_page 404 以及 add_header 這幾行各有其適用範圍的規則——請參考 Nginx 核心 error_page 參考文件 來決定擺放的上下文。
- 備份目前線上的 Nginx 設定,把審閱過的片段組合成一個納入版本控制的檔案,並在測試主機或維護時段中對組合後的設定執行 nginx -t。語法檢查只能確認檔案能被解析,無法確認該 rewrite 的行為等同於原本的 Apache 規則。
- 使用 curl -I 測試重新導向、使用 curl -i 測試內部 rewrite,確認 Location 標頭符合預期,嘗試 HTTPS 與 HTTP 的組合,等到測試通過後再重新載入 Nginx。永久重新導向值得多驗一輪:務必等到新路徑、查詢字串與主機都驗證無誤後,再從暫時改為永久。
命令列 vs 線上:常見情境的決策表
| 情境 | 命令列腳本 | 瀏覽器內線上轉換器 |
|---|---|---|
| 單一小型的 document-root .htaccess 片段 | 殺雞用牛刀——需要複製、安裝、執行 | 最佳選擇——貼上、檢視、複製 |
| 在一次 CI 執行中遷移 30+ 個站台 | 最佳選擇——可腳本化、可重複執行 | 太慢——每個站台都要手動貼上 |
| 設定中包含內部主機名稱或測試路徑 | 風險取決於腳本的紀錄方式 | 更安全——輸入從不離開瀏覽器 |
| 來源包含 RewriteCond、QSA 或前端控制器規則 | 除非審慎稽核腳本,否則會默默猜測 | 帶行號的警告強制進行人工檢視 |
| 需要精確知道哪些行已翻譯 | 得自行對照參考改寫版本建立差異 | 內建——警告會標出原始行號 |
| 初次接觸 Nginx 的開發者進行首次遷移 | 門檻高——輸出沒有任何註解 | 摩擦較低——範圍狹隘、限制明確 |
此表為定性說明。某個 CLI 工具實際能翻譯哪些指令,取決於其原始碼;線上轉換器實際會發出哪些警告,則取決於輸入內容。建議對同一個測試樣本分別執行兩者,比較兩邊的警告清單,不要預設兩者的涵蓋範圍一致。
轉換之後:重新載入前的驗證步驟
這款轉換器並不會執行 nginx -t、檢查已安裝的模組、解析 include 順序,也不會動到您的伺服器。一行設定在語法上可能正確,卻不適合放在它的上下文中——例如把 rewrite 規則放錯了 server 區塊、add_header 行被更精確的 location 給吞掉、error_page 404 的路徑在磁碟上根本不存在。請把轉換後的片段視為人工遷移的一項輸入,而非一份完成的設定。標準流程是:備份目前的線上設定、保持一個可還原的工作階段、把片段組合成一個納入版本控制的檔案、執行 nginx -t、用 curl 測試具代表性的請求,等到測試通過後再重新載入。重新載入失敗或重新導向迴圈都可能讓對外服務離線;永久重新導向會再放大這個風險,因為瀏覽器與中間設備可能會將其快取起來。
當遷移變成一項工程任務
有些 .htaccess 檔案根本不適合用任何轉換器處理。認證、授權、防盜連、proxy 邏輯、CMS 前端控制器規則,以及由多條 RewriteCond 串成的複雜規則鏈,都深度依賴 Apache 的請求處理模型;在 Nginx 中若要在不對 if 區塊、map 檔與 location 比對做出架構性決定的情況下重現這些行為,是不可能的。若來源中包含上述任何一項,請把這次遷移視為一項工程任務:把每一條規則對應到 Nginx 的請求生命週期模型、手動撰寫對等設定,並在測試環境中驗證。一款會對這類輸入產出「看起來合理」的轉換器,其實比會回傳警告的轉換器更危險,因為失敗的唯一徵兆將是使用者端可見的行為改變。請把轉換器用於初稿盤點,並為它拒絕處理的規則保留處理時間。
想進一步了解,請參閱 Nginx Config Generator API Alternative: No Server Calls。
想進一步了解,請參閱 A Narrow htaccess Generator Alternative for Apache 2.4。