管理员进入「管理 → 统计 → 来源网站」,可按网站域名搜索、分页、排序,并组合时间范围、用户 ID、Key ID、接口路径、来源依据和来源状态。用户或 Key 填 0 可筛选未登录或未用 Key 的调用。点击网站后可查看用户、当前 Key 标签、接口的调用/失败次数、最后调用时间及尚存请求;有请求 ID 的记录可跳转到原有请求详情。
- 有效 Origin 优先,有效 Referer 兜底。仅接受 HTTP/HTTPS,拒绝凭证、控制字符、反斜杠、多值及非法域名。Origin 不接受路径、查询或片段;允许尾部单个
/以兼容已有客户端。域名统一为小写 ASCII(Unicode 使用 IDNA),移除根域名尾部点,保留完整合法域名,IPv4/IPv6 和端口网址继续可解析,统计不按端口分组。 - 两头均有效且域名不同记
conflict,选 Origin;相同记matched。只有单一有效头记single;无有效 Origin 且提供过 Origin 时使用 Referer 记fallback。均无法解析时分为missing(未提供)、opaque(null 来源)或invalid(无效)。 - 这些请求头可以被客户端伪造,不能作为身份认证。 未提供来源不等于直接访问,更不能确定是某个网站。Key 的现有域名/IP 规则、通配符语义和任一规则匹配策略继续使用;网站域名匹配采用同一个安全解析器,不改变凭证、权限、配额或规则设置。无效/非 HTTP 头不再用于匹配。
referer兼容字段保存选中的来源域名;新增source_basis、source_state、origin_host、referer_host。不保存完整来源 URL、路径、查询、Cookie、Authorization、原始 Key 或原始请求头。来源接口只查询白名单字段;Key 标签为当前记录中的名称,改名、删除或编号复用时无法恢复历史名称,只能辅助归属。- 来源调用量统计已写入 request_log 的调用;失败为其中 HTTP 状态码 ≥400。沿用原有规则:429 不写明细,在限流统计中单独计数。API Key 无效等未记录的请求不纳入来源排行。
- 来源占比以全部筛选结果的调用次数为分母,包括未知来源和未显示的页面。页面列出本页之外的调用次数;原有全站 Top20 和单接口 Top10 的接口响应同时提供完整分母、未知及其他来源数,单接口排行显示其他来源和未知来源。
source_daily 按北京时间日期、完整域名、来源依据/状态、用户 ID、Key ID、接口路径聚合,保存调用、失败和最后时间。数据库启动迁移在一个 BEGIN IMMEDIATE 事务中安装字段、回填、元数据标记和 AFTER INSERT 触发器。请求原始明细和来源汇总原子提交;回滚时两者均不落库。重复执行迁移或重启不会再次累加。删除原始明细不会扣减来源日汇总。
默认日汇总保留 365 个北京时间日期(含当天),可用环境变量 SOURCE_RETENTION_DAYS 设置为 1–3660;不添加后台凭证或权限设置。pruneLogs() 沿用启动及每 6 小时清理,同时清理过期来源日汇总。请求明细仍按 LOG_RETENTION_DAYS(默认 30 天)清理。缩短保留期会在下次清理时删除更老的来源日汇总,延长后不能恢复已删除数据。
迁移仅能回填尚存的旧日志。旧日志已丢失原始头,来源依据记 legacy,无法恢复 Origin/Referer 的优先选择或冲突。旧版恰好 100 字符的域名可能已被截断,保守归入未知并记 legacy_unverifiable,不会把截断前缀归给另一个网站;原始无效值同样无法核实。清理前已丢失的历史不能恢复。source_meta 永久记录迁移时间、回填最早/最晚时间;界面明确显示迁移前可能不完整、早于可回填记录及保留期之外的区间。
整日查询使用持久日汇总,非整日首尾使用尚存原始明细,按 [from,to) 查询,避免重复或把额外整日计入 24h 等范围。非整日边界已过期时不会扩成整日;响应标明缺失边界。迁移前的区间始终标为可能不完整,不能把日志中存在的空档证明为零调用。
均为 GET,先校验管理员再解析参数,响应 Cache-Control: no-store:
| 路径 | 内容 |
|---|---|
/admin/analytics/sources |
网站分页、完整分母、失败、未知/冲突、最后时间、覆盖说明 |
/admin/analytics/source-attribution |
按用户、Key、接口分页的归属统计 |
/admin/analytics/source-requests |
保留期内请求明细分页及来源依据,可凭 rid 查原有详情 |
/admin/request?rid=... |
原有请求详情,增加来源依据/状态及两个头中已规范化的域名 |
共同参数:range=today|24h|7d|30d|90d|custom(默认7d);自定义使用 from=YYYY-MM-DD&to=YYYY-MM-DD,含结束日。来源筛选为 q(域名子串,LIKE 通配符按字面匹配)、host(精确域名,空值表示未知)、user/key(非负整数 ID)、path(精确接口路径)、basis/state。page 从1开始,size 为1–100(默认20),sort=calls|errors|lastAt。归属按该排序,原始请求固定按时间倒序。超出末页会夹到末页,排序并列时使用固定维度排序。所有值通过 SQL 参数绑定,列名和排序使用白名单。
现支持 traffic=business|internal|all,默认业务;来源日汇总另按记录时的分类保留,明细展示分类及来源依据。未分类历史保留在业务和全部中,不按来源头猜测测试身份。详见 内部测试隔离。
运行 node --test test/source.test.js 可验证解析、隐私、迁移、回滚、清理、排行、分页、参数与鉴权。完整回归使用 node --test。现有 test/user-calls.test.js 的迁移用例需要 data/onboarding 临时目录;Windows 的 git archive 字节核验需要本地克隆的 core.autocrlf=false。
node scripts/source-preview.js 启动只监听 127.0.0.1 的内存合成数据预览。该脚本不加载调度器、预热或巡检,不使用生产数据库;其预览登录路由只在手动运行该脚本时存在,不在正常服务中注册,也不生成 API Key。
可使用已安装的 Playwright 运行 node scripts/check-source-ui.js;PLAYWRIGHT_MODULE 可指定 Playwright 的模块 URL,CHROMIUM_PATH 可指定真实浏览器路径。无需为正常应用安装依赖。证据默认输出到被 Git 忽略的 data/source-evidence:桌面/窄屏全页、来源区域、归属弹窗、空/错误状态及 JSON 结果。区域截图隐藏固定顶栏以避免长截图拼接遮挡,全页截图保留实际界面。所有截图均使用合成数据。