概述 — 涵盖内容
除了登录之后的控制台,InfraGuard 还有一个 公开界面。
| 路径 | 页面 | 访问权限 |
|---|---|---|
/ |
营销落地页 | 访客(已认证的会话会重定向到 /console) |
/demo |
演示申请表单 | 访客 |
/manual |
用户手册 | 访客与已登录用户同样可访问 |
/login · /lang/{locale} |
登录 · 语言切换 | 访客 |
控制台首页位于 /console。这次迁移把 / 让给了公开界面,同时没有破坏路由名(overview)或已有的书签。
落地页被构建为独立的打包产物(front.*)。 若把它放进控制台的打包产物,每位访客都要下载 Vue、ECharts、CodeMirror、Konva 和 xterm(实测:控制台约 1,283KB,前台 24KB)。对营销页面而言,第一印象 就是 加载速度。只有必须共享的最小 UI(图标按钮、语言切换器)放在
_shared-ui中,使两侧使用 同一份定义 — 若靠复制粘贴,只改一侧就会产生分歧。
公开手册
/manual 无需登录 即可打开。正在评估产品的人应该能读到它实际是如何运维的,而公开文档本身就是营销与 SEO 资产。文档中不含任何机密信息与实时数据。
- 一个 URL,两套外壳 — 访客得到公开外壳(页头、页脚、语言切换器),已登录用户得到控制台外壳,两者渲染相同的正文。视图与页面模块是共享的,因此两者不会产生分歧。
- 访客另外只会收到 手册专用的子打包产物(
manual.*);控制台的打包产物永远不会下发给他们。 - 面向高权限功能的文章会 标记为锁定而不是隐藏。访客按等级 1 对待。
- 入口是落地页首屏中的 [用户手册] CTA 与顶部导航。
演示申请
公开表单(/demo)
这是申请受理,而不是一键演示。只有姓名和工作邮箱是必填项;语言环境、来源渠道和 IP 会一并记录。
该表单是 应用中唯一的访客写入路径,因此有四重防护。
- 蜜罐 — 若被填写,不会保存任何内容,但响应仍然看起来像 成功(绝不宣告已识别)。
throttle:8,1— 一分钟内的第九个请求会得到 429。- CSRF 令牌。
- 带白名单的服务端校验 —
status与note仅限管理员,因此公开表单无法设置它们。
管理界面(管理 ▸ 演示申请)
/admin/demo-requests 运行这个收件箱:模态框 CRUD,外加搜索、带计数的状态筛选和分页。
| 状态 | 含义 |
|---|---|
new |
已收到,尚未处理 |
contacted |
已联系 |
qualified |
已确认为有效商机 |
closed |
已结束 |
- 在行内直接修改状态,或在模态框中留下内部 备注。
- 受理上下文(IP、语言环境、来源、时间戳)以 只读 方式显示。
- 状态分面 无论当前筛选如何都统计整张表 — “还有多少未处理”不能因为加了筛选就消失。
搜索会 转义 LIKE 通配符(
%、_、\)。否则,只输入一个%就会匹配到每一行。
分析标签(GA4 · GTM · Search Console)
在 .env 中填入衡量 ID,标签就 只会出现在公开界面上。当该值为空时根本不会渲染 <script>,因此 默认部署不会发出任何对外请求。
| 键 | 值 | 用途 |
|---|---|---|
GA_MEASUREMENT_ID |
G-XXXXXXXXXX |
gtag.js(GA4) |
GTM_CONTAINER_ID |
GTM-XXXXXXX |
Google Tag Manager(可并行运行) |
GOOGLE_SITE_VERIFICATION |
meta 令牌 | Search Console 所有权验证 |
GA_PRODUCTION_ONLY |
true(默认) |
仅在生产环境触发 |
绝不要把这些加到控制台(
layouts/app)。 控制台的 URL 和标题会带上主机名、IP、实例别名和事件标题。把它们发送给第三方分析媒体资源,与落地页自己作出的自托管和数据主权承诺相矛盾,并且会泄露客户的基础设施细节。
- ID 只有通过格式校验后才会输出(
G-…/GTM-…)。拼写错误或夹带引号的值会降级为 “没有分析”,而不是产生一个损坏的标签。 GA_PRODUCTION_ONLY默认为true— 本地和预发布流量一旦污染了媒体资源,事后无法清理,而这正是 GA4 数字失去信任的最常见原因。- 转化在成功页面触发,而不是在提交时触发。 在提交时触发会把校验失败和蜜罐命中也算作转化,从而虚增数字。
- CTA 按位置区分(
hero、header、footer_cta、footer_nav、hero_manual),以便归因各自的贡献。 - 如果
gtag不存在,这段 JS 完全是空操作 — 分析脚本加载失败绝不会阻塞 UI。
GA4 不会给你搜索关键词。 它只报告渠道(自然搜索)就到此为止;查询词只存在于 Search Console 中。这就是所有权验证 meta 标签 独立于 GA4 输出的原因 — 你完全可以不启用 GA4 也能验证所有权。按站点的报表参见 访客与搜索洞察。
文案方针
落地页上的信任数字 只使用能在代码中数出来的内容,而且是 在渲染时统计而非硬编码(规则集数量、检查项数量、邮件/短信适配器数量等)。
这条方针抓到了一个真实错误 — 检查项是 36 而不是 37。反过来,绝不使用观测值:不同特征签名的数量在 24 小时内为 43、7 天内为 67、总体为 79,它们会在每次访问之间变化,非但建立不了信任反而会损害信任。既然是公开页面,它也 绝不访问数据库 — 每次访问一次查询没有必要,而且营销界面应该在数据库不稳时依然可用。
数据来源
| 对象 | 位置 | 作用 |
|---|---|---|
infr_demo_request |
default(000770) | 演示申请收件箱(status、note、locale、source、ip) |
config/analytics.php ← .env |
config | 衡量 ID 与开关的唯一事实来源(App\Support\Analytics) |
public/brand/ |
静态文件 | Logo 与 OG 图片 |
public/brand/必须提交到版本库。public/中大部分是生成产物(build、hot、storage已被 gitignore),所以很容易漏掉,但品牌素材 不是 Vite 的输出 — 没有任何构建会生成它们,不提交就会导致生产环境的 Logo 与 OG 图片 404。OG 图片必须是 PNG:许多社交媒体爬虫不会渲染 SVG 预览。
访问权限
- 落地页、演示表单、手册:公开。
- 管理 ▸ 演示申请:等级 ≥ 10(自我把关),且每一次变更都会记录到
infr_audit_log。
故障排查 · 常见问题
/总是把我送到控制台 — 这是正确的:已认证的会话会被重定向到/console。请退出登录,或使用隐私窗口查看落地页。- 标签始终不出现 — ID 为空、未通过格式校验,或者当前并非生产环境却设置了
GA_PRODUCTION_ONLY=true。在页面源码中搜索googletagmanager.com即可确认。 - GA4 什么都没采集到 — 请检查站点上的衡量 ID 是否属于你打算查看的那个 媒体资源(GA4 管理 ▸ 数据流)。如果数据进了另一个媒体资源,报表就会永远显示为零。
- 有一条演示申请没有被保存 — 命中蜜罐会 返回成功但不保存(这是预期行为)。另外请检查校验错误和每分钟 8 次的限制(429)。
- 切换器里列出八种语言,但只有 ko/en 有翻译 — 其余会回退到英文。未翻译语言的实际需求通过分析的
language参数来观测。 - 全新部署后立刻出现 500 — 必须把 nginx 配置成等待 Vite 构建完成。既然公开落地页就是
/,否则爬虫和潜在客户的第一印象就是一个 500。
相关内容
