偽靜態(URL Rewriting)讓動態網址呈現靜態頁面樣貌,利於 SEO 且易記。本文提供兩組核心函數 MakeUrl()/ParseUrl(),搭配 Apache mod_rewrite 或 PHP 內建 PATH_INFO 即可輕鬆實現。
function MakeUrl($arr) {
$url = [];
foreach ($arr as $key => $value) {
$url[] = $key . "_" . $value;
}
return implode("_", $url) . ".htm";
}
function ParseUrl() {
if (!empty($_SERVER['PATH_INFO'])) {
$pathinfo = substr($_SERVER['PATH_INFO'], 1); // 移除前導 /
$pathinfo = str_replace(".htm", "", $pathinfo);
$path = explode("_", $pathinfo);
for ($i = 0; $i < count($path); $i += 2) {
$_GET[$path[$i]] = $path[$i + 1];
}
}
}
// 產生連結
$base = "https://www.example.com/blog.php/";
$link = $base . MakeUrl(['BlogID' => 2, 'page' => 1]);
// 結果:https://www.example.com/blog.php/BlogID_2_page_1.htm
// 目標頁面開頭呼叫
ParseUrl();
// 之後直接用 $_GET['BlogID'], $_GET['page']
編輯 httpd.conf 加入任一規則並重啟 Apache:
# 偽裝成其他語言
AddType application/x-httpd-php .asp .py .pl .jsp .aspx
# 偽裝成未知類型
AddType application/x-httpd-php .bop .foo .133t .los .abc
# 偽裝成 HTML
AddType application/x-httpd-php .htm .html
將 PHP 檔案改為對應副檔名即可生效。
.htaccess 範例:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^blog/([^/]+)/([^/]+)\.htm$ blog.php?BlogID=$1&page=$2 [L,QSA]
PATH_INFO。ParseUrl() 直接寫入 $_GET,若未驗證參數合法性,可能導致注入或邏輯繞過。if (in_array($path[$i], $allowed_keys)) $_GET[...] = ...偽靜態核心在於「URL 結構化」與「參數還原」。MakeUrl/ParseUrl 適合輕量專案快速上線;中大型專案建議採用框架路由或 mod_rewrite,獲得更彈性、安全、可維護的 URL 管理。