fn_b/docs/maintenance/SEO_PLAN.md

735 lines
79 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FNA_V3 SEO 优化建议与执行清单
评估日期:2026-10-22,Asia/Shanghai。状态:**分析与建议文档已完成;SEO-001 的部署定位已由用户确认,配置改造尚未实施;SEO-020 于2026-10-27完成本地教程正文更新,设备实测及生产验收未做,D02首页最新免费节点全文展示于2026-10-27本地完成,其余项目尚未实施**。本文件是后续 SEO 工作的唯一执行清单;按 `SEO-001` 至 `SEO-036` 跟踪,实施后在本文件更新结果,不另建重复的“最新版计划”。
本轮依据当前代码、当前本地数据库、重新取得的 HTTP 响应及受限浏览器检查形成结论。网站源码、样式和业务数据未作修改。当前三款 DPL 广告属于已存在的实现,纳入分析基准并保留。网站仍在独立本地副本中开发;用户随后确认未来替换现有 cfn,并支持同一套代码部署多个同类站点,ClashFreeNode 为主力站,尚未实际部署或迁移。
**最优先的工作是让有价值的内容拥有唯一、稳定、可发现的地址,并让页面真实兑现搜索结果中的承诺。** 当前主要问题集中于重复 URL、分页发现路径、内容生命周期和资源质量;仅增加标题、关键词或结构化数据不能解决这些问题。现有 Laravel Blade 已能在首次 HTML 响应中输出文章正文,没有证据表明必须改用另一套框架或全面重写网站。
## 1 如何阅读和执行
- 先看第 2 节的结论与证据,再确定第 3 节的产品决策。
- 第 4 节定义目标 URL 和索引规则;这是实现之间保持一致的依据。
- 第 5 节是总清单,第 6 节给出每一项的具体范围和验收条件。
- 第 7 节规定实施批次,第 8 节是验收矩阵,第 9 节规定发布后的效果观察方法。
- 每项实现都要记录:实际改动、代码验证、本地页面验证、是否发布、线上验证范围。不能把“代码完成”写成“Google 已收录”。
优先级含义:
| 级别 | 含义 |
| --- | --- |
| P0 | 基础规则冲突,或公开发布前必须解决的风险。标注“发布前”的项目不意味着本地正在发生线上事故 |
| P1 | 影响主题识别、内容价值、内链、索引一致性或长期维护的主要优化 |
| P2 | 在基础和内容就绪后改善展示、体验、效率及分发 |
证据等级:**已确认**指本轮代码、数据或响应直接支持;**条件性风险**指相关代码存在,但触发条件或生产影响未确认;**策略建议**指需要结合业务取舍决定;**待线上验证**指必须有实际生产环境或搜索平台数据才能判断。
本报告以 Google 的技术要求为主要参照;通用的 URL、HTTP、内容与内链原则也有助于其他搜索引擎。Bing、百度等渠道的具体投入,应由目标用户和后续数据决定,不能假定它们完全采用相同的收录规则。
## 2 当前状态和核心判断
### 2.1 检查范围
| 项目 | 本轮范围与结果 |
| --- | --- |
| 代码 | 当前工作目录 `/Users/hellcat/Documents/GemCodes/FNA_V3`,包含原有并行修改及广告实现 |
| 数据 | 本机 `fna_v3`,167 篇文章、8 个分类、25 个标签;业务数据只读 |
| HTTP | 230 个不同的本地地址,覆盖全部文章、全部标签、分类和代表性异常参数;227 个 200、3 个预期 404 |
| 文章索引声明 | 19 篇 `index, follow`,148 篇 `noindex, follow`;这是页面声明,**不是 Google 实际收录数量** |
| Sitemap | 20 个 URL:主页加 19 篇文章;本轮与文章 noindex 声明无冲突,未包含分类或标签 |
| 浏览器 | 5 组桌面/手机/禁用 JS 检查,另补 3 组 320px 检查;所有非本地网络请求被阻止 |
| 资源和搜索 | 本地 Meilisearch 的只读状态和 ID 对照;未下载在线订阅、未检测节点、未请求线上图片或统计脚本 |
| 线上证据 | 未读取 Search Console、线上抓取日志、真实访问指标、外链或关键词排名,不能据此给出排名或流量损失数值 |
数据采样时应用使用 UTC,数据库 `NOW()` 使用 UTC+8:分别约为 `2026-10-22 05:10 UTC` 和 `2026-10-22 13:10`。计数受时间及后续数据变化影响;实施时应重新计算,不把 19 或 20 写死为测试长期期望值。
### 2.2 当前值得保留的基础
1. **首次响应已有内容。** 禁用 JavaScript 后,首页的首批文章仍能显示;文章标题与正文由服务端输出。应在现有渲染方式上补足链接和元数据。
2. **真正不存在的对象返回 404。** 本轮不存在的文章、分类和标签均返回 404;问题主要是合法分类的错误前缀、分页和搜索边界。
3. **文章页有明确 H1,基础语言与 viewport 已设置。** 不需要把全部页面基础能力推倒重做。
4. **已有 robots、canonical、sitemap 和按内容年龄控制索引的机制。** 重点是修正它们之间的规则,不是简单从零叠加另一套。
5. **DPL 广告已有可见“广告”标识,链接带 `sponsored noopener noreferrer`。** 装饰性标志使用空 alt,且已指定宽高,这是合理做法。
6. **本轮受限检查中 320px/390px 代表页面无横向溢出,手机菜单动画完成后正常展开。** 这只是本地样本验收,不能替代线上性能、完整无障碍或所有设备验证。
### 2.3 主要证据
| 证据 | 本轮发现 | 意义及边界 | 对应项目 |
| --- | --- | --- | --- |
| E01 | `/`、`/freenode`、`/wrong/freenode` 返回相同列表,各自声明 canonical;`/windows`、`/client/windows`、`/wrong/windows` 也重复 | 路由没有验证父分类。错误路径可扩张出大量有效副本;不能据此声称已遭搜索处罚 | 004、009 |
| E02 | 所有检查到的列表均无普通分页 `<a href>`;robots 屏蔽所有带 `?` 的 URL;第 2 页 canonical 指向第一页 | 内容发现链路与规范化信号同时有缺口 | 005、006 |
| E03 | 从首页沿本轮页面中的实际 HTML 站内链接遍历,只能到达 12 篇文章;19 篇允许索引的文章中有 7 篇未能沿该图到达 | 未把 sitemap、JS 滚动或外链算作 HTML 内链。不是断言搜索引擎绝不可能发现它们 | 005、014 |
| E04 | 浏览器直接进入 `/?page=2` 后加载下一批,重复追加了第 2 页两篇文章 | JS 以 `loadCount + 2` 计算页号,没有从当前 URL 初始化 | 005 |
| E05 | `/?page=40`、`/?page=99` 空列表仍为 200/index;`page=0`、负数、字符串回到首页内容 | 无效分页和空结果的响应策略需明确。合法空搜索并不必须返回 404 | 007 |
| E06 | 首页、各分类、标签、搜索均使用同一站点标题和简介;主页、父分类、标签、搜索缺少内容 H1;Windows 分类 H1 为 `windows1` | 不同搜索意图没有得到清楚描述;单独缺 H1 不等于排名惩罚 | 010、011 |
| E07 | 78 篇文章副标题含 HTML;公共布局在所有 meta description 前附加请求当天日期 | 老文章被描述成“今天”的内容,HTML 标签成为摘要字符串的一部分 | 011、012 |
| E08 | 文章面包屑相对链接 `client` 在文章地址下解析为 `/a/client`;该地址又被宽松分类路由接受 | 错误内链进一步制造副本 | 009 |
| E09 | 167 篇文章全部发布;分类列表缺少文章状态过滤,文章详情缺少分类状态过滤 | 当前没有草稿,因此未证实已有草稿泄露;未来发布控制边界不一致 | 008 |
| E10 | 78 篇节点文章、82 篇账号文章使用 7 天 noindex;清理命令还定义了 180 天删除 | 这是产品策略,不能直接判错;需要按长期价值与资源有效期决定 | 003、018 |
| E11 | 原始正文 HTML 完全相同的 5 组共 13 篇,包括两个客户端页面;7 篇客户端正文可见文本约 138–355 字 | 重复已经确认;字数只用于描述内容规模,没有最低字数达标线 | 019、020 |
| E12 | 最新连续三篇 `fn20261019`、`fn20261020`、`fn20261021` 的正文及副标题均为 0 个可用节点,标题仍称最新高速免费节点;全库共有 4 篇零节点记录 | 无法仅凭文章判断远端订阅此刻是否真为空;已确认的是发布内容与承诺需要复核 | 017、018 |
| E13 | 本地 `articles` 搜索索引仅 40 条;Clash 命中 7 条,其 ID 在当前 167 篇文章中全部不存在;页面显示空结果 | 当前应用与搜索索引不匹配。索引实际归属未进一步调查,不得直接清空这个共享名称的索引 | 016 |
| E14 | `updated_at` 被点赞增减和分类关联更新使用,sitemap 却把它作为 lastmod;存在自动注入点赞逻辑,7 篇还有待注入计数 | 内容日期与互动数据耦合;未启动本地调度,也未确认线上任务当前是否运行 | 012、022、029 |
| E15 | 全部文章未输出 JSON-LD;当前响应中的图片均有 alt 属性,两个导航 logo 未带宽高;列表封面使用 CSS 背景 | 结构化数据是后续增强;不能把装饰图空 alt 当缺陷,也不能把缺宽高直接等同实测 CLS 不合格 | 024、026 |
| E16 | 文章“复制链接”模板写入站点首页;页面品牌文本为 `v2rayfreenode`,样式/标志使用 cfn/Clash;通用 OG 图为相对地址 | 分享链接存在功能错误;站点身份需统一,但 FNA_V3 内部代号不必作为公开品牌 | 001、025 |
| E17 | 新 DPL 组件链接已带 sponsored;160 篇资源正文中的 `fuuu.cloud` 链接未带 rel 属性 | 原有正文推广和新广告组件需要分别治理;不能把新广告已经正确理解为所有推广均处理完毕 | 023 |
| E18 | 当前整页缓存关闭;默认配置若启用会缓存 7 天,文章事件仅尝试失效首页 | 当前不是“正在缓存错误内容”的故障;启用前存在过期、撤稿及多入口失效风险 | 029 |
| E19 | 三个文章接收接口在运行时路由表中只有 web 中间件,`api/*` 排除 CSRF;接收逻辑自动发布并可能调用推送、通知和资源服务 | 应用层缺少已挂载的入站认证,是公开部署前风险。未发送写入请求,未核实生产边缘访问控制 | 030、032 |
### 2.4 关键因果关系
当前链路是:
```text
内容按天生成 → 标题与正文高度模板化 → 新文章仅有短暂索引窗口
↓
每页只展示 2 条 → 后续页依赖滚动 → 普通链接难以到达较深文章
↓
分页被 robots 屏蔽,canonical 又指回第一页
↓
发现与积累主要依赖 sitemap 和每日新 URL,长期内容资产较弱
```
这里的判断是技术与内容策略推断,不是对线上 Google 抓取行为的实测描述。167 篇的规模本身不值得优先做复杂“抓取预算”工程;应先消除无限别名、无效分页和低价值重复。
## 3 实施前需要确定的产品决策
D01、D02 已由用户确认;其余条目仍是建议,未因这些确认而自动获批。
| 决策 | 方案与确认状态 | 为什么 | 影响范围 |
| --- | --- | --- | --- |
| D01 上线身份 | 用户已确认:未来替换现有 cfn;同一套代码支持多个同类站点;ClashFreeNode 是主力站,本地继续独立 | 代码共用,实例身份分别配置;主力站升级需要保护现有有效地址,其他站点不能误用其域名和统计 | 001、021、031、032、036 |
| D02 首页和免费节点页 | 2026-10-27用户明确:首页直接展示日期最新的一篇免费节点文章全文;`/freenode` 保留历史列表。本地已实施,不要求文章必须是当天 | 首页与栏目承担不同展示职能;首页和对应详情的规范地址、索引策略仍在004/018中处理,不把本次功能修改视作SEO全项完成 | 004、010、018 |
| D03 日更文章的角色 | 稳定资源入口承接“当前可用”的需求;有独立记录价值的日更页保留,重复或失败记录不争取搜索曝光 | 用户需要可用资源,日期变动本身不是新价值 | 003、017、018 |
| D04 历史内容 | 先按有效性、独立信息、已有流量/外链分类,再决定 index、noindex、合并或删除 | 不批量把 148 篇开放收录,也不机械全删/全跳首页 | 003、018、036 |
| D05 标签 | 只培养有独立意图、有可维护内容的标签页;其余可保留浏览功能并 noindex | 25 个标签中存在同义名称和高度重叠文章集合 | 015 |
| D06 渠道和目标 | 首先定义有效自然访问和实际使用完成率,Google 为初始技术基线;其他渠道按目标市场补充 | 没有搜索量和 Search Console 数据时不能编造关键词机会或流量预测 | 002、035 |
| D07 样式边界 | 保持既有视觉语言和已批准广告方案;标题语义、链接、数据真实性先行;新增可见信息或调整广告占比单独评审 | SEO 改动不默认授权重设计整站或移除已批准广告 | 010、023、027 |
D01 的部署角色已明确。具体生产映射、新增实例清单以及多站相同内容的收录归属仍需在相应实施项确定;不阻塞本地分页、URL 规则和元数据开发。用户尚未授权本次上线或修改现有 cfn。
## 4 建议采用的 URL 与索引规则
### 4.1 页面行为矩阵
下表为建议合同,实施前与 D02–D05 一起确认。
| 页面类型 | 建议 HTTP | 抓取与索引 | Canonical | Sitemap |
| --- | --- | --- | --- | --- |
| 正式首页/稳定资源入口 | 200 | 可抓取,内容有效时 index | 唯一正式地址 | 是 |
| 有独立价值的分类首页 | 200 | 可抓取,index | 当前规范地址 | 是 |
| 合法第 2 页及以后 | 200 | 可抓取,默认可 index | 含正确 `page=N` 的本页地址 | 一般依赖顺序内链,不强求列入 |
| `page=1` | 301 | 收敛到无 page 的第一页 | 目标页输出 | 否 |
| 已知历史分类别名 | 301 | 一跳到等价目标,保留有效页码 | 目标页输出 | 否 |
| 错误父分类、未知 slug | 404 | 不提供可索引替代正文 | 不指向无关首页 | 否 |
| 页码越界/格式无效 | 404,或对明确等价输入做受控 301 | 不返回通用首页 200 | 不伪称与首页等价 | 否 |
| 完整、已发布文章 | 200 | 按内容策略 index | 自身稳定 URL | index 时加入 |
| 有保留价值但不面向搜索的旧记录 | 200 | 可抓取,noindex | 自身地址;不同时强行指定另一 canonical 来表达不同目的 | 否 |
| 已合并且目标真正等价的旧文章 | 301 | 到已选定的主文章 | 目标页输出 | 否 |
| 已删除且无替代内容 | 404 或明确 410 | 不索引 | 不批量跳首页 | 否 |
| 有实际主题价值的标签 | 200 | 可抓取,index | 自身规范地址 | 按维护策略加入 |
| 普通低价值标签/站内搜索 | 200 | 可抓取,noindex | 自身干净地址或不输出,保持统一规则 | 否 |
| 有效搜索词但无匹配 | 200 | noindex,显示真实无结果状态 | 同上 | 否 |
| 搜索服务故障 | 合适的 5xx 或明确降级状态 | 不伪装成“没有内容” | 不作为正常搜索页参与索引 | 否 |
| 草稿/未到发布时间/不可公开对象 | 匿名 404 或访问受控 | 不进入公开列表、搜索和 sitemap | 不公开输出 | 否 |
| 运维、API、测试、点赞等接口 | 按接口协议 | 不作为内容页面发现和索引;访问控制另行实现 | 不输出文章 canonical | 否 |
`robots.txt` 控制抓取,`noindex` 控制索引,canonical 表达代表性 URL,这三者各有用途。需要让搜索引擎读取 noindex 时,不能同时以 robots 禁止其访问该页面。[Google noindex 说明](https://developers.google.com/search/docs/crawling-indexing/block-indexing)
### 4.2 参数和路径规则
- `page` 是会改变内容的参数,应保留在分页 canonical 中;`utm_*` 等跟踪参数通常不改变正文,应从 canonical 去掉。
- 查询参数要按明确白名单处理。不要为了排除跟踪参数而一并删除页码,也不要放任任意参数生成自指 canonical。
- 分类 URL 由真实分类关系生成;不能只取路径最后一段就当有效分类。
- 文章继续保留 `/a/{slug}.html`,没有必要为“URL 看起来更 SEO”大规模更换。标签的随机后缀也不是必须去掉的错误。
- `Andorid` 应纠正可见名称。若同时把现有 `andorid` slug 改成 `android`,必须安排旧地址映射;名称修正和 URL 迁移应分开验收。
- 全站使用同一个 URL 生成入口,供导航、文章卡片、面包屑、canonical、OG、sitemap 和推送共同使用。
重定向、canonical 和 sitemap 应指向同一主地址;canonical 是规范化信号,不是保证搜索引擎一定采纳的命令。[Google 规范化说明](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)
### 4.3 内容模型的最小改造方向
不需要先建一套大型 CMS。先区分下列概念,能用明确的服务或计算属性表达的,不必全部新增数据库字段:
| 概念 | 作用 | 当前对应及缺口 |
| --- | --- | --- |
| 可公开访问 | 发布状态、分类状态、发布时间共同决定 | 当前各查询判断不一致 |
| 可索引 | 在可公开基础上,再考虑质量、过期、重复、明确编辑选择 | 当前主要依赖分类 noindexday |
| 规范 URL | 每个实体唯一地址和有限历史别名 | 当前多处拼接,未验证父路径 |
| 首次发布时间 | 表达首次公开时间 | 不直接把导入时间当原创发布时间 |
| 实质内容更新时间 | 影响可见更新日期、schema、sitemap | 不能继续无条件使用互动也会修改的 updated_at |
| 最后验证时间与状态 | 描述资源/教程的最近实际核验 | 与发布时间、修改时间分开;未知状态不假装已验证 |
| SEO 标题与简介 | 允许重要页面有编辑覆盖,缺省时从内容生成 | 当前列表全局模板,文章副标题混有展示 HTML |
| 来源和内容类型 | 区分资源快照、长期教程、分发内容、原创评测 | 为索引策略和内容模板提供依据 |
“公开”“索引”“资源有效”是三种不同状态。noindex 不能代替权限控制;资源失败也不应自动等同于整篇教程应被删除。
## 5 执行总表
所有项目当前均未实施。依赖列用于确定顺序,不是要求一次性同时完成全部项目。
| 完成 | 编号 | 项目 | 优先级 | 主要依赖 | 当前性质 |
| --- | --- | --- | --- | --- | --- |
| [ ] | SEO-001 | 明确公开身份、主域名和环境边界 | P0 发布前 | D01 | 部署定位已确认,配置待实施 |
| [ ] | SEO-002 | 确定搜索意图、目标用户和效果基线 | P1 | D06 | 待决策/待数据 |
| [ ] | SEO-003 | 确定内容生命周期与索引资格 | P0 策略 | D03、D04 | 待决策 |
| [ ] | SEO-004 | 统一规范 URL 和历史别名 | P0 | D02 | 已确认 |
| [ ] | SEO-005 | 修复分页发现与滚动加载 | P0 | 004 | 已确认 |
| [ ] | SEO-006 | 协调 robots、参数和 noindex | P0 | 003、005 | 已确认 |
| [ ] | SEO-007 | 修复无效分页、空结果与错误状态 | P0 | 004、005 | 已确认 |
| [ ] | SEO-008 | 统一公开可见性与发布时间判断 | P0 发布前 | 003 | 条件性风险 |
| [ ] | SEO-009 | 修复面包屑和全站内链地址 | P1 | 004 | 已确认 |
| [ ] | SEO-010 | 分类、标签、搜索的标题与语义层级 | P1 | 001、004 | 已确认 |
| [ ] | SEO-011 | 生成真实、干净的页面简介 | P1 | 010 | 已确认 |
| [ ] | SEO-012 | 分离真实内容日期并统一时间基准 | P1 | 003 | 已确认/条件性风险 |
| [ ] | SEO-013 | 统一 sitemap 的集合和 lastmod | P1 | 003、004、008、012 | 已确认 |
| [ ] | SEO-014 | 建立长期内链和内容导航 | P1 | 005、009、018 | 已确认/策略建议 |
| [ ] | SEO-015 | 整理标签与重复主题页 | P1 | 002、003 | 策略建议 |
| [ ] | SEO-016 | 隔离并同步本站搜索索引 | P1 | 008、032 | 已确认 |
| [ ] | SEO-017 | 建立空资源与检测失败的发布门槛 | P0 内容 | 003 | 已确认/待上游核实 |
| [ ] | SEO-018 | 建立稳定资源入口和日更归档策略 | P1 | 002、003、004、017 | 策略建议 |
| [~] | SEO-019 | 处理真实重复文章与跨平台内容(本地Mac/Linux教程已区分) | P1 | 003、004 | 已确认 |
| [~] | SEO-020 | 提升客户端教程的任务完成能力(本地全栏目正文完成,实机/生产未验收) | P1 | 002、019 | 已确认/内容建议 |
| [ ] | SEO-021 | 明确来源、验证和跨站内容差异 | P1 | 017、020 | 策略建议 |
| [ ] | SEO-022 | 作者、编辑责任与真实互动数据 | P1 | 001、012 | 已确认/策略建议 |
| [ ] | SEO-023 | 推广链接、广告与正文体验 | P1 | D07 | 部分已具备,仍有缺口 |
| [ ] | SEO-024 | 添加匹配真实内容的结构化数据 | P2 | 009、010、012、022 | 增强项 |
| [ ] | SEO-025 | 修复分享地址和社交预览信息 | P2 | 001、004、011 | 已确认 |
| [ ] | SEO-026 | 图片语义、尺寸和加载方式 | P2 | 020、028 | 已确认/待测量 |
| [ ] | SEO-027 | 手机端与无障碍完整验收 | P2 | 005、010 | 部分样本通过 |
| [ ] | SEO-028 | 建立正式构建性能基线并按瓶颈优化 | P2 | 026、027 | 待测量 |
| [ ] | SEO-029 | 缓存与发布、撤稿、到期一致性 | P1 启用前 | 003、008、012 | 条件性风险 |
| [ ] | SEO-030 | 文章接收、更新与删除的发布合同 | P0 发布前 | 003、008、017、029 | 已确认/条件性风险 |
| [ ] | SEO-031 | 正式主机、HTTPS 与 HTTP 服务质量 | P0 发布前 | 001、004 | 待部署验证 |
| [ ] | SEO-032 | 本地、预发布和生产资源隔离 | P0 发布前 | 001 | 已确认/条件性风险 |
| [ ] | SEO-033 | 规范 IndexNow 及搜索提交 | P2 | 003、004、030、032 | 已确认/待部署验证 |
| [ ] | SEO-034 | SEO 自动回归与数据样例 | P1 | 跟随各批次 | 当前测试缺口 |
| [ ] | SEO-035 | 搜索平台与业务效果监测 | P1 上线后 | 001、002、036 | 待线上数据 |
| [ ] | SEO-036 | 发布、迁移、回滚与复核 | P0 发布时 | 前述必需项 | 待发布授权 |
## 6 各项优化的实施说明
### SEO-001 明确公开身份、主域名和环境边界
**优先级:P0,正式发布前。** 当前 FNA_V3 是内部项目名,界面标志体现 Clash FreeNode,`app.name` 却是 `v2rayfreenode`,底层站点代码为 cfn。根环境文件保留 `fn-b.loc`,本轮 PHP 服务用启动参数将实际 APP_URL 设为本地 8103,因此本轮页面并没有错误指向旧域名。
建议明确公开品牌、正式主机、是否接替 cfn,以及各环境允许生成的 URL。品牌名称、首页标题、logo alt、作者/发布者、WebSite 数据、分享卡片与统计应使用一致配置。不要把“FNA_V3”自动展示成用户品牌,也不要仅因本地克隆而对原站做跨域 canonical。
**实施范围:** 站点配置、公共布局、环境部署检查;生产域名最终确定后再完成真实映射。
**验收:** 本地只生成本地内容 URL;预发布具有明确防索引措施;生产只生成获准主域 URL;页面身份不再同时混用互不一致的站名。替站或新站的决定记录在 D01。
**用户已确认的方向:** FNA_V3 以后替换现有 cfn;同一套代码可能部署多个同类网站;ClashFreeNode 是主力站。FNA_V3 继续作为内部项目名,不据此更改其他网站的公开品牌。
**据此收敛的实施方案:** 共用代码,以每个部署实例的配置提供站点标识、公开名称、主域、标题与简介、logo、发布者、统计和搜索提交身份;不要把 ClashFreeNode 的域名和品牌写死到所有部署。各实例的数据、搜索、缓存、会话及外部发送边界在 SEO-032 核实。ClashFreeNode 的有效旧文章地址优先保留,真正需要变更的地址才建立逐条迁移映射。
多个站点的内容相同与否、是否各自争取独立收录,以及是否有副本归集到主力站,在 SEO-021 明确;“主力站”不自动授权把所有副站 canonical 指向它,也不代表复制内容的各站一定能获得独立搜索曝光。
**当前状态:部署定位与主力品牌已确认,配置统一和环境验收尚未实施;未修改代码,未部署。**
### SEO-002 确定搜索意图、目标用户和效果基线
**优先级:P1。** 当前站点混合“今天找可用资源”“选择客户端”“查安装使用方法”“获取账号资源”四类需求。它们不应都用一段“免费节点每天更新”的文案承接。
先建立意图到页面的映射:即时资源由稳定入口承接,软件选型由客户端分类承接,具体操作由教程承接,日更历史由归档承接。关键词应从真实用户用语、站内搜索和获得授权后的搜索平台数据提炼,不预设“某词一定有高搜索量”。中文简体是当前内容语言;没有多语言版本时不添加虚假的 hreflang。
**实施范围:** 内容规划、指标定义,后续关联 SEO-035。
**验收:** 每类目标页面能回答“谁搜什么、进来要完成什么、本站有什么独立帮助”。指标至少包含非品牌自然点击、合格页面收录状况,以及不含秘密的实际资源使用事件。没有流量数据的字段保持待采集。
### SEO-003 确定内容生命周期与索引资格
**优先级:P0 策略前置。** 160 篇资源类文章采用 7 天 noindex,另有 180 天删除命令;这些规则与长期教程应分开。当前 148 篇不索引并不能证明策略错误,也不能证明其余 19 篇都是值得排名的页面。
建议将“可公开”“可索引”“已验证可用”“仅供历史记录”拆开判断。资源检测失败、真实检测为零、已过期、正文重复、仍有独立知识价值,应有不同处理。生命周期规则由一个入口计算,供详情、列表、搜索、sitemap、缓存与推送共同调用。
**实施范围:** 内容策略与发布资格服务;只有确认缺少必要信息时再增字段。
**验收:** 对新发布、过期、失败、永久教程、隐藏分类、未来发布和合并内容各有明确行为。时间边界冻结测试覆盖到期前后。先记录策略理由,再处理历史数据;不因想增加 URL 数量而批量解除 noindex。
### SEO-004 统一规范 URL 和历史别名
**优先级:P0。证据:E01。** 当前控制器只取第二段或第一段 slug,未核实路径关系,导致 `/wrong/windows` 也能成为 Windows 分类页。布局再用 `url()->current()` 为每个副本生成 canonical。
建立唯一 URL 生成方法和受控别名表。正式分类路径要么统一平级,要么统一真实父子路径;本项目导航已经使用 `/client/windows`,因此建议沿用该层级,并将真正已使用的平级旧入口映射过去。错误任意前缀返回 404。主页与 freenode 根据 D02 选择,避免循环跳转。不要为无效前缀批量建立重定向规则。
**实施范围:** 路由、Web 控制器、URL 生成方法、布局及后续调用方。
**验收:** `/wrong/windows`、`/wrong/freenode` 为 404;已认可别名一跳到唯一 200 目标;所有内链与 canonical 一致;跟踪参数不产生新主地址;必要分页参数在跳转后仍指向对应内容。旧文章 `/a/...html` 保持稳定。
### SEO-005 修复分页发现与滚动加载
**优先级:P0。证据:E02–E04。** 当前每页 2 条,78 篇节点文章形成 39 页;HTML 中没有下一页链接。直接进入第 2 页再加载,当前浏览器已复现重复内容。
保留滚动加载作为交互增强,同时服务端输出普通的下一页、上一页及适当的分页导航。第 N 页必须可独立打开,canonical 保留正确页码。JS 从当前页或服务端下一页链接初始化,最后一页明确停止;验证置顶和相同创建时间下的排序稳定性,必要时追加 id 排序。数据不断新增时也要定义跨页重复的容忍或去重规则。
每页条数建议先以 **10–20 条作为项目试验区间**,结合页面重量和可读性决定;这不是搜索引擎规定的数值。可以保持现有卡片视觉样式。
**实施范围:** 文章查询、列表模板、分页组件、滚动 JS。
**验收:** 无 JS 时可从首页沿链接到达所有应公开浏览的记录;第 2 页继续加载取得第 3 页;末页停止;刷新与后退后内容页码一致;所有有效分页自指 canonical。
Google 明确建议顺序可抓取链接、独立分页 URL 和分页自身 canonical;同一分页序列允许使用相同标题与简介,不必为此制造不同文案。[Google 分页指南](https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading)
### SEO-006 协调 robots、参数和 noindex
**优先级:P0。证据:E02。** `Disallow: /*?*` 同时拦住有效分页和跟踪参数。只改 canonical 或只加分页按钮都会留下规则冲突。
按参数语义制定策略:合法 page 可抓取;跟踪参数归一;不需要搜索曝光的站内搜索及低价值集合用 noindex。保留真实私有/非内容路径的抓取限制,但不能把 robots 当认证。`/storage/` 是否可屏蔽,应先核实是否承载公开文章图片;当前外部资源主机的 robots 需要在部署阶段分别核实。
**实施范围:** RobotsController、页面索引策略、参数规范化。
**验收:** 测试 `?page=2`、`?page=2&utm_source=x`、搜索地址、静态 CSS/JS/图片和非内容接口;确认 crawler 能读取需要生效的 noindex,且关键渲染资产不被误封。与 SEO-005 同一批验收,不留下临时相互冲突状态。
### SEO-007 修复无效分页、空结果与错误状态
**优先级:P0。证据:E05。** 当前超出末页仍给出“没有任何东西”的 200 页面,容易形成低信息量 URL 和 soft 404 风险;是否已被 Google 判为 soft 404 未知。
明确:超界页码应返回 404;非法数字格式使用严格校验;`page=1` 可规范跳转至第一页。合法的站内搜索无结果应保持正常搜索语义和 noindex,而非一律 404。分类真的为空时,依据其是否提供独立介绍决定保留有价值的 200 页还是停止公开。服务故障不能伪装成成功空列表。
**验收:** `page=0/-1/abc/极大值` 有确定行为;正常末页仍 200;下一页明确结束;三个不存在对象继续 404;错误模板不包含会误导搜索引擎的正文 canonical。临时维护采用合适的 503,而非把维护提示返回 200。[Google HTTP 状态说明](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes)
### SEO-008 统一公开可见性与发布时间判断
**优先级:P0,公开发布前。证据:E09。** 分类列表没有筛选 `iStatus=1`;标签筛选文章状态但未完整检查分类;详情也未排除不可公开分类。当前样本没有草稿,不应报告成已发生泄露。
建立统一公开查询条件:文章已发布、达到公开时间、所属分类及必要父分类可见。详情、分类、标签、搜索、推荐、sitemap 都复用。索引资格在公开资格之上计算;noindex 内容仍可在业务允许的公开列表中浏览,不要误当隐藏。
**实施范围:** 文章查询 scope/策略、搜索索引筛选、推荐集合。
**验收:** 在独立测试数据库放置发布、草稿、未来文章、隐藏子分类、隐藏父分类五类数据;逐个入口验证。不能通过向当前线上导入库插入测试草稿来验收。
### SEO-009 修复面包屑和全站内链地址
**优先级:P1。证据:E08。** 文章中的 `href="client"`、`href="windows"` 解析为 `/a/client`、`/a/windows`;文章卡片分类地址又与导航的层级地址不同。
面包屑、卡片分类、导航、标签与推荐链接统一调用 SEO-004 的生成方法,使用可解析的根路径或完整绝对 URL。保留清楚的锚文本;修正 `rel"rag"` 的 HTML 拼写,避免把它当成具有 SEO 含义的属性。手机端如继续隐藏视觉面包屑,正文内仍应有可用的所属主题入口。
**验收:** 从文章页、分页、标签页打开所有内部导航不再产生 `/a/分类` 或未经认可的父路径;链接不经多跳;锚文本与目标内容一致。后续 BreadcrumbList 使用同一份面包屑数据。
### SEO-010 分类、标签、搜索的标题与语义层级
**优先级:P1。证据:E06。** 不同类型页面共用站级标题,分类名称和标签主题没有进入页面元信息;Windows 的 H1 用 slug 和当前页数量拼成 `windows1`。
建立页面类型模板,同时允许关键页面人工覆盖。建议示意:
| 页面 | 标题示例,品牌待 D01 确定 | H1 内容 |
| --- | --- | --- |
| 稳定节点入口 | 当前免费节点与订阅使用说明 · 品牌 | 当前免费节点与使用说明 |
| 客户端父分类 | 代理客户端选择与使用指南 · 品牌 | 客户端选择与使用指南 |
| Windows 分类 | Windows 代理客户端与安装指南 · 品牌 | Windows 客户端 |
| 有价值的标签专题 | Clash 使用与订阅排错 · 品牌 | Clash 使用与订阅排错 |
| 搜索 | “Clash”的站内搜索结果 · 品牌 | 搜索结果:Clash |
| 文章 | 准确的文章主题 · 品牌,按需加入有意义的分类 | 文章主题 |
这些示例是方向,不应在内容尚未具备时直接承诺有完整指南。列表卡片的 `.h5` 类不会自动形成标题语义,可以在保留样式的同时使用合理的 H2/H3。每页推荐一个主要 H1;不把 H1 数量当机械排名公式,也不为不同日期堆砌同一串软件名称。
**验收:** 首页、每个分类、标签和搜索各自反映主题;HTML 标题正确转义;页面可见主标题和标题标签一致;没有空标题、调试计数或 slug 代替正式名称。Google 会自行生成展示标题,不能保证逐字采用。[Google 标题说明](https://developers.google.com/search/docs/appearance/title-link)
### SEO-011 生成真实、干净的页面简介
**优先级:P1。证据:E07。** 页面简介和展示副标题应分开:展示文本可以包含强调样式,meta description 应为清洗后的纯文本。当前 78 篇副标题带 HTML,直接进入 description。
移除无条件“今天”前缀;按页面主题生成自然摘要,解码实体、去标签、规范空白、正确转义。重要文章允许编辑覆盖,其他页面采用可靠的内容摘要。正文资源数为零或未知时,简介不能继续暗示已提供一批可用资源。搜索页可显示搜索词和结果范围,但仍 noindex。
**验收:** 抽查新旧资源、教程、分类和含引号/实体的内容;简介不含 `<b>`、换行碎片或错误日期,与实际内容一致。Google 可能改用正文片段,且没有保证展示完整内容的固定字符上限;不以“必须 160 字符”等规则作为硬验收。[Google 摘要说明](https://developers.google.com/search/docs/appearance/snippet)
### SEO-012 分离真实内容日期并统一时间基准
**优先级:P1。证据:E07、E14。** 当前更新时间混有点赞和分类关联变化;公共模板把当天日期加到老文章摘要;可见相对日期和 sitemap 日期也没有统一的编辑语义。
区分首次公开、实质内容更新、最近资源验证和互动变化。先核对导入历史时间的真实时区语义,再确定存储、应用、数据库及展示约定;不能直接把所有历史时间统一加减八小时。索引截止时间应由应用计算后传入查询,或确保数据库与应用同一时基,避免 PHP `now()` 和 SQL `NOW()` 使用不同基准。建议以不可变日期对象计算到期时间。
**实施范围:** 日期字段/服务、详情与列表 `<time datetime>`、sitemap、后续 schema。旧数据没有可靠编辑时间时可保留未知或暂不输出 lastmod,不伪造。
**验收:** 用户点赞不改变内容修改日期;实质编辑后可见日期、schema 和 sitemap 一致;新建、导入、跨日、到期边界和夏令时/时区转换有可复现测试。当前样本 sitemap 与 noindex 恰好一致,不能因此忽略八小时时基差异的边界风险。[Google 日期说明](https://developers.google.com/search/docs/appearance/publication-dates)
### SEO-013 统一 sitemap 的集合和 lastmod
**优先级:P1。证据:E10、E14。** 目前 XML 可解析,且本次 20 个地址均与当前文章索引声明匹配;缺口是有价值的分类页未列入,以及 lastmod 语义不可靠。
从统一公开与索引策略生成 sitemap,只包含规范、200、可索引的内容 URL。加入确定要培养的分类和标签专题,排除搜索、别名、过期 noindex、草稿及错误页。lastmod 只在可证明的实质变化后更新;必要时暂不输出。167 篇规模不必急着拆多级 sitemap,达到数量或管理需求再扩展。
**验收:** XML 解析、URL 编码、正式 host、状态、canonical、robots、noindex 做交叉校验;新增/撤稿/到期后集合及时变化;集合差异有可解释原因。Google 忽略 priority 与 changefreq,不应将调大这些数字作为优化工作。[Google sitemap 指南](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)
### SEO-014 建立长期内链和内容导航
**优先级:P1。证据:E03。** 当前资源发现主要依赖列表首屏和“点赞活跃”;动态热门榜并不保证重要教程或可索引资源长期获得入口。
先修复分页,再给重要教程、平台分类及稳定资源页设置持久入口。文章结尾优先提供真正相关的“下一步”:导入订阅、选择客户端、连接失败排查,避免只推荐同一天的相似文章。资源归档应按有用的时间或主题导航,不要为每一天、每个软件、每个地区组合自动扩张空薄页面。
**验收:** 从首页的实际 `<a href>` 图可到达全部计划索引页面;关键长期页面以项目目标控制在约 3 次点击内,较深历史归档通过顺序分页可达。此深度是维护目标而非 Google 强制阈值。允许索引页面没有仅靠 sitemap 存在的孤立记录。[Google 链接建议](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)
### SEO-015 整理标签与重复主题页
**优先级:P1。** 当前 25 个标签全部有文章,但“有文章”并不等于值得成为独立搜索落地页。例如“免费苹果账号”“小火箭”“shadowrocket id”“小火箭账号”等各有 82 篇记录;需要比较真实文章集合与意图,不能只按名称合并。
将标签分为有独立主题的编辑专题、站内浏览标签、应合并的同义标签。有价值的专题应有清楚简介和精选内容;仅重复列出相同文章的浏览标签可 noindex。对已有流量/外链的标签保留映射。标签后缀随机并不构成必须迁移的 SEO 问题。
**验收:** 有一份标签去留决策,记录合并理由和目标地址;站内浏览功能可用;规范化、索引规则与 sitemap 一致;不自动生成大量“客户端 × 日期 × 地区”的近似专题。
### SEO-016 隔离并同步本站搜索索引
**优先级:P1。证据:E13。** 本轮已核实 Meilisearch 可用,问题并非“服务一定没启动”:索引含 40 条文档,Clash 命中 7 条,但这些 ID 不存在于本库。当前 `Articles::searchableAs()` 固定返回 `articles`,只改数据库名称或仅设置一个未被该方法采用的前缀,不足以保证隔离。
给 FNA_V3 分配专属索引名或专属实例,按本站公开资格导入;清理只作用于本站索引。校验排序、可过滤字段、同步时机以及更新/撤稿/分类隐藏后索引变化。索引命中应结合当前数据库权限重新确认。搜索入口应有服务端 GET 表单处理;目前无 JS 时 `/?s=Clash` 仍显示首页。
**验收:** 新索引所有 ID 与本站一致;Clash 和中文节点词能返回真实匹配;无匹配、后端故障和权限变化各有正确状态;FN_B 或其他索引未变化。当前通用 `articles` 索引不得未经归属核实直接删除或重建。
### SEO-017 建立空资源与检测失败的发布门槛
**优先级:P0 内容。证据:E12。** 连续三篇最新文章显示 0 个可用节点,却仍沿用“最新高速”标题。问题并非必须禁止所有零结果页面,而是发布内容必须准确反映实际检查结果,且不能把系统故障包装成有效更新。
接收结构化的 `检查状态、检查时间、有效数量、失败原因类别、资源版本`,不要只解析标题字符串决定是否发布。明确区分:没有执行检查、检查失败、检查完成且为零、检查完成且有有效资源。失败时保留上次有效记录并标明时效,或提供真实的状态说明;不生成伪装成成功的新索引页面。对旧资源做可用性提醒,不能保证“永久高速”“全地区可用”。
**实施范围:** FNA_V3 接收端的校验和发布策略;上游 NodeHub/SubCheck 的字段或检测变更要在对应项目单独授权和验收,本计划不自动修改它们。
**验收:** 用无真实订阅的固定样例覆盖四种状态;页面标题、数量、可见说明、索引资格和 sitemap 一致。真实检查数据缺失时展示未知,不把 0 和未知混为一谈。先核实本轮零记录成因,再决定是否处理历史文章。
### SEO-018 建立稳定资源入口和日更归档策略
**优先级:P1。** 建议为“现在能用什么、如何使用”提供一个稳定且持续维护的地址,将日期快照作为支持信息。稳定入口显示最近有效结果、验证时间、适用客户端、导入说明和常见失败处理;用户不必每天重新找到另一个日期 URL。
日更页分三类处理:有独立验证记录或重要变化的可以保留索引;仅重复模板、没有新信息的保留浏览但不争取索引;已经失效且没有历史价值的按策略退出。七天窗口可以作为资源风险管理的一部分,但不应无差别决定所有内容的长期价值。180 天清理也需服从保存、合并、删除合同。
**实施范围:** 稳定资源页内容、日更模板和归档策略;尽量复用现有视觉组件。禁止把所有历史日期页统一跳转到今天而忽略是否等价。
**验收:** 稳定入口即使某天检查失败仍能如实解释状态;日更页有明确的历史身份并能返回当前资源入口;长期教程不因资源窗口到期被误关索引;历史页去留有理由和恢复记录。
### SEO-019 处理真实重复文章与跨平台内容
**实施进展(2026-10-27):** 原重复组5的`m173`、`m174`已保留URL并分别重写为Mac与Linux桌面教程,平台安装和排错步骤不同,本地API版本1。原重复组1—4未处理;下表保留审计时的证据,不代表当前仍有五组重复。
**优先级:P1。证据:E11。** 本轮发现 5 组原始正文 HTML 完全相同,合计 13 篇:
| 重复组 | 文章 slug |
| --- | --- |
| 1 | `ssi20260922`、`ssi20260907`、`ssi20260906` |
| 2 | `ssi20260909`、`ssi20260908` |
| 3 | `ssi20260827`、`ssi20260826`、`ssi20260825`、`ssi20260824` |
| 4 | `ssi20260823`、`ssi20260822` |
| 5 | `m174`、`m173` |
重复正文不代表整个页面完全相同:标题、日期、分类等仍可能不同。`m167` 与 `m173/m174` 标题也相同,但正文并非全部逐字相同。应检查任务意图:如果是同一份跨平台说明,选一个主文,其他真正等价页面合并;若 Windows、macOS、Linux 各有独立安装、权限和排错步骤,则补成不同页面。
**验收:** 每个重复组有“保留独立/合并/历史 noindex”的理由;已认可合并使用一跳映射、更新内链和 sitemap;不能仅根据哈希自动删除。主文选择要考虑现有 URL 和后续获得的流量/外链证据,不能只认数字最小的一篇。
### SEO-020 提升客户端教程的任务完成能力
**实施状态(2026-10-27):本地正文更新完成,设备实测及生产验收未做。** “客户端”已改为“入门教程”并保留`/client`,迁移文m167归入进阶,与DNS专题并列。原七篇旧教程全部处理,另有Windows纯入门和DNS新文,共九篇;Android分别为v2rayNG和Clash Meta,iOS聚焦Quantumult X,Mac拆为选型下载与操作,Linux按桌面发行版和终端代理单独组织。四篇最后更新均经本地API版本1发布,当前完整版本与实际关联以[写作索引](../content/WRITING.md)为准。来源、图解、目录、内链锚点、1360/390页面及栏目已核对;未做平台客户端真机联网测试、提交或生产发布。因此保持部分验收状态,不把文章页面检查写成设备操作成功。内容源、证据与回退见[教程栏目维护](TUTORIALS.md)。
**优先级:P1。** 2026-10-22审计时,7 篇客户端正文约 138–355 字,多为简短介绍和项目/下载链接。字数本身不是问题;从实际内容看,很多安装、导入和排错步骤仍需要用户到别处寻找。
逐篇按用户任务补充:支持的平台与当前核实版本、官方项目与下载来源、安装前提、订阅导入步骤、正常工作的可见验证方式、常见错误与处理、维护状态、最后核验时间和必要截图。只有确实执行过才写“实测”;未核实的软件更新状态和下载安全性应明确待核实,不能根据旧文章继续承诺兼容性。
优先完善已存在的少数教程,再考虑新增。避免为了覆盖关键词而自动生成一套只有平台名称不同的文章;也不使用目标字数或重复问答堆篇幅。
**验收:** 一位目标平台新用户可按文档完成指定任务;链接来源、版本和步骤有核验记录;每篇明确自己解决的问题;内容与标题、摘要、schema 一致。Google 对有帮助内容强调实质价值和真实经验,而不是固定篇幅。[Google 内容质量指南](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)
### SEO-021 明确来源、验证和跨站内容差异
**优先级:P1。** 代码和项目关系显示文章可由上游分发。分发本身不等于垃圾内容,但如果多个站点只更换域名、日期或少量词语而重复发布,会缺乏独立价值。
记录资源来源类型、验证方法和时间、本站新增的信息。长期教程优先增加真实操作、限制条件和本地用户的具体问题;引用第三方内容时核实出处和使用许可。避免把免费资源数量、覆盖地区或速度当成未经测试的质量承诺。新站是否与原站同时提供相同完整内容,应随 D01 明确,不能默认复制站自然拥有独立排名价值。
**验收:** 每种内容模板能说明本站贡献;核心承诺能追溯到证据;发布失败不会换个日期再次生成看似新内容。Google 针对的是以操纵排名为目的、大规模产生低价值内容的行为,不能仅因自动化就认定违规,也不能声称本站已受处罚。[Google 垃圾内容政策](https://developers.google.com/search/docs/essentials/spam-policies)
### SEO-022 作者、编辑责任与真实互动数据
**优先级:P1。证据:E14、E16。** 当前作者位置显示站点名并链接首页,未见独立的作者/编辑说明入口;代码还有自动注入点赞的功能,不能将这些计数当成真实用户评价或用于评分标记。
根据实际运营情况提供关于本站、联系/反馈、编辑与验证方法、推广关系说明。可以使用真实的团队或组织身份,不必虚构专家、头像、资历或个人作者。对于非真实点赞,建议停止将其表示为真实用户反馈,或明确改为站内推荐分;最终方案作为业务决策,不在本轮擅自清空计数或停任务。
**验收:** 作者/发布者可辨认且有有效说明入口;相关主张真实;“最近更新”不由互动驱动;没有把自动点赞包装为 AggregateRating 或用户评论。关于页是信任信息的一部分,不是添加后就获得某个 E-E-A-T 分数的按钮。
### SEO-023 推广链接、广告与正文体验
**优先级:P1。证据:E17。** 新 DPL 组件已有广告标识和 sponsored,应保留。仍需核实 160 篇正文中旧 `fuuu.cloud` 链接的商业性质:属于推广/付费推荐的应正确标记;一般编辑引用无需一律 nofollow。
检查广告不会伪装成下载按钮,不遮挡主要内容,不导致布局突然移动。当前 390px 样本中首页首批文章约在 y=438px,Windows 分类第一张文章卡片约在 y=695px;这表明分类页广告加大图占用了较多首屏,但不是已确认的搜索处罚。先观察真实使用任务和性能,再决定是否在保持品牌样式下调整间距、信息密度或顺序;三款已批准广告不因这份建议自动撤掉。
**验收:** 组件广告与正文推广分开检查;需要 sponsored 的链接全部正确;主任务可识别、可完成;手机无误触和遮挡;广告尺寸预留稳定。Google 建议用 sponsored 标记广告或付费链接。[Google 外链属性说明](https://developers.google.com/search/docs/crawling-indexing/qualify-outbound-links)
### SEO-024 添加匹配真实内容的结构化数据
**优先级:P2。证据:E15。** 当前没有 JSON-LD,已有面包屑 itemprop 又缺少完整的结构。建议基础规则和日期修正后再添加:
- 首页:真实的 WebSite 名称和 URL;组织资料真实、完整时再加入 Organization。
- 正文:适合文章内容的 Article 或 BlogPosting,包含准确主题、规范 URL、真实作者/团队、相关图片、首次发布和实质更新时间。
- 内容层级:BreadcrumbList,采用与可见面包屑一致的名称和 URL。
- 普通分类可以使用语义合适的 CollectionPage/ItemList,但不把它们宣传为必然出现的 Google 富结果功能。
**验收:** JSON 可解析且正确转义;数据与用户可见内容一致;URL、日期、作者、图片能验证。Article 与 Breadcrumb 使用支持的富结果验证方式;WebSite 站点名称使用 schema 验证及后续搜索平台检查,不能要求 Rich Results Test 必须展示一个它不支持的站点名称结果。禁止虚构评分、作者或把资源页假装成新闻/商品。
这些标记能帮助理解及获得适用展示资格,但不保证富结果或排名改善。[Article](https://developers.google.com/search/docs/appearance/structured-data/article)、[Breadcrumb](https://developers.google.com/search/docs/appearance/structured-data/breadcrumb)、[站点名称](https://developers.google.com/search/docs/appearance/site-names)、[结构化数据质量规则](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)
### SEO-025 修复分享地址和社交预览信息
**优先级:P2。证据:E16。** 当前文章复制按钮输出首页地址,用户分享后无法直接到达原文。通用 OG 图片为相对地址,文章 OG 图片则依赖外部资源。
复制当前文章规范链接;OG URL 与 canonical 共用生成规则;图片使用环境正确的绝对 URL,校验实际存在、类型、尺寸与内容相关性;按目标分享平台需要补充卡片字段。favicon 与公开品牌一致。不要为满足社交卡片而新增与正文无关的图片承诺。
**验收:** 从两篇不同文章复制分别得到对应 URL;带跟踪参数的访问复制后得到干净主地址;预览图片与标题正确,真实线上爬虫取图在部署阶段验证。OG 本身不是 Google 排名提升保证,但分享错误是明确的产品缺陷。
### SEO-026 图片语义、尺寸和加载方式
**优先级:P2。证据:E15。** 当前卡片封面使用 CSS background,Google 的图片发现无法按普通 img 处理;当前 HTTP 样本没有缺 alt 属性的图片,DPL 装饰性 logo 空 alt 合理。导航两个 logo 缺少 HTML 宽高,不代表已经实测产生 CLS。
有内容意义的封面使用可保持原样式的 `img/picture`,提供真实相关的 alt、尺寸和合适的响应式资源;装饰图保持空 alt。按实际 LCP 元素决定加载优先级,首屏关键图不要统一 lazy,屏外内容再延迟加载。先核实资源大小、缓存与图片用途,再决定 WebP/AVIF、srcset、预连接等;不要为未知外站盲目添加 preconnect。
**验收:** 原视觉布局保持;有意义的图片可被 HTML 发现;装饰图不过度描述;图片加载前后布局稳定;不同视口不下载明显过大的资源;404、重定向及跨域资源响应在授权的部署验收中确认。[Google 图片指南](https://developers.google.com/search/docs/appearance/google-images)
### SEO-027 手机端与无障碍完整验收
**优先级:P2。** 本轮 320px/390px 样本没有横向溢出,320px 菜单展开后位于 x=0–256,含 8 个链接;不需要无依据重做响应式布局。仍应核查完整功能,而非只看截图。
修复只有图标的菜单/搜索按钮可访问名称,验证键盘焦点、菜单开关、返回、搜索、加载更多、分享及错误提示。禁用 JS 或脚本失败时,正文、主要导航和分页仍应可用;搜索应有服务端表单后备。移动端隐藏了部分摘要、日期、侧栏和面包屑,重要解释和必要入口应在主内容中仍可找到。
**验收:** 320、390、768、1280px 代表性页面;正文不截断关键步骤;键盘可完成主要操作;字体可读;不以隐藏给搜索引擎的额外文本弥补信息缺失。Google 主要依据移动版本内容处理索引和排名。[Google 移动索引指南](https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing)
### SEO-028 建立正式构建性能基线并按瓶颈优化
**优先级:P2。** 当前是 Vite dev 模式;外部图片和统计被测试浏览器阻止。这样的环境不适合宣布线上 Lighthouse 得分或 Core Web Vitals 已通过。
已确认公共 JS 引入 Bootstrap、jQuery、InfiniteScroll、Clipboard,主 JS 源码约 34KB,基础主题 CSS 源文件约 578KB,并包含滚动日志和多种旧交互逻辑。它们是检查方向,不是实际传输量或慢站结论;也不能仅因使用 jQuery 就要求重写。
后续在获准的构建验证阶段记录正式资源的压缩后体积、未使用代码、长任务、字体、LCP 资源、图片重量及 TTFB。先按可测瓶颈优化:删除无用代码、按需加载、减少滚动布局计算、合适字体策略、压缩和长期缓存静态哈希文件。数据库索引只在 EXPLAIN 或慢查询证明需要时调整;167 篇规模不预设数据库是瓶颈。
**验收:** 有同一设备/网络条件的改前改后对照,功能无回归。上线后以真实用户第 75 百分位为主要口径,目标 LCP ≤2.5s、INP ≤200ms、CLS ≤0.1;实验室结果用于定位问题,不替代真实用户分布。[Google CWV 指南](https://developers.google.com/search/docs/appearance/core-web-vitals)、[web.dev 阈值与分位定义](https://web.dev/articles/defining-core-web-vitals-thresholds)
### SEO-029 缓存与发布、撤稿、到期一致性
**优先级:P1,开启整页缓存前完成。证据:E18。** 当前整页缓存关闭,不应把默认 7 天 TTL 说成现有线上缓存故障。模型 saved/deleted 只尝试失效首页,分类、标签、详情、sitemap 及年龄变化缺少完整安排。
设计缓存键和失效范围,确保主域、路径、有效分页参数和必要响应差异被正确区分。新增文章影响列表和 sitemap;正文更新影响详情及摘要;撤稿/隐藏分类影响全部公开入口;到期即使没有数据库写入也会改变 noindex 与 sitemap。对点赞状态、会话、CSRF 等个性化内容核实整页缓存适用性。静态资源缓存和 HTML 缓存分别配置。
**验收:** 分页缓存互不串页;两个匿名会话不混淆状态;新增/撤稿/隐藏/到期后在明确时限内一致;不靠“全站清缓存”掩盖缺少失效合同;缓存关闭与开启均通过关键 SEO 用例。
### SEO-030 文章接收、更新与删除的发布合同
**优先级:P0,公开部署前。证据:E19。** 运行时路由表显示文章接收接口只挂 web 中间件,且 API 路径跳过 CSRF。接收逻辑直接设为发布并会触发资源读取、搜索同步、IndexNow 或通知。尚未确认生产是否另有边缘保护,本轮没有发送接收请求。
上线前为调用方建立明确认证、请求结构校验、允许字段、幂等标识和发布门槛;内容 HTML 采用与可信来源匹配的清洗策略,避免未知内容注入公开页面。编辑字段与上游覆盖字段分开,避免手工优化的标题/简介下一次分发就被覆盖。内容成功保存、标签同步、缓存失效、搜索更新和外部通知应有可追踪的顺序与失败恢复。
删除规则同样重要:当前批量删除不一定触发逐模型事件,不能假设缓存/搜索/推送会自动同步。无替代内容正确退出;有真正等价替代才重定向。点赞类写入也应使用合适的写请求,避免 GET 改业务状态,本轮未调用该接口。
**验收:** 未授权请求不能发布;同一消息重放不产生重复页;零资源/失败数据按策略处理;撤稿和批量清理后所有公开入口一致;外部服务失败不造成“页面显示发布成功但实际丢失”。测试使用独立数据库和外部服务替身,不触发真实推送或通知。
### SEO-031 正式主机、HTTPS 与 HTTP 服务质量
**优先级:P0,部署时。** 当前本地回环 HTTP 不是 HTTPS 问题的证据。生产上线后需要单独验证服务器、代理和 CDN 实际行为。
确定唯一主机与 HTTPS;已存在的 www/非 www、HTTP/HTTPS 别名使用明确一跳规则。框架正确识别代理协议和主机,避免生成 HTTP canonical 或错误域名。机器人不应遭遇无必要的登录、验证码、WAF 挑战或长期 5xx;同时不靠伪造 User-Agent 放宽安全策略。页面、XML、robots、静态资源返回合适状态及 MIME 类型,错误页和维护页不返回成功正文。
**验收:** 使用获准服务器侧链路检查正式 host、重定向链、robots、sitemap、文章和资产;记录证书、HTTP 状态及代理识别结果。完整线上页面交互若需要,仍按项目网站访问规则执行。本地通过不能代替此项。
### SEO-032 本地、预发布和生产资源隔离
**优先级:P0,公开部署前。** 独立数据库不代表所有资源已隔离。当前副本保留原站配置与 Git 元数据,搜索索引名称固定,布局按 cfn 加载线上 Umami 脚本,还存在共享资源链接。
为各环境核对:数据库、搜索索引、缓存命名、会话、统计站点 ID、图片依赖、外部通知、IndexNow、后台任务、公开品牌、主域、站点验证文件及 Git 远端。非生产环境默认不向真实搜索平台提交 URL,不向生产统计混入测试访问。公开预发布优先访问控制并配合 noindex;单独 robots 禁抓取不是可靠的防收录方案。当前 127.0.0.1 仅本机可达,不应因此判断已被公开索引。
**验收:** 本地业务测试不会写入 FN_B 数据或索引,不会触发外部通知与生产统计;生产部署不带 dev hot 标记、调试输出、私密配置或本地 URL;站点验证文件匹配实际站点所有权;发布前已核实 Git 推送目标,避免把副本改动推回源项目。
### SEO-033 规范 IndexNow 及搜索提交
**优先级:P2。** 当前发布接收逻辑会调用 IndexNow,服务先 GET 检查 URL,只接受成功响应。这能避免部分无效新增,却不能完整表达删除通知;200 页面也可能是 noindex 或错误副本。
按正式环境、规范 URL、内容状态和变更类型决定是否提交;支持新增、实质更新和删除各自的处理。避免推送本地地址、预发布地址、未发布或无价值的失败快照;主域与 keyLocation 必须属于当前站点。提交过程要能失败重试、去重并记录状态,不能把接口接收成功等同收录成功。
**验收:** 本地使用替身验证,不实际发送;正式获准后单条核验目标主机、验证文件和返回结果;删除事件不因目标已 404 而被本地逻辑永远过滤掉。IndexNow 表示通知采用该协议的搜索引擎,不能当成 Google 通用收录接口。Google Indexing API 仅支持其指定的招聘及直播事件页面,不适用于普通节点文章。[IndexNow 协议](https://www.indexnow.org/documentation)、[Google Indexing API 适用范围](https://developers.google.com/search/apis/indexing-api/v3/using-api)
### SEO-034 SEO 自动回归与数据样例
**优先级:P1,随每批实现。** 当前仓库测试只有首页 200 示例和恒真示例,不能防止 URL、索引和发布规则回退。本轮未执行这些与审计目标无关的示例测试,也没有新增业务测试或修改代码。
未来围绕外部行为建立测试:规范地址与别名、合法分页和越界、状态与索引资格、日期边界、sitemap 集合、公开入口、结构化数据转义、资源失败和撤稿一致性。使用固定时钟、隔离数据库和外部服务替身。避免只照抄内部实现断言,或把当前 167 篇和日期写死。
**验收:** 变更相应行为会让测试真正失败;每个已完成项目对应验收证据;本地浏览器补验 JS 和无 JS 路径;核心样式、三种广告和正常 API 合同没有无关回归。测试通过、页面验收、上线和真实搜索效果分别记录。
### SEO-035 搜索平台与业务效果监测
**优先级:P1,上线后。** 本轮没有生产搜索数据,不能确认哪些页面已经收录、用户通过哪些查询进入、Google 选择了哪个 canonical,也不能证明某项缺陷已造成多少损失。
获准后配置或核实实际站点的 Search Console;按目标渠道需要补 Bing 等平台。记录 sitemap 处理、页面索引原因、选定 canonical、查询与页面表现、地区/设备、人工处置及安全问题。服务器日志用于区分真实机器人抓取和普通流量;访客分析用于衡量实际使用,不记录订阅密钥、账号或敏感正文。
**验收:** 有可回溯的发布前基线或新站起始基线;页面类型与业务目标能分组分析;出现错误有明确负责人和处理方式。监测频率和通知自动化另行授权,本报告不创建定时任务。[Search Console 能提供的数据](https://developers.google.com/search/docs/monitor-debug/search-console-start)
### SEO-036 发布、迁移、回滚与复核
**优先级:P0,实际发布时。** 如果 FNA_V3 替换原站,应尽量保留已有有效 URL;如果成为独立新站,应按新站处理品牌与内容差异,不能默认沿用旧站身份及所有权验证。
发布前保存代码、数据和相关配置恢复点;确认 Git 远端,提交并推送本任务范围,再让目标服务器更新到明确提交。对确需改动的 URL 建立逐条映射,避免批量跳首页、循环和链式跳转。按批次发布规则改动,保留对比和回滚依据;不要同时更换域名、技术栈、URL、内容和视觉而失去定位能力。
**验收:** 代码、数据库、配置和链接映射均有恢复办法;发布后完成授权范围内服务器侧检查;迁移前后有效页面数与 URL 集合差异可解释;真实页面验证按访问规则记录。若跨域迁移,采用当前搜索平台认可流程,持续保留必要的旧地址映射。[Google 迁移指南](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes)
## 7 建议实施顺序与批次交付
编号是稳定引用,不表示必须机械按数字逐个开发。以下批次避免先加展示功能、后反复改底层规则。
| 批次 | 范围 | 本批应交付的可检查结果 | 进入下一批的条件 |
| --- | --- | --- | --- |
| A 方向与合同 | 001–003,明确 D02–D05;启动 034 的测试方案 | 品牌/上线角色、页面类型、URL 与索引矩阵;确认历史内容处理原则 | 关键策略明确,仍未知的生产域名可延后到发布前 |
| B 地址与发现路径 | 004–009、014 的基础内链;配套 034 | 唯一 URL、合法分页、错误状态、robots 协调、统一公开查询、正确面包屑 | 无 JS 可遍历;分页、别名、状态和索引矩阵一致 |
| C 页面信息与索引集合 | 010–013、015、016;配套 034 | 区分主题的标题/简介,真实日期,统一 sitemap,独立且正确的搜索索引 | 样本与全量机器检查通过;没有污染其他项目索引 |
| D 内容价值与发布质量 | 017–023,以及 030 的质量门槛 | 零结果/失败处理、稳定资源入口、重复内容决策、可完成任务的教程、真实来源和推广说明 | 内容承诺可证明;每日自动发布不会撤销人工优化 |
| E 展示与体验 | 024–028,以及 029 的缓存设计 | 合适的结构化数据、正确分享、图片加载、手机功能和构建性能对比 | 功能、视觉与性能有证据,非只看审计工具分数 |
| F 上线准备 | 029–033、036,补齐 034 | 环境隔离、发布认证、主域与 HTTPS、缓存一致性、迁移和回滚方案 | 所有 P0 发布条件满足,获得实际发布授权 |
| G 线上观察 | 035;按结果回到内容与性能项目 | 抓取、索引、点击及使用完成的对照记录 | 按真实数据持续迭代,不保证固定天数见效 |
SEO-017 的问题会影响当前内容承诺,可在批次 A 确认政策后尽早处理,不必等待所有标题优化完成。SEO-030、032 在任何对外暴露或真实导入测试之前先完成必要隔离。批次之间可以独立验收;本地实现完成不自动授权部署。
### 单项完成记录格式
以后在对应项目末尾增加短记录,保留最初问题与最新状态,避免把建议列表误读成已经实施。
```text
项目编号:SEO-xxx
状态:待决策/待实施/进行中/本地验收通过/已发布/观察中/已关闭
实际范围:
关键取舍:
验证证据:
样式和数据影响:
提交及发布状态:
剩余问题或下一步:
```
“本地验收通过”必须包含本地证据;“已发布”必须有明确环境与提交;“已关闭”指该项目约定目标达成,不代表整站 SEO 达到某个永久最高分。
## 8 验收矩阵与完成标准
### 8.1 最小功能和索引样例
| 编号 | 验收场景 | 核心检查 |
| --- | --- | --- |
| T01 | 首页和认可的免费节点别名 | 唯一主 URL;别名一跳;标题与职能一致 |
| T02 | 正确/错误父分类路径 | 正确 200,错误 404;导航不产生错误路径 |
| T03 | 第 1、2、中间、最后一页 | 内容不同且顺序稳定;分页 href;正确自指 canonical |
| T04 | 页码 0、负数、字符串、超界、重复参数 | 明确规范化或 404;没有空薄的任意 200 页面 |
| T05 | 分页叠加跟踪参数 | 保留页码,去掉非内容参数;robots 允许必要抓取 |
| T06 | 当前文章、过期历史文章、永久教程 | 公开状态与 index/noindex 符合内容合同 |
| T07 | 草稿、未来文章、隐藏分类及父分类 | 在详情、列表、标签、搜索、推荐、sitemap 中一致 |
| T08 | 索引到期临界时刻 | 固定时钟下详情和 sitemap 同步切换,不受八小时差异影响 |
| T09 | 更新正文与仅点赞 | 仅前者改变内容修改日期;schema/sitemap/页面一致 |
| T10 | 资源成功、真零、未知、检查失败 | 标题、状态说明、资源数和索引政策一致 |
| T11 | 有搜索结果、无结果、服务故障 | 结果来自本库;无结果正常 noindex;故障不伪装无结果 |
| T12 | 已合并、已删除、从未存在的文章 | 映射与 HTTP 状态正确;搜索和 sitemap 不残留 |
| T13 | 有引号、实体、长文本的标题与简介 | HTML/JSON 正确转义,简介纯文本,无虚假日期 |
| T14 | 一篇普通教程、一篇资源页、一页分类 | 按内容类型选择结构化数据,字段与正文一致 |
| T15 | 无 JS、JS 失败、直接进入分页后滚动 | 主内容可读;分页可走;不重复加载当前页 |
| T16 | 手机与桌面 | 主要内容和必要入口可用,菜单/搜索/分享可操作 |
| T17 | 缓存关闭与开启 | 不串页、不串会话;新增、撤稿、隐藏、到期及时一致 |
| T18 | 本地、预发布、生产环境 | URL、统计、搜索、缓存、外部发送和验证文件隔离 |
| T19 | 接收接口拒绝与幂等 | 未授权不能发布;重放不产生重复;失败可恢复 |
| T20 | 发布前后全量 URL 集合 | 200/301/404/noindex 变化有清单,关键旧链接可恢复 |
### 8.2 技术完成标准
- 所有计划索引的页面均有可访问的规范 URL,返回有效 200,未被 robots、错误 noindex 或错误 canonical 排除。
- 别名、分页、参数、内链、sitemap、OG 和推送使用同一套 URL 与资格规则。
- 所有计划索引的页面能从公开 HTML 内链到达;不存在只靠滚动事件才能发现的必要下一页。
- 不能公开的对象在所有入口一致隐藏;合法无结果与运行故障被区别处理。
- 标题、简介和日期真实,重要主题彼此可区分;schema 与正文一致。
- 内容发布能验证资源状态、处理失败、保护人工编辑,并完整同步缓存、搜索与索引集合。
- 网站原有功能和已批准视觉方案无无关回退;构建和线上检查分开记录。
这些标准可由工程验收保证;实际收录率、展示形式和排名需要搜索引擎处理,不能作为“代码测试通过”的同义词。
## 9 上线后的效果判断
### 9.1 指标应分层
| 层次 | 应观察什么 | 如何解读 |
| --- | --- | --- |
| 技术健康 | 有效 URL、错误重定向、意外 noindex、sitemap 冲突、5xx | 先排除明显工程回退 |
| 发现和索引 | 抓取记录、索引原因、Google 选择 canonical、计划索引页面的状态 | 不要求每个无价值归档都进入索引;分母是计划索引集合 |
| 搜索表现 | 按主题/页面类型的曝光、点击、CTR、查询和地区/设备 | 同类页面比较;平均排名和 CTR 受查询组合影响 |
| 内容贡献 | 长期教程自然流量、稳定资源页回访、相关下一步使用 | 关注持续价值,不只看每日新页面数量 |
| 实际任务 | 订阅使用入口、教程完成反馈、搜索成功率、故障反馈 | 事件仅记录必要状态,不收集订阅秘密或共享账号正文 |
| 体验 | 真实用户 CWV、失败率、手机交互和资源加载 | 实验室改善不等于真实用户已全面改善 |
### 9.2 建议观察窗口
- **发布当天:** 验证服务、URL、索引规则、主要页面及外部发送配置,没有重大回退。
- **首周:** 观察新 URL 的发现、sitemap 处理、异常状态、搜索和关键功能;不足以据此宣布排名稳定。
- **后续 2–4 周:** 对照页面组观察收录原因、查询与点击变化,结合抓取情况判断是否需调整。
- **后续 4–8 周及更长:** 评估长期内容、稳定入口和归档策略;新站、低抓取频率或迁移可能需要更长时间。
这些是建议的复核节奏,不是收录时限或增长保证。比较相似星期和页面组,标记节假日、内容更新与其他外部变化;不要一次搜索、一次 Lighthouse 分数或一次流量波动就反转策略。
## 10 暂不优先做的工作
1. **不因 SEO 全面更换框架。** 当前首次 HTML 已有内容,先修路由、分页和质量规则。
2. **不把关键词 meta、固定字数、标题字符数当主要目标。** 对 Google,meta keywords 不影响索引和排名;标题和摘要应清楚且符合实际内容。[Google 支持的 meta 标签](https://developers.google.com/search/docs/crawling-indexing/special-tags)
3. **不把所有分页 canonical 指向第一页,也不默认全部分页 noindex。** 它们展示不同文章,应按真实内容处理。
4. **不把所有旧页面跳首页。** 只有内容等价或真正迁移时采用对应重定向。
5. **不把全部标签和全部历史文章一次性开放索引。** 先判断独立意图、质量和保留价值。
6. **不通过每日刷新日期、生成空薄文章、虚构作者或点赞制造“新鲜”和“权威”。** 应改善真实内容和发布流程。
7. **不为凑富结果给所有页面添加 FAQ、评分、商品或新闻标记。** 页面类型和真实内容必须适合;有效 schema 也不保证展示。
8. **不在没有需要时建设多语言、AMP、庞大 sitemap 分片或独立抓取预算系统。** 当前规模与问题不支持优先投入。
9. **不将 dev 模式跑出的分数当线上 SEO 成绩。** 正式构建、外部资源和真实访客条件不同。
10. **不为 Google AI 搜索另造一套“专用 SEO”。** 官方仍要求可发现、可索引、有价值的内容,并没有额外必需的专用标记;应优先完成本清单基础项。[Google AI 搜索功能说明](https://developers.google.com/search/docs/appearance/ai-features)
## 11 证据入口与复核方法
### 11.1 主要代码入口
以下行号是 2026-10-22 本轮基准,后续修改可能变化;路径链接是持续入口。
| 检查内容 | 文件及本轮关键位置 |
| --- | --- |
| 页面路由、宽松分类与接收接口 | [routes/web.php](../../routes/web.php),首页/分类和 api/article 路由 |
| 分类解析 | [Web ArticlesController](../../app/Http/Controllers/Web/ArticlesController.php),50–54 行 |
| 列表、搜索、标签、详情查询 | [ArticlesService](../../app/Services/ArticlesService.php),146–280 行 |
| 全局标题、日期、canonical、OG、统计 | [app-layout](../../resources/views/components/app-layout.blade.php),1–52 行 |
| 列表标题和缺少分页链接 | [列表模板](../../resources/views/pages/articles/default/index.blade.php),1–68 行 |
| noindex、面包屑、日期、分享 | [详情模板](../../resources/views/pages/articles/default/show.blade.php),1–4、24–62、95–103 行 |
| 卡片语义、封面和分类链接 | [article-item](../../resources/views/components/article-item.blade.php),3–25 行 |
| 搜索表单与导航 | [nav-bar](../../resources/views/components/nav-bar.blade.php),27–46、105–113 行 |
| 滚动页码和搜索 JS | [app.js](../../resources/js/app.js),47–76、140–148 行 |
| robots | [RobotsController](../../app/Http/Controllers/RobotsController.php),11–19 行 |
| sitemap 集合及时间 | [SitemapController](../../app/Http/Controllers/SitemapController.php),12–25 行;[XML 模板](../../resources/views/sitemap.blade.php),11–16 行 |
| 搜索索引、日期、缓存事件 | [Articles 模型](../../app/Models/Articles.php),52–76、84–113 行 |
| 分类关联和状态 | [Categories 模型](../../app/Models/Categories.php),20、46–52 行 |
| 点赞与内容时间耦合 | [SyncArticleLikes](../../app/Console/Commands/SyncArticleLikes.php),21–55、72–80 行 |
| 180 天删除及调度定义 | [ClearDb](../../app/Console/Commands/ClearDb.php),26–37 行;[调度入口](../../routes/console.php) |
| 发布与上游数据覆盖 | [API ArticlesController](../../app/Http/Controllers/Api/v1/ArticlesController.php),35–90、96–239 行 |
| 外部搜索通知 | [IndexNowService](../../app/Services/IndexNowService.php),25–170、182–220 行 |
| 中间件与 CSRF 排除 | [bootstrap/app.php](../../bootstrap/app.php),14–25 行 |
| 新广告范围和保留要求 | [广告维护说明](ADVERTISING.md)及[广告组件](../../resources/views/components/dpl-article-ad.blade.php) |
### 11.2 本轮证据保存
[审计基线数据](SEO_BASELINE_2026-10-22.json)仅保存脱敏后的计数、代表性本地响应、内容重复组、搜索匹配计数和相关源码哈希,便于以后对照。本文件承载解释与任务状态,JSON 不另行维护一份优化计划。
临时细节与受限浏览器截图位于 `/private/tmp/fna-v3-seo-20261022/`。临时目录可能被清理,不作为后续唯一证据;正文中的关键事实和项目内基线已经固化。没有把数据库导出、账号信息、凭据、订阅内容或完整文章正文写入本次文档产物。
复核时按以下方法重新取得现场证据:
1. 读取当前项目资料、并行修改和服务状态,再记录待检查源码哈希。
2. 以本地只读数据库事务统计文章/分类/标签,记录应用和数据库时基。
3. 限定回环地址,不跟随外部重定向,不自动点击/请求点赞、API 或测试路由。
4. 检查首页、真实分类路径、标签、全部文章、分页边界、robots 与 sitemap;解析标题、canonical、robots 和实际 href。
5. 链接图从首页开始,沿实际 HTML 链接计算,不把手工塞入的文章地址冒充站内发现。
6. 浏览器拦截全部非本地网络和有副作用请求,分别测试有 JS、无 JS、直接进入分页及手机宽度。对被拦截的线上图片不判断其真实可用性。
7. 核实源码和业务数据差异,更新该基线或创建下一次有日期的证据快照;优化决策继续更新本文件。
### 11.3 本轮交付状态
- 已完成独立重新分析、230 个本地地址检查、当前数据库统计、搜索索引对照和受限浏览器复核。
- 已完成本建议文档与基线保存;清单项目尚未实施。
- 交付核对通过:36 个项目编号与总表一一对应,20 个验收场景,文内本地链接有效;195 个网站源码、资源及环境基准文件哈希未变化,文章/分类/标签已采集业务字段前后相同。GemDocs 离线文档检查通过。
- 网站源码、样式和本地私密环境配置保持本轮基准;未改业务数据,未执行调度器、队列、发布接收或外部推送。
- 为检查恢复了原本停止的本地 PHP 8103 与 Vite 5173 开发预览。框架正常请求产生的会话/缓存及 Vite 运行产物不属于业务优化修改。
- 未提交、推送、部署;未访问项目线上网站,未验收线上收录、排名或真实用户性能。
## 首页展示调整(2026-10-27)
按用户更正后的要求,`/`直接复用文章详情展示日期最新的一篇已发布免费节点文章,不限定当天。通过分类slug筛选,按created_at、id倒序选择,忽略置顶排序并排除未来时间;`/freenode`继续保留历史列表。首页绕过整页响应缓存,新的文章发布后下一次访问即可选取;未改全局时区、业务数据或其他栏目查询。无可用文章时使用现有空态。
验证:3项独立SQLite内存库测试、6项断言通过,覆盖旧日期文章、置顶、其他栏目、草稿、未来文章、同日期排序、空池和缓存边界。本地首页与免费节点列表HTTP 200,首页最新正文为fn20261021。未提交、推送或部署;首页与文章详情的canonical及noindex继承行为仍需在SEO-004/018中单独处理。
### 首页独立索引规则(2026-10-28)
按用户要求修复首页继承过期文章noindex:详情模板以articles.home路由识别首页,首页固定index, follow;其他文章详情继续按分类过期规则,编辑签名预览仍优先noindex, nofollow。日期计算使用created_at副本,避免渲染过程中修改模型日期。实测首页、fn20261021详情、freenode栏目均200,分别index/noindex/index;首页无额外X-Robots-Tag。仅本地,未提交/推送/部署;canonical规则与生产配置不属于此次已完成范围。