Skip to content

Commit e0d75f1

Browse files
fix(feed): sanitizeMediaUrl 自动把 http:// 升级到 https://
后端 OgFetchService 已在抓取阶段把 og:image 升到 https,这里是 defense-in-depth: - 历史数据未回填的 http:// 封面仍能在 feed 卡片显示 - LLM 兜底回填或未来新 site adapter 漏 https 升级时前端兜一层 - HTTPS 页面加载 http:// 图片会被 mixed-content policy 拦掉显示成裂图, 线上 /feed 上小红书两条卡片就是这个症状 不动相对路径("/x.jpg")和已是 https 的 URL;非 http(s) 协议在 sanitize 阶段 就被白名单拒了,走不到升级分支。
1 parent 9ee4e82 commit e0d75f1

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

lib/url-safety.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,20 @@ export function sanitizeExternalUrl(
4949
* 媒体(<img src> / <video src> / <iframe src>)场景:只允许 http(s)。
5050
* mailto 无意义;data: 虽然对 <img> 较常用但体积和审计风险高,默认不放;
5151
* 站内相对路径允许(/logo.png、/event/cover.webp 这些)。
52+
*
53+
* 自动 http -> https 升级:后端 OgFetchService 已在抓取阶段做一次升级,
54+
* 这里是 defense-in-depth —— 万一某条历史数据漏网(或 LLM 兜底回填了
55+
* http:// 的封面),前端再升一次。HTTPS 页面加载 http:// 图片会被
56+
* mixed-content policy 拦掉,宁可不显示也别让浏览器报黄锁。
5257
*/
5358
export function sanitizeMediaUrl(
5459
raw: string | undefined | null,
5560
): string | null {
56-
return sanitize(raw, SAFE_MEDIA_PROTOCOLS, true);
61+
const safe = sanitize(raw, SAFE_MEDIA_PROTOCOLS, true);
62+
if (!safe) return null;
63+
// 显式判前缀避免误升级相对路径("/x.jpg" 不会进这里,但保险)
64+
if (safe.toLowerCase().startsWith("http://")) {
65+
return "https://" + safe.substring(7);
66+
}
67+
return safe;
5768
}

0 commit comments

Comments
 (0)