.htaccess 語法檢查工具
貼上 .htaccess 檔案內容,即可立即發現常見錯誤:區塊標籤未閉合、指令名稱拼寫錯誤、RewriteRule 引數不足、以及缺少對應規則的孤立 RewriteCond。
揪出 .htaccess 裡的差錯
.htaccess 是一處錯了一個字便可能讓整站報 500 的檔案。把內容貼進來,本工具便當場揪出那些典型的差錯:未閉合的區塊標籤、拼錯的指令名、參數不足的 RewriteRule、孤零零的 RewriteCond。
此處所查的是語法,而非它是否照您的本意行事。 一條重寫規則縱然寫法無可挑剔,條件的次序若不對,也送不到您心中的那個網址。此外另有兩條規格值得知道。其一,一條 RewriteCond 只作用於緊隨其後的那一條 RewriteRule,故而羅列數條條件、末尾只放一條規則的寫法,壓根行不通。其二,伺服器設定中若把 AllowOverride 關了,.htaccess 便從頭到尾不會被讀。 寫了卻毫無動靜時,該疑的是伺服器設定,而非檔案本身。
使用方法
- 貼入 .htaccess 的內容 把整份檔案照原樣放進去。
- 先試一試範例 正常的例子與含有錯誤的例子都已備好。
- 閱讀被點名的行 未閉合的標籤與不足的參數,都會連同行號一併報出。
-
毫無動靜時也查一查伺服器設定
AllowOverride若被關閉,檔案根本不會被讀。
用好本工具的小技巧
- 本工具是基於逐行規則的啟發式靜態檢查,並非真正的 Apache 解析器。部署前請務必在真實伺服器或預釋出環境中測試。
apachectl configtest(httpd -t)只檢查啟動時讀取的主設定檔;.htaccess是在每次請求時才讀取的,因此不在檢查範圍內。.htaccess的錯誤要在實際存取該目錄時透過錯誤日誌確認。本工具用於在此之前做初步檢查。- "未識別指令"的警告只是基於固定白名單的低置信度推測。如果你使用了較冷門模組的指令,出現該警告也不一定代表寫法有誤。
- 連續書寫多行 RewriteCond 是常見寫法(相當於 AND 條件的疊加)。本工具只會在連續 RewriteCond 的最後一行之後沒有 RewriteRule 時才發出警告。
- 上線到生產環境前,建議分批小幅應用改動並逐步驗證,而不是一次性替換整份檔案。
這些情境會用到
推上生產之前先行確認
.htaccess 的差錯會把整站放倒,故事前一查極為划算。
往重寫規則裡添內容
給既有規則加上條件之後,可看看格式是否還立得住。
讀懂接手來的設定
在一份久經增補的檔案裡,可弄清是否有哪些寫法早已失效。
縮小 500 錯誤的範圍
.htaccess 的語法錯誤不會讓伺服器停止,而是讓該目錄回傳 500。可先判明 500 是否由語法引起。
.htaccess 的術語
- RewriteEngine
- 啟用重寫功能的指令。不把它設為
On,其後的規則便一條也不生效。 - RewriteCond
- 重寫的條件。它只作用於緊隨其後的那一條
RewriteRule,這一點值得記牢。 - RewriteRule
- 重寫規則的本體,取一個模式、一個替換目標,以及
[L,QSA]之類的旗標。 - 旗標
- 規則之後方括號裡的設定。
L意為到此為止,QSA意為把查詢字串一併帶上。 - 區塊標籤
- 如
<IfModule>或<Files>之類的圍合。漏了閉合便會報 500 錯誤。 - AllowOverride
- 伺服器一側的設定,決定
.htaccess可用哪些指令。它被關閉時,該檔案根本不會被讀。
常見問題
AllowOverride None,導致 .htaccess 被完全忽略。請讓伺服器管理員確認已啟用 AllowOverride All(或至少你所需要的具體項,例如 AuthConfig、FileInfo)。同時也請檢查是否存在瀏覽器或 CDN 快取導致看到的是舊內容。RewriteRule 匹配模式 替換目標 [標誌]。匹配模式是一個正規表示式,用於匹配請求的 URL 路徑(不含開頭的斜槓),替換目標可以通過 $1、$2 等引用匹配模式中的括號分組。標誌寫在方括號內並用逗號分隔,例如 [L](停止處理後續規則)或 [R=301](永久重定向)。%{REQUEST_FILENAME} !-f 的 RewriteCond(僅當路徑尚未對應一個已存在的檔案時才生效),這樣目標一旦真實存在,規則就不會再繼續觸發。
閒話 ― 為什麼叫做".htaccess"
".htaccess" 這個名字是"hypertext access"(超文本訪問)的縮寫,其歷史可以追溯到 1995 年前後 NCSA httpd 及早期 Apache 版本。最初它被引入是為了讓目錄的所有者能夠為自己管轄的空間設定密碼保護(Basic 認證),而無需觸碰只有伺服器管理員才能編輯的全域性配置檔案(httpd.conf)。
".htaccess" 之所以強大,是因為只要 Apache 管理員通過 AllowOverride 指令允許,使用者通過 FTP 或檔案管理器上傳檔案後配置即刻生效,無需重啟伺服器。這讓共享主機上通常無法訪問主配置檔案的使用者,也能夠按目錄精細控制重定向、快取策略和訪問限制。
不過這種便利也是有代價的。Apache 官方文件明確建議:只要有許可權訪問伺服器主配置檔案,就應該把指令寫在那裡而不是 .htaccess 中。原因很簡單——Apache 在處理每一次請求時,都要沿著目錄樹向上查詢並重新讀取所有的 .htaccess 檔案,這帶來的效能開銷遠比寫在主配置檔案中要大。
一處細微的語法錯誤也可能造成不小的麻煩:在許多共享主機環境下,無效的 .htaccess 會導致該目錄下所有頁面變成一片空白的"500 Internal Server Error",定位具體原因往往要耗費不少時間。除了仔細通讀程式碼,藉助這類靜態檢查工具也能在上線前提前發現粗心導致的錯誤。