活力39282
在线时间13640 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 107434
- 主题
- 5630
- 回帖
- 26661
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-2
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1、问题缘起
站长在优化论坛 SEO 过程中,发现两个管理类版块(管理员专区、不规范帖仓库)不应被搜索引擎索引。此前已通过修改模板文件 header_common.htm 为全站添加了分页标题优化,但需要针对特定版块单独设置 noindex 指令。
探讨过程中提出的独立问题汇总:
| 序号 | 问题 | 结论 | | 1 | 如何针对单个版块设置 noindex? | 三种方案:robots.txt、模板判断、程序文件判断 | | 2 | 选择了方案三(修改程序文件),需要修改哪些文件? | forum_viewthread.php(帖子页)+ forum_forumdisplay.php(列表页) | | 3 | forum_viewthread.php 修改成功,但 forum_forumdisplay.php 找不到插入位置? | 在 $rsshead = ... 代码行之后插入 | | 4 | 设置了 noindex 的版块,发帖时是否还会通过 IndexNow 推送? | 会! post_newthread.php 中存在独立的瞬间推送代码,无版块判断 | | 5 | 这会造成什么后果? | 对同一 URL 同时发送“请索引”和“不要索引”的矛盾信号,可能导致搜索引擎信任度下降 |
2、解决方案
(1)简要技术分析
核心原理:在帖子发布流程中,通过判断当前版块 ID 是否在排除列表中,决定是否执行 IndexNow 推送;同时在页面输出层通过 meta robots 标签告知搜索引擎不要索引特定版块。
(2)修改、新增文件列表
| 文件路径 | 修改内容 | 作用 | | /source/module/forum/forum_viewthread.php | 添加 noindex 判断代码 | 帖子内容页禁止索引 | | /source/module/forum/forum_forumdisplay.php | 添加 noindex 判断代码 | 版块列表页禁止索引 | | /source/include/post/post_newthread.php | 添加版块过滤逻辑 | 排除特定版块的 IndexNow 推送 |
(3)关键作用代码段全文
文件1:forum_viewthread.php(约第 114-117 行)
- // 禁止特定版块被索引 - 点拨论坛
- $noindex_fids = array(71, 73); // 管理员专区、不规范帖仓库的 fid
- if (in_array($_G['fid'], $noindex_fids)) {
- $_G['setting']['seohead'] .= '<meta name="robots" content="noindex, nofollow">'."\n";
- }
复制代码
文件2:forum_forumdisplay.php(在 $rsshead = ... 之后插入)
- // 禁止特定版块被索引 - 点拨论坛
- $noindex_fids = array(71, 73); // 管理员专区、不规范帖仓库的 fid
- if (in_array($_G['fid'], $noindex_fids)) {
- $_G['setting']['seohead'] .= '<meta name="robots" content="noindex, nofollow">'."\n";
- }
复制代码
文件3:post_newthread.php(约第 233-258 行,原 IndexNow 推送代码处)
- // ========= IndexNow 推送 =========
- // 需要排除的版块 ID(不推送 IndexNow)
- $excluded_fids = array(71, 73); // 管理员专区、不规范帖仓库的 fid
- // 只有不在排除列表中的版块才推送
- if (!in_array($_G['fid'], $excluded_fids)) {
- $api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
- $host = 'https://www.dianbo.org';
- $url = 'https://www.dianbo.org/thread-' . ($tid ?: $_G['tid']) . '-1-1.html';
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, 'https://api.indexnow.org/IndexNow');
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
- 'host' => $host,
- 'key' => $api_key,
- 'keyLocation' => "{$host}/{$api_key}.txt",
- 'urlList' => [$url]
- ]));
- $response = curl_exec($ch);
- $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- curl_close($ch);
- // 记录日志
- file_put_contents(DISCUZ_ROOT . './data/log/indexnow.log', date('Y-m-d H:i:s') . " HTTP:{$http_code} {$url}\n", FILE_APPEND);
- }
- // ========= IndexNow 推送结束 =========
复制代码
3、最终实现效果
| 版块 | noindex 指令 | IndexNow 推送 | 状态 | | 管理员专区 (fid=71) | ✅ 生效 | ❌ 已屏蔽 | 完全隔离 | | 不规范帖仓库 (fid=73) | ✅ 生效 | ❌ 已屏蔽 | 完全隔离 | | 其他所有版块 | ❌ 无 | ✅ 正常推送 | 不受影响 |
验证方法:访问被屏蔽版块的任意页面,查看源代码,应在 <head> 区域看到:
- <meta name="robots" content="noindex, nofollow">
复制代码
4、重要技术沉淀
踩坑点:
| 问题 | 教训 | | IndexNow 推送与 noindex 冲突 | 只设置页面 noindex 不够,还要从推送源头屏蔽。两处都要改,缺一不可 | | 双推送机制 | 论坛中存在 sitemap 全量推送 + 发帖瞬间推送 两套机制,需同时排查 | | 代码位置难找 | forum_forumdisplay.php 中的插入位置在 $rsshead = ... 之后,而非 SEO 变量定义处 |
需要更新到固化摘要的内容:
- 记录被屏蔽的版块 ID(管理员专区、不规范帖仓库)
- 记录三处修改的文件路径,供后续 Discuz! 升级时参考
5、进一步优化的可能性
| 构想 | 说明 | 优先级 | | sitemap 同步屏蔽 | 在 sitemap 生成插件中同样排除 fid 71、73,从源头杜绝 URL 出现在 sitemap.xml 中 | ⭐⭐⭐ 推荐 | | 统一排除列表 | 将排除版块 ID 定义为全局常量,避免三处代码各自维护 | ⭐⭐ 可选 | | 后台可视化配置 | 开发插件,在后台直接勾选需要屏蔽的版块,无需修改代码 | ⭐ 远期 |
维护日志编号:LOG-20260515-001
影响范围:管理员专区、不规范帖仓库
回滚方案:删除三处文件中添加的代码块即可恢复 |
|