偽靜態 是指通過 Web 服務器的 URL 重寫模塊,將動態頁面的 URL(如 article.php?id=123)偽裝成靜態頁面風格的 URL(如 /article/123.html)。實際上頁面內容仍由腳本動態生成,但 URL 更符合 SEO 習慣、用戶體驗更友好、且隱藏了技術實現細節。
Web 服務器(Apache mod_rewrite / Nginx ngx_http_rewrite_module)根據預定義規則,在請求進入應用層前,將外部可見的「靜態風格 URL」內部重寫為「動態腳本 URL + 參數」,應用層感知不到重寫過程,按原邏輯處理請求並返回內容。
# httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
推薦寫在虛擬主機配置(性能更好),僅在無虛擬主機權限時使用 .htaccess。
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 開啟重寫引擎
RewriteEngine On
# 排除真實存在的文件/目錄(圖片、CSS、JS 等直接訪問)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 核心規則:所有請求轉發給 index.php 統一路由(前端控制器模式)
RewriteRule ^(.*)$ index.php [QSA,L]
</VirtualHost>
常用規則示例:
RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L] — 文章詳情頁RewriteRule ^category/([a-z0-9_-]+)/?$ category.php?slug=$1 [L] — 分類頁RewriteRule ^tag/([^/]+)/page/([0-9]+)/?$ tag.php?slug=$1&page=$2 [L] — 標籤分頁Nginx 無 .htaccess 機制,所有規則寫在 server 塊中,語法更簡潔、性能更高。
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
# 核心:前端控制器模式,非文件/目錄請求轉發給 index.php
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 處理
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
}
# 靜態資源緩存
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
# 文章詳情:/article/123.html → /article.php?id=123
rewrite ^/article/([0-9]+)\.html$ /article.php?id=$1 last;
# 分類頁:/category/tech → /category.php?slug=tech
rewrite ^/category/([a-z0-9_-]+)/?$ /category.php?slug=$1 last;
# 強制 HTTPS
if ($scheme = http) {
return 301 https://$host$request_uri;
}
| 優勢 | 說明 |
|---|---|
| SEO 友好 | 關鍵詞可出現在 URL 中,利於搜索引擎理解頁面主題 |
| 用戶體驗 | 語義化 URL 易讀、易記、易分享 |
| 安全性 | 隱藏腳本擴展名、參數結構,降低注入攻擊面 |
| 遷移靈活 | 更換後端技術棧(PHP→Python→Node)時 URL 可保持不變 |
| 注意事項 | 說明 |
|---|---|
| 規則衝突 | 優先匹配具體規則,最後兜底前端控制器規則 |
| 性能影響 | 正則過多或過於複雜會增加 CPU 開銷,Nginx 比 Apache 更優 |
| 重複內容 | 同一頁面若有動態/靜態兩種 URL,需 canonical 標簽或 301 統一 |
| 調試困難 | 開啟 rewrite log(Apache)或 error_log debug(Nginx)排查 |
index.php 分發,路由邏輯集中在應用層框架(Laravel、ThinkPHP、WordPress 均採用此模式)curl -I 檢查狀態碼,apachectl -t / nginx -t 語法檢查偽靜態是現代 Web 開發的標配技能,掌握其原理與配置,能讓你的項目在 SEO、安全、維護性上贏在起跑線。