ThinkPHP 3.1/3.2 開啟 URL 路由後,分頁類生成的連結為原始參數模式(/page/2),而非路由規則定義的偽靜態格式(/list-2.html),導致分頁連結失效。
分頁類內部呼叫 U() 函數組裝 URL,但 U() 未處理路由規則反向解析,直接拼接參數。
U() 函數編輯 ThinkPHP/Common/functions.php,找到 U() 函數(約第 287 行),在參數組裝邏輯後加入路由反向解析:
function U($url = '', $vars = '', $suffix = true, $domain = false) {
// ... 原有程式碼 ...
if (!empty($vars)) {
foreach ($vars as $var => $val) {
if ('' !== trim($val)) {
$url .= $depr . $var . $depr . urlencode($val);
}
}
}
// ========== 新增:路由反向解析 ==========
if (C('URL_ROUTER_ON')) {
$routeRules = C('URL_ROUTE_RULES');
if (!empty($routeRules)) {
$currentUrl = '/' . GROUP_NAME . $url;
foreach ($routeRules as $pattern => $rule) {
// 檢查當前 URL 是否符合路由規則
if (strpos($currentUrl, $rule) !== false) {
// 提取規則中的動態參數
if (preg_match('/\/:(\w+)/', $pattern, $matches)) {
$paramName = $matches[1];
// 替換為路由模式
if (C('APP_SUB_DOMAIN_DEPLOY')) {
$url = str_replace($rule, $pattern, '/' . GROUP_NAME . $url);
} else {
$url = str_replace($rule, $pattern, $url);
}
// 移除參數部分(已包含在路由模式中)
$url = preg_replace('/' . $paramName . '\/[^\/]+/', '', $url);
} else {
// 靜態路由規則
if (C('APP_SUB_DOMAIN_DEPLOY')) {
$url = str_replace($rule, $pattern, '/' . GROUP_NAME . $url);
} else {
$url = str_replace($rule, $pattern, $url);
}
}
break; // 只匹配第一條符合規則
}
}
}
}
// ========== 結束新增 ==========
return $url;
}
// config/route.php
return [
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES' => [
'article/:id' => 'Article/read',
'list/:page' => 'Index/list',
'category/:name' => 'Category/index',
],
];
確保分頁類傳遞參數格式與路由規則一致:
$page = new \Think\Page($count, $listRows);
$page->parameter = 'category=php'; // 傳遞額外參數
$page->setConfig('next', '下一頁');
$page->setConfig('prev', '上一頁');
$page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
echo $page->show();
| 路由規則 | 修正前 URL | 修正後 URL |
|---|---|---|
list/:page | /Index/list/page/2 | /list-2.html |
article/:id | /Article/read/id/123 | /article-123.html |
category/:name | /Category/index/name/php | /category-php.html |
functions.php 至 Common/functions.php 覆蓋class CustomPage extends \Think\Page
{
public function show() {
$url = U($this->url, array_merge($this->parameter, ['page' => '__PAGE__']));
// 替換 __PAGE__ 佔位符...
return parent::show();
}
}