將類似 index.php?action=one&do=two 的動態參數轉為 ?index/action/one/do/two 形式,並自動映射到對應模塊文件。
<?php
// 1. 解析 QUERY_STRING
$qs = explode('&', $_SERVER['QUERY_STRING']);
$parts = explode('/', $qs[0]);
// 2. 確定模塊名(首段)
$modul = $parts[0] ? strtolower($parts[0]) : 'index';
// 3. 解析鍵值對(奇數索引為鍵,偶數為值)
$_QUERY = [];
for ($i = 1; $i < count($parts); $i += 2) {
$key = $parts[$i];
$val = isset($parts[$i+1]) ? $parts[$i+1] : '';
$_QUERY[$key] = $val;
$$key = $val; // 同時註冊為變量(可選)
}
// 4. 模塊文件存在性檢查
if (!file_exists("modul_directory/{$modul}.php")) {
$modul = 'index';
}
// 5. 載入佈局與模塊
include('template.php'); // 頭部/側邊欄
include("modul_directory/{$modul}.php"); // 業務邏輯
include('footer.php'); // 底部
?>
| URL | 效果 |
|---|---|
www.example.com/?forum/topic/20 | 載入 forum.php,$_QUERY['topic']=20 |
www.foo.com/?voting/id/54/type/piechart&choice=2 | 載入 voting.php,$_QUERY['id']=54, $_QUERY['type']='piechart',$_GET['choice']=2 保留 |
mod_rewrite / Nginx rewrite 將 /forum/topic/20 內部轉發至 /?forum/topic/20,對用戶完全隱藏 ? 符號。$modul 嚴格白名單校驗,防止目錄遍歷攻擊(../)。中小型項目、快速原型、不想引入完整框架但需要友好 URL 的場景。大型系統建議直接採用 Laravel、Symfony、ThinkPHP 等成熟框架的路由組件。