一、获取来路网址 使用 `HTTP_REFERER` 服务器变量 1. 在 Discuz! 的全局初始化文件中(如 `source/class/class_core.php` 之后的逻辑),通过 `$_SERVER['HTTP_REFERER']` 获取来路网址。 2. 过滤无效值: ```php $referer = isset($_SERVER['HTTP_REFERER']) ? dhtmlspecialchars($_SERVER['HTTP_REFERER']) : ''; if ($referer && strpos($referer, $_G['siteurl']) === false) { // 非站内跳转时记录 update_referer_history($referer); } ``` 二、存储最近三条记录 方案A:使用数据库存储 1. **新建数据表** (SQL示例): ```sql CREATE TABLE pre_referer_history ( id INT PRIMARY KEY AUTO_INCREMENT, referer_url VARCHAR(512) NOT NULL, visit_time INT NOT NULL ) ENGINE=MyISAM; ``` 2. 更新记录的PHP函数: ```php function update_referer_history($referer) { global $_G; C::t('referer_history')->insert(array( 'referer_url' => $referer, 'visit_time' => TIMESTAMP )); // 只保留最新3条,删除旧的 C::t('referer_history')->delete_old(3); } ``` 在表类中实现 `delete_old` 方法: ```php class C::t('referer_history') extends discuz_table { public function delete_old($keep) { $ids = DB::fetch_all("SELECT id FROM ".DB::table('referer_history')." ORDER BY id DESC LIMIT $keep,1"); if ($ids) { DB::delete('referer_history', "id $referer, 'time' => TIMESTAMP)); $history = array_slice($history, -3, 3); // 保留最后3条 memory('set', 'referer_history', $history); } 三、在页面中显示 1. 获取数据 - **数据库查询**: ```php $referer_list = C::t('referer_history')->fetch_all(3); ``` - **缓存读取**: ```php $referer_list = memory('get', 'referer_history'); ``` 2. 模板中输出 在 `template/default/forum/discuz.htm` 适当位置添加: ```html 最近来路: [url=]{$ref['url']}[/url] ``` 四、完整插件化步骤(推荐) 1. 创建插件目录:`source/plugin/refererhistory/`。 2. 编写插件主文件 `plugin.xml`**: ```xml 来路网址记录 1.0 显示最近三个来路网址 update_referer_history(); 3. 在插件中实现逻辑这个有点难了 通过上述步骤,你的 Discuz! 论坛将能够在页脚或侧边栏动态显示最近三个外部来路网址。