From b584188ce24739fe64669ef236a57603e846cd6e Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Tue, 7 Jul 2026 22:25:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci/site):=20=E7=94=A8=20!=20Content-Securit?= =?UTF-8?q?y-Policy=20=E5=88=A0=E5=AE=98=E7=BD=91=20CSP(CF=20=5Fheaders=20?= =?UTF-8?q?=E5=8F=A0=E5=8A=A0,=E6=B5=8F=E8=A7=88=E5=99=A8=E5=8F=96?= =?UTF-8?q?=E4=BA=A4=E9=9B=86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一版判断错了:CF Pages _headers 不是'首个匹配生效',而是【叠加下发】——/* 和 /user/* 都匹配 /user/,两条 CSP 都发,浏览器对多条 CSP 取交集(最严)→ 官网严格 CSP 的 style-src(无 unsafe-inline)/connect-src('self')赢,用户中心内联样式被拦、 连 API 被拦 → 裸奔 + 登录失败。正解:/user/* 里 先删掉 /* 继承的官网 CSP,再设用户中心自己的(排 /* 之后,先加后删)。其余安全头沿用 /*。 Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u --- scripts/ci/combine-site.sh | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/scripts/ci/combine-site.sh b/scripts/ci/combine-site.sh index ad41a1b..dd7afaf 100755 --- a/scripts/ci/combine-site.sh +++ b/scripts/ci/combine-site.sh @@ -22,22 +22,20 @@ rm -rf "${DIST}/user" mkdir -p "${DIST}/user" cp -R "${UC}/." "${DIST}/user/" -# 2) 合并 _headers:用户中心路径规则前缀 /user,置于官网规则【之前】。 -# ⚠️ CF Pages _headers 对同一 header 取【首个匹配规则】的值(实测:若 /user/* 排 -# 在官网 /* 之后,/user/ 页会命中在前的 /* 官网严格 CSP → 内联样式/连 API 被拦、 -# 页面裸奔)。故 /user/* 必须在 /* 之前才能让用户中心 CSP 生效。 -# 删掉并入产物里那份会被 CF 忽略的 /user/_headers,避免误导。 +# 2) 合并 _headers 的 CSP。⚠️ CF Pages _headers 是【叠加】的:/* 与 /user/* 都匹配 +# /user/,两条 CSP 都会下发,浏览器对多条 CSP 取【交集(最严)】→ 官网严格 CSP +# 的「style-src 无 unsafe-inline / connect-src 'self'」赢,用户中心的内联样式被拦、 +# 连 API 被拦 → 页面裸奔且登录失败。故在 /user/* 里用 `! Content-Security-Policy` +# 先【删掉】/* 继承来的官网 CSP,再设用户中心自己的(须排在 /* 之后:先加后删)。 +# 其余安全头(HSTS/X-Frame/…)/* 与用户中心一致,沿用 /* 即可,不重复。 rm -f "${DIST}/user/_headers" -# 行首 '/'(路径规则)前缀 /user;'#' 注释与缩进的 header 行不动。 -sed -E 's#^/#/user/#' "${UC}/_headers" > "${DIST}/_uc_headers.tmp" { - echo "# ==== 用户中心(/user/*)独立 CSP,须置于官网 /* 之前(CF Pages 首个匹配 header 生效)====" - cat "${DIST}/_uc_headers.tmp" echo "" - cat "${DIST}/_headers" -} > "${DIST}/_headers.new" -mv "${DIST}/_headers.new" "${DIST}/_headers" -rm -f "${DIST}/_uc_headers.tmp" + echo "# ==== 用户中心(/user/*):删掉官网 /* 继承的 CSP,换用用户中心自己的 ====" + echo "/user/*" + echo " ! Content-Security-Policy" + grep -iE '^[[:space:]]*Content-Security-Policy:' "${UC}/_headers" +} >> "${DIST}/_headers" echo "==> combine-site: done — 用户中心并入 ${DIST}/user/,_headers 已按 /user/* 分域合并" ls -la "${DIST}/user" | head