首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現 URL 偽靜態完整指南:Apache Rewrite 規則與實戰技巧

     編輯:PHP 相關知識

PHP 實現 URL 偽靜態完整指南:Apache Rewrite 規則與實戰技巧

URL 偽靜態技術將動態參數 URL(如 index.php?id=18&action=page)轉換為靜態頁面形式(如 page-18.html),兼具 SEO 友好、用戶體驗佳、隱藏技術細節等優勢。本文基於 Apache mod_rewrite 模塊,系統講解從環境檢測到規則編寫的完整實施流程。

第一階段:環境準備與檢測

1. 確認 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。

2. 允許 .htaccess 覆蓋配置

在 httpd.conf 中找到網站根目錄對應的 <Directory> 塊:

<Directory "/var/www/html">
    Options FollowSymLinks
    # 將 None 改為 All
    AllowOverride All
</Directory>

第二階段:.htaccess 規則編寫實戰

創建 .htaccess 文件

Windows 下無法直接創建以點開頭的文件,解決方法:

  • 記事本另存為 → 文件名輸入 .htaccess → 保存類型選「所有文件」
  • 或命令行:copy NUL .htaccess

基礎 Rewrite 規則語法

# 啟用重寫引擎
RewriteEngine On

# 規則格式:RewriteRule 模式 目標 [標誌]
# 模式:正則表達式匹配請求路徑
# 目標:重寫後的實際路徑,支持 $1 $2 等反向引用
# 常用標誌:[L] 最後一條 [NC] 不區分大小寫 [QSA] 追加查詢字符串

實戰案例:動態參數轉靜態 HTML

需求: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 測試腳本 (index.php)

<?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

第三階段:進階配置與虛擬主機整合

多站點虛擬主機配置 (httpd-vhosts.conf)

<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>

本地 Hosts 綁定 (C:\Windows\System32\drivers\etc\hosts)

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]

正則表達式進階技巧

  • 命名捕獲組 (Apache 2.4+):(?P[a-z]+) → ${action}
  • 多參數映射:article-(\d+)-page-(\d+)\.html → article.php?id=$1&page=$2
  • 目錄結構模擬:category/([^/]+)/page-(\d+)\.html → list.php?cat=$1&page=$2

性能優化建議

  1. 將通用規則放在主配置 httpd.conf 而非 .htaccess(避免每次請求讀取文件)
  2. 使用 RewriteMap 處理大量映射關係(需主配置權限)
  3. 啟用緩存:mod_expires 設置靜態資源長期緩存

掌握偽靜態核心在於「正則表達式 + 參數映射 + 異常排除」。建議在測試環境充分驗證規則邏輯後再部署生產,並配合 Google Search Console 監控收錄情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved