動態網站偽靜態實現主流有兩條技術路線:Apache mod_rewrite (Rewrite) 與 404 錯誤頁面捕獲 (ErrorDocument 404)。兩者原理不同,適用場景各異,本文從資源消耗、參數傳遞、SEO 友好、規則靈活性四個維度深度對比。
| 維度 | mod_rewrite (Rewrite) | 404 ErrorDocument |
|---|---|---|
| 觸發機制 | 請求階段攔截,正則匹配重寫 URI | 文件不存在觸發 404,由錯誤處理器接管 |
| 模組依賴 | 需載入 mod_rewrite | 核心功能,無額外模組 |
| URL 變化 | 內部重寫 (瀏覽器地址欄不變) / 外部重定向 (R=301/302) | 內部處理 (地址欄保持原請求 URL) |
QUERY_STRING 透傳 (QSA 旗標)、POST 數據體保持。RewriteRule ^(.*)$ index.php?$1 [L,QSA] 可獲取 $_GET/$_POST/305.php?name=value 觸發 404 進入處理器時,$_GET['name'] 為空;表單 POST 到 404 生成頁面同樣無法接收數據$_SERVER['REQUEST_URI'] 手動提取參數,但 POST 體需讀取 php://input 且易丟失404 Not Found,搜索引擎判定為死鏈不收錄。必須在處理器開頭輸出:
<?php header("HTTP/1.1 200 OK"); ?> (Apache 1.x/2.0)
<?php header("Status: 200 OK"); ?> (Apache 2.2+ / FastCGI)
不同主機商/Apache 版本需實測調整,否則導致大量頁面不被收錄200 OK,無需額外處理,天然 SEO 友好index.php) 解析 REQUEST_URI 分發,一套代碼覆蓋所有 URL 模式。新增頁面類型只需修改 PHP 路由邏輯,無需修改 Apache 配置RewriteRule。如 /305.html、/305-1.html、/305-2.html 需 3 條規則。規模增長導致 .htaccess/httpd.conf 膨脹、維護困難| 場景特徵 | 推薦方案 | 核心理由 |
|---|---|---|
| 純展示型站點 (文章/產品/列表),無表單交互,URL 模式固定少量 | Rewrite | 配置簡單、標準化、SEO 零成本、運行穩定 |
| 複雜應用 (表單/API/用戶中心/RESTful),參數傳遞必須 | Rewrite | 原生支持 GET/POST、成熟生態、調試工具豐富 |
| 超大流量靜態化門戶,極致性能、URL 模式多變、開發主導路由 | 404 + PHP 路由 | 無模組開銷、單一入口維護、需手動處理 200 OK |
| 遷移舊站、兼容多種歷史 URL 格式、快速上線 | 404 捕獲 + 映射表 | 無需梳理正則、PHP 端統一映射重定向 |
現代框架 (Laravel/Symfony/ThinkPHP/Yii) 均採用 Rewrite 將所有請求路由至單一入口 public/index.php,由框架路由組件解析 REQUEST_URI 分發。結合了 Rewrite 的標準化、參數透傳、SEO 友好與 404 方案的單一入口靈活性。
# Laravel 標準 .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
純 404 方案屬於「歷史巧技」,現代生產環境強烈建議使用 Rewrite + 前端控制器。僅在極端性能敏感、無框架、純靜態化、開發團隊熟悉 404 路由模式的舊專案中考慮保留。