萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 電腦入門

Apache + PHP 實現偽靜態完整教學:mod_rewrite 與 .htaccess 實戰

什麼是偽靜態?

偽靜態 (URL Rewriting) 將動態 URL (如 index.php?action=article&id=123) 重寫為靜態化外觀 (如 article-123.html),優化 SEO、美化網址、隱藏技術細節,且不產生實體靜態檔案。

步驟一:確認/啟用 Apache mod_rewrite 模組

  1. 建立 phpinfo.php:,瀏覽器開啟搜尋 Loaded Modules。
  2. 若列表含 mod_rewrite → 已啟用,跳至步驟二。
  3. 否則編輯 httpd.conf (Apache 安裝目錄 conf/):
    搜尋 LoadModule rewrite_module,移除行首 #。
    若找不到,在 LoadModule 區塊末尾新增:
    LoadModule rewrite_module modules/mod_rewrite.so
  4. 重新啟動 Apache 服務。

步驟二:允許 .htaccess 覆寫設定

編輯 httpd.conf,找到網站根目錄對應的 <Directory> 區塊:

<Directory "C:/Apache24/htdocs">
    Options FollowSymLinks
    AllowOverride All   # 將 None 改為 All
    Require all granted
</Directory>

重新啟動 Apache。

步驟三:建立 .htaccess 檔案

Windows 下無法直接在總管建立以點開頭的檔案,兩種方法:

  1. 記事本 → 另存新檔 → 檔案名稱輸入 .htaccess (含引號) → 儲存類型「所有檔案」 → 存放於網站根目錄。
  2. 命令列:copy nul .htaccess 或 type nul > .htaccess,再用編輯器修改。

步驟四:撰寫 Rewrite 規則 (Regular Expression)

編輯 .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 接收參數範例

<?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)。
  • Nginx 對應:rewrite ^/([a-zA-Z]+)-([0-9]+)\.html$ /index.php?action=$1&id=$2 last; 放在 location / 區塊。

完整 .htaccess 範本 (生產環境就緒)

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 架構。

copyright © 萬盛學電腦網 all rights reserved