|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、问题缘起
在完成帖子页 canonical 优化和全站版块 SEO 标题、关键词、描述设置后,站长在 Bing Webmaster Tools 中发现以下 SEO 警告仍然存在:
| 问题 | 涉及页面 | 错误数量 | | Too many pages with identical meta descriptions | 版块列表页分页、分类筛选页 | 12.8K | | 首页与 /forum.php 重复 | / 和 /forum.php | 少量 |
根本原因:
- 版块列表页第2页及之后的 description 与第1页完全相同
- 不同分类筛选页(typeid)使用相同的版块级 description
- / 和 /forum.php 返回相同内容但无 canonical 合并
二、解决方案
2.1 版块列表页 Canonical(仅第1页输出)
文件:/source/module/forum/forum_forumdisplay.php
位置:get_seosetting 函数调用之后,$rsshead 定义之前
新增代码:
- // 版块列表页 canonical:仅第1页输出,其他分页不输出
- if($_G['page'] == 1) {
- if(is_array($_G['setting']['rewritestatus']) && in_array('forum_forumdisplay', $_G['setting']['rewritestatus'])) {
- $canonical_url = rewriteoutput('forum_forumdisplay', 1, '', $_G['fid'], 1, '', '');
- } else {
- $canonical_url = 'forum.php?mod=forumdisplay&fid='.$_G['fid'];
- }
- $_G['setting']['seohead'] .= '<link href="'.$_G['siteurl'].$canonical_url.'" rel="canonical" />'."\n";
- }
复制代码
2.2 版块列表页 Description 防重复
分页页码标识(同一文件中):
- // 第2页及之后,在 description 前加上页码标识,避免与第1页重复
- if($_G['page'] > 1) {
- $metadescription = '第'.$_G['page'].'页 - '.$metadescription;
- }
复制代码
分类筛选前缀(同一文件中):
- // 如果存在 typeid(分类筛选),将分类名称添加到描述开头
- $typeid = !empty($_GET['typeid']) ? intval($_GET['typeid']) : 0;
- if($typeid && !empty($_G['forum']['threadtypes']['types'][$typeid])) {
- $type_name = $_G['forum']['threadtypes']['types'][$typeid];
- if(!empty($metadescription)) {
- $metadescription = $type_name . ' - ' . $metadescription;
- }
- }
复制代码
2.3 论坛首页 Canonical
文件:/source/module/forum/forum_index.php
位置:文件开头,require_once 之前
新增代码:
- // 论坛首页 canonical:将 /forum.php 的权重合并到 /
- if(empty($_GET)) {
- $_G['setting']['seohead'] .= '<link href="https://www.dianbo.org/" rel="canonical" />'."\n";
- }
复制代码
三、效果汇总
| 页面类型 | Canonical 策略 | Description 格式 | | 版块第1页 | 输出,指向自身 | 版块描述 | | 版块第2页及之后 | 不输出 | 第X页 - 版块描述 | | 分类筛选页(typeid) | 不输出(依赖版块 canonical) | 分类名 - 版块描述 | | 论坛首页 /forum.php | 输出,指向 / | 正常 | | 论坛根域名 / | 无 canonical | 正常 | | 帖子页(已完成) | 仅第1页输出 | 第2页+加页码 |
执行顺序(以版块列表页为例):
- 基础描述(后台设置)
- ↓
- 添加分类前缀(如有 typeid)
- ↓
- 添加页码标识(如 page > 1)
- ↓
- 输出到 `$_G['setting']['seohead']`
- ↓
- `header_common.htm` 自动输出到 `<head>`
复制代码
四、关键踩坑记录
| 问题 | 原因 | 解决方案 | | 代码修改后页面无变化 | 浏览器缓存(缓存的图像和文件) | Ctrl+Shift+Delete → 清除“缓存的图像和文件” | | 首页 canonical 不生效 | /forum.php 由 forum_index.php 处理,不是 forum_forumdisplay.php | 确认正确的文件后再添加代码 | | 出现重复 canonical 标签 | header_common.htm 和 forum_index.php 同时添加 | 只保留一处(推荐 forum_index.php) |
重要提醒:Discuz! 后台“缓存更新”只能清除论坛自身的缓存,无法清除浏览器缓存。修改代码后页面无变化,首先确认不是浏览器缓存问题。
五、验证方法
| 测试 URL | 预期结果 | | https://www.dianbo.org/forum.php | 源代码中存在 <link href="https://www.dianbo.org/" rel="canonical" /> | | https://www.dianbo.org/forum-48-1.html | 存在 canonical 指向自身 | | https://www.dianbo.org/forum-48-2.html | 无 canonical,description 以“第2页 - ”开头 | | https://www.dianbo.org/forum.php?mod=forumdisplay&fid=48&typeid=46 | description 以“欧美电影 - ”开头 |
六、技术沉淀
- 分页 Canonical 策略:仅第1页输出 canonical 指向自身,后续页不输出。既避免重复内容,又保留分页被收录的可能。
- Description 防重复:通过动态添加“第X页 - ”和“分类名 - ”前缀,确保每个页面的 description 唯一。
- SEO 逻辑集中:所有 canonical 和 description 生成逻辑应在各模块的 PHP 文件中处理(forum_index.php、forum_forumdisplay.php、forum_viewthread.php),通过 $_G['setting']['seohead'] 输出,保持架构一致。
- 代码修改验证流程:
- 修改 PHP/模板文件
- 清理论坛缓存(后台 → 缓存更新)
- 重启 PHP 服务(可选,清空 OPcache)
- 清除浏览器缓存(缓存的图像和文件) ← 最易忽略
- 强制刷新(Ctrl+Shift+R)查看源代码
日志时间:2026-05-20
关联分支:env-base
下一步:观察 Bing SEO 报告中相关警告数量下降情况(预计 2-4 周) |
|