ThinkPHP 提供靈活的 URL 模式配置,支援從傳統查詢字串到偽靜態的多種訪問方式。本文系統整理 PATHINFO 模式原理、四種 URL_MODEL 設定值對照、Apache/Nginx 重寫規則配置,助你根據專案需求選擇最適合的 URL 架構。
PATHINFO 利用 Web 伺服器特性,將 index.php 後的路徑資訊傳遞給 PHP 解析:
# 普通模式 https://localhost/index.php?m=Index&a=test # PATHINFO 模式(等效) https://localhost/index.php/Index/test # 解析邏輯:$_SERVER['PATH_INFO'] = '/Index/test' # ThinkPHP 自動解析為 模組=Index, 操作=test
| 值 | 模式名稱 | URL 格式範例 | 特點 | 適用場景 |
|---|---|---|---|---|
| 0 | 普通模式 | index.php?m=User&a=login | 傳統查詢字串,相容性最好 | 不支援 PATHINFO 的舊環境 |
| 1 | PATHINFO 模式 | index.php/User/login | 預設推薦,結構清晰,利於 SEO | 大多數生產環境 |
| 2 | REWRITE 模式 (偽靜態) | /User/login | 隱藏 index.php,最美觀,需伺服器配置重寫 | 正式上線、SEO 重視專案 |
| 3 | 相容模式 | index.php?s=User/login | 不支援 PATHINFO 但想用 PATHINFO 寫法時的替代方案 | 特殊受限環境 |
httpd.conf 載入重寫模組:LoadModule rewrite_module modules/mod_rewrite.soAllowOverride None 改為 AllowOverride Allconfig.php:'URL_MODEL' => 2.htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
}
}
'URL_HTML_SUFFIX' => 'html', // 產生 /User/login.html // 或支援多種 'URL_HTML_SUFFIX' => 'html|xml|json',
// 配置路由
'URL_ROUTE_RULES' => array(
'user/:id\d' => 'User/profile', // /user/123 -> User/profile/id/123
'/^blog\/(\d+)/' => 'Blog/detail?id=:1',
),
| 專案階段 | 推薦模式 | 理由 |
|---|---|---|
| 本地開發 | 1 (PATHINFO) | 零配置、除錯方便、參數可見 |
| 測試/Staging | 2 (REWRITE) | 驗證重寫規則、測試 SEO 效果 |
| 正式上線 | 2 (REWRITE) + HTML 後綴 | 最佳 SEO、使用者體驗、安全隱藏入口 |
| 特殊受限主機 | 3 (相容) | 不支援 PATHINFO 的虛擬主機 |
mod_rewrite 是否載入、AllowOverride All、.htaccess 路徑與語法。$_GET 仍正常運作,ThinkPHP 內部已解析 PATH_INFO。RewriteBase /subdir/。URL 模式選擇是專案架構的早期關鍵決策。建議開發期使用模式 1 快速迭代,上線前切換模式 2 並驗證所有連結正常,同時配置 HTML 後綴與路由規則打造專業級 URL 架構。