一個安全的 htaccess 轉 nginx 轉換會產生審查可用的行,這些行符合 Apache 指令中一個範圍狹窄且可稽核的子集,並對所有無法翻譯的內容回傳明確的帶行號警告 — 它永遠不會猜測。htaccess to Nginx Converter 遵循這個契約:貼上一段聚焦於文件根目錄的 .htaccess 摘錄,只接收它明確支援的 RewriteRule 旗標以及三個非 rewrite 對應設定,並在任何設定被合併到 nginx.conf 之前處理每一個警告。輸出會保留在瀏覽器中,不會上傳任何輸入,而且你收到的摘錄並不是一個完整的 server block,將指令放在正確的 Nginx 上下文中、執行 nginx -t 以及測試具代表性的請求,這些步驟仍然由你負責。正是這種克制讓轉換結果可以安全地載入:一條悄悄寫入、看似合理但實際不等價的規則,比一個明確的警告更危險,因為一次失敗的重載或重新導向迴圈可能會讓公開網站離線。請將每一條輸出的行視為需要根據官方 Apache 與 Nginx 說明文件進行驗證的內容,然後再進行備份、驗證與重載。

htaccess to nginx safe
Htaccess to Nginx:讓轉換可安全地重載

將 htaccess 轉換為 nginx 時,「安全」實際上意味著什麼

在這個情境中,安全與巧思恰恰相反。一個自信地重寫它所看到每一行的轉換器 — 包括條件、未知旗標、條件式標頭、Apache 的不替代破折號、巢狀的 <If> 容器與代理邏輯 — 會產生可以編譯但以操作者從未核准的方式改變流量的輸出。風險不在於語法,而在於等價性。Apache 與 Nginx 使用不同的請求處理模型:.htaccess 透過目錄被發現,並且可能被 AllowOverride 停用,而 Nginx 讀取集中式設定,並在 rewrite 處理之前選擇 server 與 location 上下文。即使是完全相同的正規表示式,行為也可能不同,因為被比對的字串、跳脫、查詢字串處理方式以及迴圈行為都有差異。一個安全的轉換器會刻意限制自己的範圍,拒絕翻譯任何意義取決於它無法檢查之上下文的內容,並以原始行號標示該拒絕,以便由人工來處理。定義性的測試很簡單:如果工具針對某條規則完全沒有輸出任何行,它有沒有告訴你為什麼?

轉換契約:支援什麼、不支援什麼

htaccess to Nginx Converter 主張採用一個明確且範圍狹窄的契約,而不是一個通用翻譯器。一個被支援的 RewriteRule 必須包含一個 Apache 樣式、一個替代字串以及一個以方括號括起的旗標清單。自動旗標集刻意限制為 L、R、R=301 與 R=302。一個永久的 Apache 重新導向會變成 Nginx 的 permanent 旗標,臨時重新導向會變成 redirect,而內部的 last 規則會變成 last。文件根目錄 .htaccess 中的樣式通常會比對已移除目錄前綴之後的路徑,所以它們通常以插入符開頭但不帶斜線;Nginx 的 rewrite 樣式看到的是以斜線開頭的 URI,因此轉換器會為支援的根目錄上下文樣式插入那個前置斜線。這是一個有文件記載的範圍假設,而不是針對巢狀 .htaccess 檔案、Alias 對應或 location 特定區塊的通用轉換。

支援三個非 rewrite 對應設定:Options -Indexes 變成 autoindex off,一個本地的 ErrorDocument 404 路徑變成帶有相同路徑的 error_page 404,一個有引號的 X-Robots-Tag Header set 值變成 add_header 行。其他狀態碼、外部錯誤文件、條件式標頭、環境變數、驗證指令以及容器都需要手動遷移。RewriteCond 行永遠不會被自動翻譯,因為它們的變數、擷取、評估順序與部署上下文可能會改變意義;當 RewriteRule 跟在條件之後時,工具也會一併抑制該規則,而不是輸出一個可能改變流量、造成迴圈或暴露路由的非條件式重新導向。由單一破折號代表的 Apache 不替代目標也會被保留不輸出,因為它通常會與改變存取或處理但不變更 URI 的旗標組合使用,而字面上的破折號並不是 Nginx 中安全的替代品。

Apache token預期的 Nginx 輸出工具行為
R=301permanent已輸出
R=302 或 Rredirect已輸出
Llast已輸出
QSA、END、F、G、B、NC—警告,該規則不輸出
RewriteCond + 相依的 RewriteRule—警告,規則被抑制
替代字串 -(破折號目標)—警告,不輸出
Options -Indexesautoindex off;已輸出
ErrorDocument 404 /local-404.htmlerror_page 404 /local-404.html;已輸出
Header set X-Robots-Tag "noindex"add_header X-Robots-Tag "noindex";已輸出

安全地將 htaccess 轉換為 nginx:以審查為先的工作流程

這個操作模型刻意保持簡短。三個步驟涵蓋一段聚焦的摘錄;摘錄以外的所有內容仍由人工處理。

  1. 貼上一段聚焦於文件根目錄的 .htaccess 摘錄。將檔案精簡為你要遷移的 RewriteRule 行、Options -Indexes 行、本地 ErrorDocument 以及有引號的 X-Robots-Tag。請勿貼上驗證、代理、CMS front-controller、防盜連或容器區塊 — 轉換器並非設計來翻譯這些內容,它們屬於手動工作。
  2. 僅轉換明確支援的子集。將摘錄提交到 htaccess to Nginx Converter,並閱讀每一條輸出的行。每一行對應於工具接受的一個指令,文件根目錄的 rewrite 樣式會自動插入前置斜線。註解會被保留。任何有條件、不熟悉或在語法上模糊的內容,都會以其原始行號回報以便手動審查。
  3. 在重載之前進行審查、備份、合併與驗證。針對每一條帶行號的警告,參考 Apache mod_rewrite 介紹以及相關的 Nginx 說明文件手動處理。將每一行審查過的內容放到正確的 server 或 location 區塊中。備份現行的設定、執行 nginx -t、在 staging 環境測試具代表性的請求,然後再重載。

在更動 nginx.conf 之前,先閱讀每一條帶行號的警告

警告清單不是雜訊;它是稽核軌跡。一個警告告訴你,轉換器看到了一個 token,它的 Nginx 對應內容在無法檢查你的伺服器、應用程式、標頭或條件鏈的情況下無法安全地寫出。請將每一個項目視為一個帶有三種可能處理方式的檢查清單:確認該規則在 Nginx 中無關緊要(例如僅限於 Apache 的行為)並予以移除;依據 Apache 與 Nginx 說明文件手動重寫該規則;或者若已有共存計畫,則在 Apache 中保留該規則不變。諸如 QSA、END、F、G、B 與 NC 等未知旗標會停止該規則的轉換,因為無法安全地抹除其細節,而轉換器不會輸出猜測的替代內容。破折號目標會產生警告,因為字面上的破折號不是 Nginx 中安全的替代字串,而原始規則通常會與改變存取或處理但不變更 URI 的旗標組合使用。當 RewriteCond 出現在 RewriteRule 之前時,該規則也會被抑制,因為寫出一個忽略該條件的非條件式重新導向,可能會改變流量、造成重新導向迴圈,或暴露原本該條件所要保護的路由。

分階段、測試並重載 — 部署紀律

輸出是一個摘錄,而不是一個完整的 nginx.conf。它不會建立 http、server 或 location 區塊、不會選擇 listen 連接埠、不會設定 server_name、不會設定 TLS、不會定位文件根目錄、不會保留 PHP 路由、不會轉送代理,也不會定義日誌。請依據官方 Nginx 指令說明文件以及實際的應用程式架構,將每一行審查過的內容放到正確的上下文中。這個工具不會執行 nginx -t、不會檢查已安裝的模組、不會探索 include 順序,也不會存取你的伺服器 — 一行可能在語法上有效,但對其上下文而言卻是錯的。請備份現行的設定、保持一個開啟的復原工作階段、驗證整個組合後的設定,並在重載之前對具代表性的請求進行分階段測試。一次失敗的重載或重新導向迴圈,可能會讓公開網站無法使用。永久重新導向需要特別小心,因為瀏覽器與中介層可能會加以快取;在可行的情況下,請先在受控環境中使用臨時重新導向,待測試過舊路徑、新路徑、查詢字串、替代主機與 HTTPS 行為後,再切換為永久重新導向,並請確認回應的 Location 標頭,而不是只依賴瀏覽器的網址列。

當安全轉換不足時:手動遷移

這個轉換器是支援子集的盤點助理,而不是通用翻譯器。如果來源包含驗證、授權、防盜連、代理邏輯、CMS front-controller 規則、條件式標頭、環境變數或複雜條件,請將此次遷移視為工程工作,而不是批次文字替換。請使用轉換器一次貼上一段聚焦的摘錄,核對轉換後的數量與輸入、解決每一個警告、將結果組合到一個受版本控制的 Nginx 檔案中,並在 staging 上進行驗證。對於超出明確契約的任何內容 — 包括 <If>、<ElseIf>、SetEnvIf、RewriteMap、ProxyPass 對應、AuthType、Require 以及 CMS 專屬的 front controller — 請逐行閱讀 Apache 與 Nginx 手冊,並以可逆的維護時段來規劃切換,而不是一鍵重載。

如需更深入的瞭解,請參閱 Is a Meta Robots Generator Safe? Pre-Use Checks That Matter。

如需更深入的瞭解,請參閱 Nginx Config Generator on Windows: Paths and Testing。