做多语言网站时,很容易看到一种奇怪的走势。
“默认语言的访问是不是在降?” “英语、中文、其他语言反而在涨?” “等等……默认语言里的访问不会有我自己吧?”
这三件事完全可能同时发生。
外语页面的真实搜索流量在增加。 默认语言的外部流量可能正在变弱。 与此同时,站长会不停打开新文章、检查链接、回首页、修完再刷新,于是默认语言里出现了一位极其忠诚的“读者”。
通常就是站长自己。
这篇文章讲清楚:如何排除自己的浏览器访问、localStorage和Cookie怎么选、为什么“我打开过页面”不等于“已经登记为站长”、历史数据怎么办,以及多语言网站的真实增长应该怎么看。
1. 不要先看总PV,先拆成外部进入和站内跳转
如果站长经常检查默认语言页面,总PV很容易被自己放大。
常见操作包括:
- 直接打开刚发布的文章
- 从首页进入文章
- 点击相关文章
- 电脑和手机都检查
- 发布后反复刷新
- 过一会儿再回来确认线上状态
普通读者可能看一页就离开。 站长却同时扮演编辑、QA、读者和监控系统。
所以多语言网站至少应该把“外部首次进入”和“站内跳转”分开。
如果外语页面的外部进入在增长,而默认语言的大量访问来自站内跳转,那么“默认语言绝对占优势”里面可能混进了“站长一直在默认语言界面巡逻”。
2. “我打开了,算登记了吗?”——没有实际写入标记,就没有
假设你决定把自己的浏览器标记为owner,然后打开了一次网站。
这样就自动登记了吗?
不会。
浏览器不会自动理解:
“这个人看起来像站长,以后别计入PV。”
必须真的写入某种状态,例如:
- localStorage里的owner标记
- Cookie里的owner标记
- 已登录管理员账号里的内部流量设置
- 服务端的内部流量标签
打开页面只是访问。 登记owner是状态写入。
没有代码执行写入,就没有登记。
3. localStorage和Cookie应该选哪个?
浏览器级别常见的两种方案是localStorage和Cookie。
localStorage
localStorage会按origin保存在浏览器中,并可跨普通浏览会话保留。
例如:
localStorage.setItem("analytics_owner", "1");
客户端分析代码可以在发送事件前检查:
if (localStorage.getItem("analytics_owner") === "1") {
return;
}
优点是简单。
缺点是服务器或Edge Worker收到最初HTTP请求时看不到浏览器内部的localStorage。
Cookie
Cookie会在符合条件的HTTP请求中发送给服务器。
例如:
document.cookie =
"analytics_owner=1; Path=/; Max-Age=31536000; SameSite=Lax; Secure";
服务器或Edge Worker可以先检查Cookie,再决定是否计数。
更完整的做法是通过已登录的管理页面或私有设置入口由服务器返回Set-Cookie。如果JavaScript不需要读取,也可以考虑HttpOnly。
不过,这个标记只能用于“分析排除”。
不要把用户可写的Cookie或localStorage当作身份认证或权限控制。否则就像谁给自己胸牌写上“老板”,谁就能进老板办公室。
4. 服务端或Edge计数用Cookie,纯浏览器事件用localStorage
选择方法取决于“在哪里计数”。
只有浏览器JavaScript发送事件
localStorage通常足够。
页面加载后,在发送分析事件之前检查owner即可。
CDN、Edge Worker、服务器或访问日志计数
Cookie更合适。
服务器在浏览器JavaScript执行之前就已经收到请求。
localStorage只存在于浏览器内部。 Cookie会随请求发送。
目标相同,但计数位置不同,工具也不同。
5. 个人网站可以用“一次设置”解决
大公司可以用办公室IP、企业账号或设备管理识别内部流量。
个人网站不必这么复杂。
简单流程可以是:
- 打开只有自己知道的设置页面
- 写入长期但有限期的owner Cookie
- 带有该Cookie的请求不进入统计
- 提供取消owner状态的方法
注意它是“浏览器级”的。
电脑Chrome、手机浏览器、另一个浏览器、另一个Profile、隐私模式都分别需要设置。
设置一次并不会让宇宙里所有版本的你同时消失。
6. 历史访问不会自动减少
今天开始排除owner,并不会让昨天的PV自动下降。
通常的目标只是:
“从现在开始不要再混入。”
如果要修正历史数据,就要重新处理原始日志或重新生成聚合数据。
对于刚起步的小网站,为了纠正过去几十次自己的访问而花大量时间,通常不划算。
标注一个时间点即可:
“此前数据可能包含运营者访问,此后已排除。”
数据分析不是修史工程。
7. GA4内部流量过滤和自定义浏览器标记不是一回事
Google Analytics 4提供了官方的内部流量排除方法:可以通过IP地址定义内部流量,再用数据过滤器排除。
固定办公室网络很适合。
但个人运营者可能会在家庭Wi-Fi、手机流量、旅行网络、热点、VPN之间切换,IP识别会变得麻烦。
如果是自建第一方分析系统,浏览器Cookie或登录状态有时更方便。
但二者不是同一个功能。
使用GA4就按GA4的内部流量流程设置并先测试。 使用自建分析,就在自己的数据采集点排除owner。
8. 判断多语言增长,要看排除owner后的外部进入
自己的访问会扭曲语言对比。
假设总PV是:
默认语言70
外语30
但默认语言70里有:
- 20次站长检查
- 20次站内跳转
- 30次外部进入
而外语30几乎全部是外部进入。
那么真实的新增需求已经完全不是“70对30”了。
判断搜索和发现增长时,更应该比较:
默认语言外部进入
对
外语外部进入
同时还要区分日数据和7日滚动数据。
滚动总数下降,可能只是一个早期高峰日离开统计窗口,并不等于今天突然没人看。
9. 最低限度测试流程
不要停在“应该生效了”。
至少验证:
- owner标记是否真的保存在浏览器
- 打开一个普通页面
- 确认分析事件没有记录,或被标记为owner后丢弃
- 用另一个浏览器确认普通访问仍会计数
- 删除owner标记后确认计数恢复
浏览器开发者工具可以查看localStorage和Cookie。
“我打开过设置页”不是证据。
电脑会严格执行代码,但不会读心。
10. 总结——先把自己从样本里请出去,再庆祝国际化
看到外语页面开始有人访问,当然值得高兴。
但默认语言里往往住着一个最忠诚的读者:站长本人。
所以:
- 分开外部进入与站内跳转
- 明确标记owner浏览器
- 浏览器端事件使用localStorage
- 服务端或Edge计数使用Cookie
- 单纯打开页面不会自动登记
- 历史数据不必强行回滚
- 多语言需求看排除owner后的外部进入
这样,数字才开始真正说人话。
海外读者确实可能来了。
只是在庆祝之前,先确认主场比分不是自己一个人刷出来的。
参考资料(3条)
- MDN: Window.localStorage
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage - MDN: Set-Cookie header
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie - Google Analytics Help: Exclude internal traffic
https://support.google.com/analytics/answer/10104470
