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

Apache 環境下 PHP 偽靜態配置:.htaccess 與 mod_rewrite 完整指南

     編輯:PHP 綜合知識

Apache 的 `mod_rewrite` 模組配合 `.htaccess` 是 PHP 專案實現 URL 靜態化的標準方案。本文涵蓋模組啟用、.htaccess 建立、重寫規則撰寫與常見範例。

1. 啟用 mod_rewrite

  1. 檢查已載入模組:`phpinfo()` 搜尋 Loaded Modules 是否含 mod_rewrite;
  2. 未啟用則編輯 `httpd.conf`:
    • 搜尋 `LoadModule rewrite_module`,移除前方 `#`;
    • 或在 `LoadModule` 區塊新增:`LoadModule rewrite_module modules/mod_rewrite.so`;
  3. 重啟 Apache:`service apache2 restart` 或 `apachectl restart`。

2. 允許 .htaccess 覆蓋

編輯 `httpd.conf`,找到網站目錄對應的 `` 區塊:

Options FollowSymLinks
AllowOverride All  # 原為 None,改為 All

重啟 Apache 生效。

3. 建立 .htaccess 檔案

Windows 下無法直接建立無檔名檔案,三種方法:

  1. 記事本「另存為」,檔名輸入 .htaccess(含引號);
  2. CMD:`rename htaccess.txt .htaccess`;
  3. FTP 用戶端重命名。

4. 重寫規則基礎

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index.html$ index.php
RewriteRule ^new-(\d+).html$ newxx.php?uid=$1
</IfModule>

指令說明

  • RewriteEngine On:啟用重寫引擎;
  • RewriteRule:模式 → 目標,支援正則、捕獲組 `$1` `$2`...;
  • ^ 開頭、`$` 結尾、`\d+` 一個以上數字、`(.*)` 任意字元;
  • [L] 最後一條、`[R=301]` 外部重導向、`[NC]` 忽略大小寫、`[QSA]` 附加查詢字串。

5. 實戰常見規則

<IfModule mod_rewrite.c>
RewriteEngine On

# 靜態首頁
RewriteRule ^index\.html$ index.php [L]

# 文章詳情
RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L]

# 分類列表分頁
RewriteRule ^category/([a-z0-9-]+)/page/([0-9]+)/?$ category.php?slug=$1&page=$2 [L]

# 移除 .php 副檔名
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

# 強制 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 強制 www
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

# 防盜鏈
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ /nohotlink.jpg [R=301,L]
</IfModule>

6. 除錯技巧

  • 開啟重寫日誌(Apache 2.4+):`LogLevel alert rewrite:trace3`,查看 `error_log`;
  • 測試規則:`RewriteRule ^test$ /test.php?matched=1 [L]` 訪問 `/test` 觀察;
  • 注意規則順序:越具體越前,通用規則放後;
  • 避免無限循環:配合 ``、`RewriteCond` 檢查檔案是否存在 (`-f`、`-d`)。

`.htaccess` 雖方便但每請求都會讀取,高流量站建議將規則寫入 `httpd.conf` / `vhost.conf` 並設 `AllowOverride None` 提升效能。

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