U() 是 ThinkPHP 的 URL 組裝助手,根據當前路由配置動態生成 URL,避免硬編碼導致遷移、部署、偽靜態切換時需大量修改模板。
U(string $url, mixed $vars = '', string $suffix = true, bool $redirect = false, string $domain = ''): string // 參數說明 // $url: 'Module/Controller/action' 或 'Controller/action' (單模組) // $vars: 參數,支援陣列或查詢字串 'id=1&status=1' // $suffix: 偽靜態後綴,true 使用配置值,false 無後綴,字串自定義 // $redirect: true 直接 redirect,false 返回字串 // $domain: 指定域名(含協議),如 'https://api.example.com'
// 1. 陣列(推薦,自動 urlencode)
U('Blog/read', ['id' => 1, 'cat' => 'php']);
// 2. 查詢字串
U('Blog/read?id=1&cat=php');
// 3. 直接在 URL 字串(不推薦,需手動編碼)
U('Blog/read/id/1/cat/php'); // 僅 PATHINFO/REWRITE 模式有效
| 模式 | 常數值 | URL 範例 | 特點 | 適用場景 |
|---|---|---|---|---|
| 普通模式 | 0 | ?m=Blog&c=Index&a=read&id=1 | 傳統 GET,相容性最好 | 不支援 PATHINFO 的老舊環境 |
| PATHINFO (預設) | 1 | /index.php/Blog/Index/read/id/1 | SEO 友好、無需 Web Server 配置 | 大多數現代環境 |
| REWRITE | 2 | /Blog/Index/read/id/1 | 隱藏 index.php、最美觀 | 需 Nginx/Apache 重寫規則 |
| 相容模式 | 3 | /index.php?s=/Blog/Index/read/id/1 | 不支援 PATHINFO 但想用類 PATHINFO 風格 | 特殊受限環境 |
// application/config.php 或 config/route.php
'url_model' => 2, // REWRITE 模式
// Nginx 重寫規則
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
// Apache .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
U('Article/detail#comments', ['id' => 10]); // 生成 .../detail/id/10#comments
{* Smarty *}
{$user.name}
{* 原生 PHP *}
| 現象 | 原因 | 解決 |
|---|---|---|
| 生成 URL 缺少 index.php | REWRITE 模式但未配置重寫規則 | 檢查 Nginx/Apache 規則,或改用 PATHINFO 模式 |
| 參數丟失/亂碼 | 手動拼接字串未 urlencode | 統一使用陣列傳參 |
| 模組名大小寫不一致 | Linux 區分大小寫,Windows 不區分 | 統一小寫,配置 url_controller_layer 等 |
| 多語言前綴 | 需在路由配置處理 | 使用路由規則 ':lang/:m/:c/:a' |
U()。link_to_user($id),進一步解耦。U() 是 ThinkPHP 路由解耦的關鍵。理解四種模式的差異、正確配置重寫規則、養成陣列傳參習慣,能讓專案在域名變更、部署遷移、偽靜態切換時「零修改模板」,大幅降低維護成本。