偽靜態 (URL Rewriting) 將動態 URL (如 index.php?action=article&id=123) 重寫為靜態化外觀 (如 article-123.html),優化 SEO、美化網址、隱藏技術細節,且不產生實體靜態檔案。
phpinfo.php:,瀏覽器開啟搜尋 Loaded Modules。mod_rewrite → 已啟用,跳至步驟二。httpd.conf (Apache 安裝目錄 conf/):LoadModule rewrite_module,移除行首 #。LoadModule 區塊末尾新增:LoadModule rewrite_module modules/mod_rewrite.so
編輯 httpd.conf,找到網站根目錄對應的 <Directory> 區塊:
<Directory "C:/Apache24/htdocs">
Options FollowSymLinks
AllowOverride All # 將 None 改為 All
Require all granted
</Directory>
重新啟動 Apache。
Windows 下無法直接在總管建立以點開頭的檔案,兩種方法:
.htaccess (含引號) → 儲存類型「所有檔案」 → 存放於網站根目錄。copy nul .htaccess 或 type nul > .htaccess,再用編輯器修改。編輯 .htaccess:
RewriteEngine On # 規則 1: 純數字 ID → index.php?id=數字 RewriteRule ^([0-9]+)$ index.php?id=$1 [L,QSA] # 規則 2: 動作-ID.html → index.php?action=動作&id=ID RewriteRule ^([a-zA-Z]+)-([0-9]+)\.html$ index.php?action=$1&id=$2 [L,QSA] # 規則 3: 多層級目錄模擬 /category/article-123.html RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)-([0-9]+)\.html$ index.php?cat=$1&action=$2&id=$3 [L,QSA]
[L] (Last):匹配即停止後續規則處理。[QSA] (Query String Append):保留原查詢字串 (如 ?page=2) 合併到新 URL。[NC] (No Case):大小寫不敏感。[R=301]:外部重導向 (瀏覽器網址列改變),偽靜態通常**不加**此旗標 (內部重寫)。<?php // index.php $action = isset($_GET['action']) ? $_GET['action'] : 'home'; $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; $cat = isset($_GET['cat']) ? $_GET['cat'] : ''; echo "Action: $action
"; echo "ID: $id
"; echo "Category: $cat
"; // 實際應用:根據 $action 路由至對應控制器/模板 switch ($action) { case 'article': include 'views/article.php'; break; case 'product': include 'views/product.php'; break; default: include 'views/home.php'; } ?>
[L]。RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
直接放行實體存在的檔案/目錄 (CSS/JS/圖片/字型)。httpd.conf <VirtualHost> 區塊,避免每次請求讀取 .htaccess。RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3 (Apache 2.4 用 LogLevel alert rewrite:trace3)。rewrite ^/([a-zA-Z]+)-([0-9]+)\.html$ /index.php?action=$1&id=$2 last; 放在 location / 區塊。RewriteEngine On
# 安全:隱藏版本資訊
ServerSignature Off
# 排除實體檔案/目錄
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# 核心偽靜態規則
RewriteRule ^([a-zA-Z0-9_-]+)-([0-9]+)\.html$ index.php?action=$1&id=$2 [L,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)-([0-9]+)\.html$ index.php?cat=$1&action=$2&id=$3 [L,QSA]
# 預設導向首頁 (可選)
# RewriteRule ^$ index.php [L]
掌握 mod_rewrite 正則與旗標邏輯,即可輕鬆實現彈性、SEO 友善的 URL 架構。