老模板优化

This commit is contained in:
Your Name
2026-04-17 21:09:06 +08:00
parent 4dc78e3366
commit c8fb6956ef
60 changed files with 9113 additions and 146 deletions

View File

@@ -0,0 +1,326 @@
# 1272-SEONexus 老模板蜘蛛日志与代码映射交接文档 - 2026-04-16
## 目的
这份文档是在 `1271` 的基础上继续往前走一步:
- 不再只停留在日志现象
- 而是把当前蜘蛛日志现象,映射到项目里最可能对应的代码位置
这样主 Codex 接手时,可以直接从关键入口开始排查,而不是重新全仓翻一遍。
## 和前置文档的关系
- `1269`:定义第一阶段目标
- `1270`:定义协作边界
- `1271`:沉淀蜘蛛日志观察结论
- `1272`:把观察结论映射到代码入口
## 当前最关键的代码位置
### 1. 路由层
主要文件:
- [router.php](/www/wwwroot/VideoSource2/code/app/home/config/router.php)
关键点:
- `robots``sitemap``rss``sitemap_index``sitemap-main``sitemap-videos-*` 都在这里注册
- `videoGpt1` 分支里额外注册了大量历史详情页/播放页兼容路由
- 这些兼容路由正好和日志里高频出现的旧路径高度一致
直接对应的日志现象:
- `/voddetail/...|301`
- `/vodplay/...|301`
- `/video-info/...|301`
- `/video-play/...|301`
- `/video-show/...|301`
- `/shipin/...|301`
结论:
> 这批深页历史入口并不是“无路由直接 404”而是已经被路由层接住了。日志里大量 `301 -> 200` 的前提条件之一,就是这里的兼容路由在工作。
### 2. URL 规范输出层
主要文件:
- [UrlBuilder.php](/www/wwwroot/VideoSource2/code/app/common/helper/UrlBuilder.php)
- [VideoService.php](/www/wwwroot/VideoSource2/code/app/services/VideoService.php)
关键点:
- `UrlBuilder::detail()` 默认走 `voddetail/{strPinyin}-{intVId}`
- `UrlBuilder::play()` 默认走 `vodplay/{strPinyin}-{intVId}-{strPlayType}-{intPlayIndex}`
- `VideoService::getVideoInfoUrl()` / `getVideoPlayUrl()``videoGpt1` 下优先走 `UrlBuilder`
直接对应的日志现象:
- 当前仍有大量 `voddetail` / `vodplay` 命中
- 同时又能看到 `video-info` / `video-play` / `video-show` 命中
结论:
> 当前项目里“规范输出路径”和“兼容接入路径”是两层结构。`UrlBuilder` 更像主输出,`router.php` 里的兼容列表负责兜住历史入口。
## 和首页 `/|301` 最相关的代码点
### 1. DomainModel 的 host 归一口径
主要文件:
- [DomainModel.php](/www/wwwroot/VideoSource2/code/app/model/DomainModel.php)
关键点:
- 存在 `canonical_mode`
- 存在 `play_index_mode`
- 多处会对 host 做 `preg_replace('/^www\\./', '', ...)`
这说明:
- 系统里已经有“规范 host / canonical 策略”的概念
- 但从日志看,裸域和 `www` 仍然同时被抓,说明这套策略没有完全在前台最终输出和真实访问上闭环
### 2. SiteContext 的域名识别口径
主要文件:
- [SiteContext.php](/www/wwwroot/VideoSource2/code/app/services/SiteContext.php)
关键点:
- `getTemplate()` 用的是 `Request->rootDomain()`
- 然后用 root domain 去取 `DomainModel`
对应判断:
- 这有利于让 `www.xxx.com``xxx.com` 落到同一个站点配置
- 但这本身不会自动消除首页 `301`
- 它更多解决的是“能不能识别到站点”,不是“是否直达最终规范 host”
结论:
> 日志里大量 `/|301` 更可能是前台实际访问入口、host 规范和模板/链接输出之间还没有完全统一,而不只是域名识别不到。
## 和深页 `301` 最相关的代码点
### 1. 兼容路由列表
主要文件:
- [router.php](/www/wwwroot/VideoSource2/code/app/home/config/router.php:166)
这里显式注册了大量历史深页入口,包括:
- `voddetail`
- `vodinfo`
- `vod`
- `video-info`
- `video-detail`
- `video`
- `shipin`
- `vodplay`
- `video-play`
- `video-show`
- `shipin-play`
- `shipin-bofang`
这和日志完全对上了。
结论:
> 现在看到的大量深页 `301`,很可能正是“旧入口先接住,再跳到当前 family 主输出 URL”的结果。
### 2. VideoService 的主输出链接
主要文件:
- [VideoService.php](/www/wwwroot/VideoSource2/code/app/services/VideoService.php:80)
关键点:
- 详情页和播放页主输出都优先走 `UrlBuilder`
- 如果站点 family 不是历史路径样式,那么历史外链进来后出现一次 `301` 是符合当前结构的
这也解释了为什么:
- `yagyjt.com` 已经能深抓
-`detail|301` / `play|301` 仍然很高
结论:
> 代码结构上,深页 301 并不奇怪;真正值得主 Codex 继续排的是:哪些 `301` 是必要兼容,哪些 `301` 已经可以进一步压缩。
## 和 canonical / robots 最相关的代码点
### 1. SiteStyle 的 SEO meta 构建
主要文件:
- [SiteStyle.php](/www/wwwroot/VideoSource2/code/app/common/helper/SiteStyle.php:1800)
关键点:
- `detectPageType()` 目前只明确识别:
- `home`
- `voddetail/*` -> `detail`
- `vodplay/*` -> `play`
- `search`
- 部分 `rank`
- 部分 `category`
- `buildSeoMeta()` 里:
- detail 默认 `index,follow`
- play 默认 `noindex,follow`
- play canonical 会回指 detail
### 2. 当前存在的明显风险
`guessDetailUrlFromVideo()` 目前是硬编码回:
- `/voddetail/{slug}-{id}`
-`/voddetail/{id}`
这意味着:
- 如果站点当前主 family 并不以 `voddetail` 作为规范详情路径
- 或者主输出已经切到别的 detail pattern
- 那么模板 canonical 就可能和当前主输出路径不完全一致
这是当前最值得主 Codex 重点核对的一点。
### 3. DomainModel 配置和模板输出暂未明显打通
虽然 `DomainModel` 已有:
- `canonical_mode`
- `play_index_mode`
但从当前代码检索结果看:
- 这些配置主要存在于模型默认值、标准化、bootstrap 汇总
- 前台模板 meta 生成仍主要靠 `SiteStyle::buildSeoMeta()`
-`SiteStyle::buildSeoMeta()` 没有明显读取 `DomainModel` 的这两个配置
结论:
> 现在“配置层有 canonical/play_index 策略”和“前台模板真实输出什么 canonical/robots”之间存在未完全打通的风险。
## 和 sitemap 最相关的代码点
### 1. 前台 sitemap 读取
主要文件:
- [SiteContext.php](/www/wwwroot/VideoSource2/code/app/services/SiteContext.php:505)
关键点:
- `getSiteMapByCode()` 只是按约定文件名读取 `storage/SiteMap/{domain}/...`
- 如果文件不存在,直接返回 `404`
这说明:
- `sitemap*.xml` 的稳定性,既依赖路由,也依赖离线文件是否实际生成成功
### 2. sitemap 生成逻辑
主要文件:
- [SiteMapLogic.php](/www/wwwroot/VideoSource2/code/app/task/logic/SiteMapLogic.php)
- [VideoSiteMapLogic.php](/www/wwwroot/VideoSource2/code/app/task/logic/VideoSiteMapLogic.php)
关键点:
- 两处生成逻辑里多次直接写:
- `https://www.{$DomainModel->d_domain}/...`
- `VideoSiteMapLogic` 生成视频详情页时,会优先读当前 `url_family['detail']['pattern']`
- 但最终 host 仍然是硬拼 `https://www.` + domain
这和日志里的 host 分裂现象是高度相关的。
结论:
> 如果站点真实规范 host 不是 `www`,或者前台访问并没有完全锁在 `www`,那么 sitemap 长期输出 `https://www.xxx.com/...` 本身就可能持续制造首页和深页的规范化跳转。
## 和“非 404 而是随机回落”的代码点
主要文件:
- [VideoService.php](/www/wwwroot/VideoSource2/code/app/services/VideoService.php:760)
关键点:
- `getVideoByVId()` 在直接按 `v_id` 查不到时,会进入 `resolveFallbackVideoByRequest()`
- `resolveFallbackVideoByRequest()` 会:
- 先看绑定表
- 再随机采样可播放视频
- 再做兜底有序回落
- 命中后会把“请求的旧 id”绑定到“随机或兜底找到的新视频 id”
这说明:
- 某些旧深链并不一定直接 404
- 也可能被系统兜底绑定到别的视频,再输出一个可访问页面
对应日志判断:
- 这能解释为什么一部分历史深链现在表现成 `301 -> 200`
- 但也意味着 canonical 和真实内容语义一致性要特别小心
## 给主 Codex 的代码排查优先级
### 1. 先查 host 规范是否被多处硬编码成 `www`
优先看:
- `SiteMapLogic.php`
- `VideoSiteMapLogic.php`
- 任何模板里直接拼域名的位置
原因:
- 这最直接对应日志里的 `/|301`
- 也最直接对应裸域 / `www` 分裂
### 2. 再查 canonical 是否仍硬编码成 `/voddetail/...`
优先看:
- `SiteStyle::buildSeoMeta()`
- `SiteStyle::guessDetailUrlFromVideo()`
原因:
- 当前 detail/play 主输出已经有 family 概念
- canonical 仍硬编码 `voddetail` 风险较大
### 3. 再查历史兼容路由是否仍有可压缩空间
优先看:
- `app/home/config/router.php` 的 legacy compat 段
原因:
- 这直接对应日志里大量 `video-info` / `video-play` / `video-show` / `shipin` 的命中
- 主线要判断哪些入口必须保留,哪些入口可以进一步合并或缩短跳转链
### 4. 最后查 fallback 视频绑定是否会放大“错链也 200”
优先看:
- `VideoService::resolveFallbackVideoByRequest()`
原因:
- 这条链对“减少 404”有帮助
- 但如果过度回落,也可能把错误深链转成语义不一致的 `200`
## 给主 Codex 的一句话交接
如果主 Codex 要开始从实现层排这轮蜘蛛问题,最值得先看的不是模板样式,而是:
> `router.php` 的历史兼容入口、`SiteStyle` 的 canonical 输出、`VideoSiteMapLogic/SiteMapLogic` 的 `www` host 拼接、以及 `VideoService` 的 fallback 回落链。