很多開發者認為偽靜態必須依賴 Apache 的 mod_rewrite 模塊,其實通過 PHP 內置的 $_SERVER['REQUEST_URI'] 變量,完全可以在不配置 Web 服務器的情況下實現偽靜態 URL 的解析。這對於虛擬主機、無權限修改 Apache 配置的環境尤為實用。
<?php
// 獲取請求 URI,例如:/xxx.php/param1|1234@param2|4321
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
// 取最後一個 '/' 後的內容:param1|1234@param2|4321
$Php2Html_UrlString = str_replace("/", "", strrchr($Php2Html_FileUrl, "/"));
// 按 '@' 分割多個參數
$Php2Html_UrlQueryStrList = explode("@", $Php2Html_UrlString);
foreach ($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr) {
// 按 '|' 分割鍵值對
$Php2Html_TmpArray = explode("|", $Php2Html_UrlQueryStr);
// 註冊到 $_GET 超全局變量
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
// 後續代碼即可像平常一樣使用 $_GET['param1'] 等
echo "偽靜態:\$_GET 變量<br />";
print_r($_GET);
?>
約定偽靜態 URL 格式為:
****.php/參數1|值1@參數2|值2@參數3|值3...
對應的傳統查詢字符串為:
****.php?參數1=值1&參數2=值2&參數3=值3...
訪問 https://example.com/article.php/id|123@category|tech 後,代碼會自動解析並生成:
$_GET['id'] = '123';
$_GET['category'] = 'tech';
後續業務邏輯完全不用修改,直接使用 $_GET 即可。
| 優點 | 缺點 |
|---|---|
| 無需服務器配置權限 | URL 中包含 .php 後綴,不如 mod_rewrite 純淨 |
| 部署簡單,複製文件即可 | 需在入口文件統一引入解析代碼 |
| 兼容所有支持 PHP 的 Web 服務器 | 參數值包含特殊字符需額外編碼處理 |
url_parser.php),在所有入口文件開頭 require_onceurldecode 處理,支持中文等特殊字符/controller/action/param1/value1/param2/value2這種純 PHP 實現的偽靜態方案,雖然不如 mod_rewrite 完美,但在受限環境下是極佳的替代方案,讓你的應用也能擁有友好的 URL 結構。