URL 偽靜態技術將動態參數 URL(如 index.php?id=18&action=page)轉換為靜態頁面形式(如 page-18.html),兼具 SEO 友好、用戶體驗佳、隱藏技術細節等優勢。本文基於 Apache mod_rewrite 模塊,系統講解從環境檢測到規則編寫的完整實施流程。
創建 phpinfo.php 訪問,查找 Loaded Modules 列表中是否包含 mod_rewrite。
若未啟用,編輯 httpd.conf:
# 找到並取消註釋
LoadModule rewrite_module modules/mod_rewrite.so
# 若無該行,末尾添加
LoadModule rewrite_module modules/mod_rewrite.so
重啟 Apache:systemctl restart httpd 或 service apache2 restart。
在 httpd.conf 中找到網站根目錄對應的 <Directory> 塊:
<Directory "/var/www/html">
Options FollowSymLinks
# 將 None 改為 All
AllowOverride All
</Directory>
Windows 下無法直接創建以點開頭的文件,解決方法:
.htaccess → 保存類型選「所有文件」copy NUL .htaccess# 啟用重寫引擎
RewriteEngine On
# 規則格式:RewriteRule 模式 目標 [標誌]
# 模式:正則表達式匹配請求路徑
# 目標:重寫後的實際路徑,支持 $1 $2 等反向引用
# 常用標誌:[L] 最後一條 [NC] 不區分大小寫 [QSA] 追加查詢字符串
需求:index.php?action=page&id=18 → page-18.html
RewriteEngine On
# 核心規則
RewriteRule ^([a-zA-Z]+)-([0-9]+)\.html$ index.php?action=$1&id=$2 [L,QSA]
# 解析:
# ^([a-zA-Z]+) → $1 匹配 action 值(字母)
# - → 字面連字符
# ([0-9]+) → $2 匹配 id 值(數字)
# \.html$ → 以 .html 結尾
# [L,QSA] → 結束匹配,保留原有查詢參數
<?php
echo 'Action 值:' . htmlspecialchars($_GET['action'] ?? '') . '
';
echo 'ID 值:' . htmlspecialchars($_GET['id'] ?? '') . '
';
// 實際業務中根據參數查詢數據庫、渲染模板
// $article = $db->get("SELECT * FROM articles WHERE slug=? AND id=?", [$action, $id]);
訪問 https://domain/page-18.html 將輸出:
Action 值:page
ID 值:18
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot "D:/wamp/www/project"
ServerName dev.project.local
ServerAlias www.project.local
ErrorLog "logs/project-error.log"
CustomLog "logs/project-access.log" common
# 關鍵:允許目錄覆蓋
<Directory "D:/wamp/www/project">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
127.0.0.1 dev.project.local
127.0.0.1 www.project.local
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 500 Internal Server Error | 規則語法錯誤/循環重定向 | 檢查錯誤日誌,添加 RewriteLogLevel 3 調試 |
| 404 Not Found | 規則未匹配/路徑不對 | 確認 RewriteBase /,檢查正則模式 |
| CSS/JS/圖片失效 | 相對路徑被重寫影響 | 使用絕對路徑 /assets/ 或添加排除規則 |
| 參數丟失 | 未使用 QSA 標誌 | 在規則末尾添加 [QSA] |
# 避免對真實存在的文件/目錄進行重寫
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]+)-([0-9]+)\.html$ index.php?action=$1&id=$2 [L,QSA]
(?P[a-z]+) → ${action}article-(\d+)-page-(\d+)\.html → article.php?id=$1&page=$2category/([^/]+)/page-(\d+)\.html → list.php?cat=$1&page=$2httpd.conf 而非 .htaccess(避免每次請求讀取文件)RewriteMap 處理大量映射關係(需主配置權限)mod_expires 設置靜態資源長期緩存掌握偽靜態核心在於「正則表達式 + 參數映射 + 異常排除」。建議在測試環境充分驗證規則邏輯後再部署生產,並配合 Google Search Console 監控收錄情況。