Apache mod_rewrite 是實現 URL 靜態化、路由分發、訪問控制的核心模塊。本文涵蓋模塊啟用、兩種配置載體、核心指令、標誌位、實戰示例。
# httpd.conf LoadModule rewrite_module modules/mod_rewrite.so
| 方式 | 適用場景 | 生效範圍 | 性能 |
|---|---|---|---|
httpd.conf (或 vhost.conf) | 擁有服務器配置權限、生產環境 | 全局/虛擬主機 | ✅ 讀取一次,性能最優 |
.htaccess | 虛擬主機/共享主機、無 httpd.conf 權限 | 目錄及子目錄 | ⚠️ 每請求遍歷讀取,有性能損耗 |
啟用 .htaccess 支持:
# httpd.conf 對應目錄配置 AllowOverride All # 默認 None,必須改為 All
RewriteEngine on # 啟用引擎 RewriteRule Pattern Substitution [Flags] # 核心重寫規則 RewriteCond TestString CondPattern [Flags] # 條件判斷(配合 Rule 使用)
# 示例:/test123.html → /test.php?id=123 RewriteRule ^/test([0-9]*)\.html$ /test.php?id=$1 # ^ 開頭 # test 字面匹配 # ([0-9]*) 捕獲組 $1:純數字 # \.html$ 結尾 # $1 反向引用第一個捕獲組
| Flag | 全稱 | 作用 |
|---|---|---|
| R | Redirect | 強制外部重定向(瀏覽器地址欄變化),默認 302,可 R=301 |
| F | Forbidden | 返回 403 Forbidden |
| G | Gone | 返回 410 Gone |
| P | Proxy | 代理轉發(需 mod_proxy) |
| L | Last | 當前規則為最後一條,停止後續匹配 |
| N | Next | 重新從第一條規則開始匹配(慎用,易死循環) |
| C | Chain | 與下一條規則鏈接,當前匹配失敗則跳過下一條 |
| NC | NoCase | 不區分大小寫匹配 |
| QSA | QueryStringAppend | 追加原查詢字符串(如 ?a=1 保留) |
| NE | NoEscape | 輸出不轉義特殊字符(如 %3D 保持 =) |
# 1. 強制外部重定向並保留查詢參數
RewriteRule ^/new([0-9]*)/$ /new.php?id=$1 [R=301,QSA]
# 2. 簡單靜態化:/in-abc.html → /index.php
RewriteEngine on
RewriteRule ^/in(.*)\.html$ /index.php
# 3. 典型 MVC 入口路由(.htaccess)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
LogLevel alert rewrite:trace3(僅調試環境,極其耗性能)。RewriteLog (Apache 2.2) 記錄匹配過程。curl -v 觀察重定向鏈、Response Header 中的 Location。