FAQ

深入问题解答

这里收录的是官方指南之外的进阶问题——统计原理、疑难排查、特殊场景、企业名片。
如果你还没接入,先去 如何使用 页面。

各种建站环境怎么接入

不同技术栈的接入方式,代码位置一样,但方法各有讲究
WordPress 怎么加统计代码?

三种方式,按推荐度排序:

  1. 编辑主题文件:外观 → 主题文件编辑器 → 找到 footer.php,在 </body> 前粘贴代码。升级主题可能会丢失,需重新加。
  2. 用插件:装 "Insert Headers and Footers" 或 "WPCode",在 Footer 代码区粘贴,不受主题更新影响,推荐。
  3. 子主题:如果用的是自己做的子主题,直接把代码加到子主题的 footer.php 里,最稳妥。
不要用「统计代码」类插件里自带的第三方统计功能,那些是给 Google Analytics 用的,格式不兼容我们的代码。
Vue / React 单页应用(SPA)能统计吗?

可以,但要注意 SPA 的特点:页面切换不刷新,普通埋点只会记录首次进入的页面。

解决方法——在路由变化时手动上报:

Vue Router 示例:

router.afterEach((to) => { if (window.WStats) window.WStats.track && window.WStats.track(to.fullPath); })

或者更简单的方式:把 <script> 代码放进 public/index.html 的 </body> 前,然后在路由的 afterEach 里调用 window.WStatsSearch(暂不支持的场景可以联系定制)。

我们的脚本会监听 location.pathname 的变化并自动上报,但仅限浏览器原生跳转。前端路由(history.pushState)默认不会触发,需要手动处理。
Hexo / Hugo / Jekyll 静态博客怎么接?

所有静态博客生成器都有「公共模板」或「layout」概念,改一个文件,全站生效:

  • Hexo:编辑 themes/你的主题/layout/_partial/footer.ejs(或 .swig)
  • Hugo:编辑 layouts/partials/footer.html
  • Jekyll:编辑 _includes/footer.html

粘贴位置一样——都在 </body> 前。生成后重新构建即可。

网站用了 Cloudflare 代理,统计还准吗?

准。但有一个细节需要注意:

开启 Cloudflare 代理后,你服务器日志里看到的 IP 会是 Cloudflare 的 IP(如 172.71.x.x),访客真实 IP 会放在 X-Forwarded-For 头里。

我们的采集脚本已经处理了这个情况,会优先读 X-Forwarded-For,所以你看到的还是访客真实 IP。如果你发现后台全是 Cloudflare 的 IP,说明你的 Nginx 配置把 X-Forwarded-For 覆盖了,需要在 Nginx 里加:

real_ip_header X-Forwarded-For;

set_real_ip_from 0.0.0.0/0;

网站是多个页面(多 HTML),需要每个都加吗?

是的,每个 HTML 页面都要加。因为统计脚本是页面级的,浏览器加载哪个页面就执行哪个页面的脚本。

批量添加方法(宝塔终端):

find /www/wwwroot/你的网站 -name "*.html" -exec sed -i 's#</body>#<script src="/stats/track.js" data-site="xxx"></script></body>#g' {} \;

如果是 PHP、JSP、ASP 网站,把代码放在公共的 footer 文件里,一次搞定。

可以统计通过 APP / 小程序访问的流量吗?

APP 内嵌网页:可以,代码放进 WebView 加载的 HTML 里就行。设备/系统会自动识别为 iOS 或 Android。

小程序:不行。小程序不是浏览器环境,不执行 JS 脚本。如果你的小程序里有 web-view 组件加载了你网站的页面,那部分可以统计。

原生 APP 直接请求接口:不行。这不是网页访问,没有 referer、没有 UA,我们统计不了。

统计数字背后的原理

看懂这些,你就能理解为什么不同工具的数字对不上
为什么我们的数据比百度统计 / GA 的数字少?

三个主要原因:

  • 过滤更严格:百度统计、GA 都会采集「疑似真人」的访问(包括某些爬虫、预渲染、疑似机器人的访问)。我们的脚本 collect.php 里主动过滤了 10 类爬虫 UA,被过滤掉的不计入。
  • 不加载 JS 的不统计:纯静态爬虫不会执行 JS,自然拿不到数据。这其实是优点——你的数字更"干净"。
  • UV 计算方式不同:我们用的是 localStorage 里的 visitor_id,清缓存或换浏览器会重新计。GA 用的是 Cookie,算法更复杂。
数字少不代表统计不准,只是统计口径不同。你应该更关注趋势而非绝对数值。
同一访客刷新多次,UV 会重复计数吗?

不会。visitor_id 存在浏览器的 localStorage 里,同一个浏览器一天内无论访问多少次,UV 都只算 1。

以下情况会算成新访客:

  • 用户清空了浏览器缓存 / 换了浏览器
  • 用户开了无痕模式
  • 用户换了设备(手机 → 电脑)
  • 用户换了网络(从公司 WiFi 换成 4G,IP 变了但 vid 没变,仍算同一访客)
时区是按服务器还是按访客算的?

按服务器时区。我们用的是 PHP 默认的 date() 函数,输出服务器本地时间。

如果你的服务器是北京时间(亚洲/上海),那所有统计都按北京时间切天。如果你的服务器是 UTC 或美国时区,建议在 Nginx 或 PHP 里设置时区:

date_default_timezone_set('Asia/Shanghai');

改时区后,之前的日志仍按旧时区解读。如果数据重要,改时区前先导出备份。
"停留时长"、"跳出率"是怎么算的?准确吗?

停留时长通过 track.js 里的 beforeunload 事件上报。用户关闭或切换页面时,脚本计算从进入页面到离开的秒数,然后上报。

不准确的情况:

  • 用户直接关掉浏览器进程(不是关闭标签页),脚本可能来不及执行
  • 用户手机切到后台长时间不动,脚本仍会计入时长
  • 用户网络断开,上报失败

跳出率:只访问了 1 个页面就离开的访客,占总访客的比例。是行业通用定义。

这些数值都是近似值,看趋势即可,别太较真。

为什么地图上有些 IP 显示"中国 0 0"?

IP 归属地查询依赖 ip-api.com 的免费接口,有时候会:

  • 识别不到具体城市,只返回国家
  • 某些内网 IP、CDN 回源 IP 无法识别
  • 接口偶尔超时(我们设了 2 秒超时)

识别失败会显示为空,不影响其他数据。同一 IP 30 天内只查询一次,所以偶发的失败是短时的。

疑难排查

明明加了代码却没数据?按这个清单逐项排查
排查第一步:F12 看请求

打开你的网站,按 F12 → 切到 Network(网络) 面板 → 在过滤框输入 collect。

观察是否有 collect.php 的请求:

  • 状态 204:✅ 上报成功,去后台看数据
  • 状态 403:站点标识不匹配,检查 data-site
  • 状态 404:路径写错了,检查 src 或 data-api
  • 红色 CORS 错误:跨域没配置好
  • 没有请求:脚本没加载,或放错位置
代码加对了,F12 也有 204,但后台没数据

按顺序检查:

  1. 日期选对了吗?后台默认显示"昨天",如果你刚测试,切到今天才看得到。
  2. 站点选对了吗?左上角下拉菜单切换到你正在测试的站点。
  3. 数据目录权限?宝塔终端执行:chown -R www:www /www/wwwroot/你的网站/stats/data
  4. 服务器时间不对?执行 date 看是否和现实时间一致。
  5. 看看日志有没有写入:ls -lh /www/wwwroot/你的网站/stats/data/{站点标识}/
跨域统计没数据(网站和统计后台不同域名)

跨域需要 3 个条件同时满足:

  1. 埋点代码写完整地址 + data-api 参数
  2. track.js 是最新版(能读 data-api)
  3. collect.php 里有 header('Access-Control-Allow-Origin: *');

完整代码示例:

<script src="https://统计域名/stats/track.js" data-site="xxx" data-api="https://统计域名/stats/collect.php"></script>

如果还不行,F12 看 Console 有没有红色 CORS 报错,把截图发我们。

后台登录后立刻弹回登录页

这是 PHP session 丢失。90% 是以下原因:

  • 服务器磁盘满:session 写不进去。执行 df -h 看磁盘占用
  • /tmp 目录不可写:执行 chmod 1777 /tmp
  • config.php 开头有 BOM:Windows 编辑器留下的,用宝塔编辑器另存为 UTF-8 无 BOM
  • PHP 版本问题:某些环境下 session.save_path 是空,在 php.ini 里设置一个目录
后台显示"0 次访问",但网站明明有人在看

检查清单:

  • 访问日志目录是否有今天的文件?ls data/{站点标识}/
  • 文件里是否有内容?tail data/{站点标识}/2026-09-28.log
  • 后台的"日期"是否选对了?默认是"昨天",需要手动切到今天。
  • 如果文件里有数据但后台显示 0,说明是 PHP 读取问题,看 php_error.log

安全与合规

关于数据隐私、法规、被滥用的处理
我的访客数据处理符合 GDPR / 个人信息保护法吗?

整体上符合,但需要注意几点:

  • 数据在你自己的服务器:不会被第三方拿走,这是最大的合规优势
  • IP 是个人信息:根据 GDPR 和中国《个人信息保护法》,IP 属于个人信息。你的隐私政策里应说明"使用 IP 进行访问统计"
  • 建议做法:在你的网站隐私政策里加一句"本站使用自有统计系统,记录匿名化的访问数据(IP、UA、访问页面),用于改善体验"
  • 不做广告追踪:我们的脚本不记录跨站行为、不投放广告,属于"必要统计"范畴,风险很低
访客要求删除他的数据怎么办?

根据 GDPR 第 17 条和 PIPL 第 47 条,访客有权要求删除个人数据。操作方法:

  1. 在 data/{站点标识}/ 目录里找到包含该访客 IP 的日志文件
  2. 用 grep -v "访客IP" 文件名 > 新文件 剔除该访客的条目
  3. 或者联系该访客 IP 所归属的运营商(如果是中国用户),按合规流程处理

我们建议每 90 天自动清理旧日志,天然满足 GDPR 的"数据最小化"和"存储限制"原则。

统计后台被人尝试暴力破解怎么办?

我们推荐三层防护:

  1. Nginx 层:给 /stats/ 目录加 IP 白名单,只有你办公室或家里的 IP 能访问
  2. 限制登录频率:Nginx 加 limit_req 限制 /stats/login.php 的请求频率
  3. 强密码:用至少 16 位、包含大小写和符号的密码

Nginx IP 白名单示例:

location ^~ /stats/ { allow 1.2.3.4; deny all; }

数据目录被其他人直接下载了怎么办?

立即执行两步:

  1. Nginx 加访问限制:location ^~ /stats/data/ { deny all; return 404; }
  2. 重载 Nginx:nginx -s reload

同时建议:

  • 检查是否有人已经下载了数据(Nginx access_log 里找 /stats/data/)
  • 如果日志里出现大量外部 IP 访问 /stats/data/,建议更换所有用户的密码
  • 把 data/ 目录挪到网站根目录之外,PHP 引用绝对路径(需要改代码,联系我们)

系统运维

想让系统长期稳定运行,需要做这几件事
data 目录会一直变大吗?怎么清理?

会。每天、每个站点、每个访问者都会产生一条日志记录。访问量越大,文件越多。

推荐清理策略:保留最近 90 天,其余删除。在宝塔「计划任务」里加一条每月执行:

find /www/wwwroot/你的网站/stats/data -name "*.log" -mtime +90 -delete

同时清理 IP 缓存:

find /www/wwwroot/你的网站/stats/data/_ipcache -name "*.txt" -mtime +90 -delete

如果你套餐里写的保留期是 365 天,把 +90 改成 +365 即可。

怎么备份统计数据?

数据都在 stats/data/ 里,把这个目录打包即可。宝塔「计划任务」每周执行:

tar -czf /www/backup/stats-$(date +%Y%m%d).tar.gz -C /www/wwwroot/你的网站/stats data

建议保留最近 30 份:

ls -t /www/backup/stats-*.tar.gz | tail -n +31 | xargs -r rm -f

重要:pay_config.json 里存着支付宝/微信的密钥,备份时务必加密,别泄露。

访问量很大,性能跟不上怎么办?

文件存储在小中量级(每天几千访问)表现优秀,如果出现以下情况,建议升级:

  • 每天超过 10 万 PV
  • 概览页加载超过 3 秒
  • data 目录超过 5GB

升级方案:

  1. 把日志从文件迁移到 MySQL / SQLite(性能大幅提升)
  2. 给常用查询加索引
  3. 把统计数据存到 Redis,减少读盘

这些是进阶改造,需要技术评估。可以联系我们定制。

能迁移到别的服务器吗?

完全可以。步骤:

  1. 把整个 stats/ 目录打包下载
  2. 在新服务器上解压到对应位置
  3. 确保 data/ 目录权限为 www:www 或网站运行用户
  4. 更新网站里的埋点代码地址(如果域名变了)

数据是无状态的——所有配置都在 JSON 文件里,不依赖数据库。迁移非常干净。

企业名片

关于名片的创建、分享、数据存储和团队协作
企业名片怎么创建?要多久?

登录后台 → 顶部菜单「我的名片」→ 点「新建名片」→ 按顺序填写:

  • 姓名(必填)、公司名(必填)
  • 职位、电话、微信、邮箱、官网、地址(选填,但填得越全,客户越容易找到你)
  • 一句话简介(60 字以内)
  • 上传个人头像或公司 Logo(可选)
  • 选一个名片主题(100 款按色系分类)

点「保存名片」即可,整个过程约 3 分钟。保存后自动生成专属二维码和分享链接,立刻可以分享给客户。

建议上传头像,让客户一眼记住你。头像比 Logo 更醒目,会显示为圆形。
名片怎么分享给客户?有几种方式?

三种方式,各有适用场景:

  1. 发链接:把名片链接直接发给客户,点击即可查看,支持电话一键拨打、微信一键复制。适合微信、邮件、短信。
  2. 扫码看:把名片二维码印在纸质名片、PPT、网站签名档上,客户扫码即看,不用下载 App。适合线下场景。
  3. 保存为图片(最推荐):点名片页右下角「保存为图片」,导出高清 PNG,微信直接发图给客户。客户在聊天窗口直接看到完整彩色名片,不用点击链接。
微信分享链接的卡片样式是微信控制的,改变不了。想要"客户不用点就能看完整名片",只能用第三种方式——保存为图片直接发。
名片可以建几张?团队成员每人一张吗?

套餐限制如下:

  • 免费版:1 张
  • 个人版:5 张
  • 企业版:不限

每张名片对应一位成员,每位成员独立编辑自己的名片,互不干扰。非常适合销售团队、客服团队、售后团队给每位成员建一张专属名片。

企业版可以容纳任意多的成员。如果团队超过 5 人,建议直接上企业版,一劳永逸。

修改名片信息后,客户扫的二维码要重新换吗?

不用。名片二维码指向的是一个固定地址,与你名片的具体内容无关。

修改姓名、电话、微信、职位、公司等信息后,客户扫码看到的永远是最新版本。

这意味着:

  • 你把名片印在纸质名片上,日后改信息不用重印,客户扫的还是同一个码
  • 你把二维码放到 PPT、邮件签名、官网签名档,改信息后不用重新替换
  • 已经拿到你名片的客户,看到的信息会自动更新
名片保存为图片后,客户还能点击拨打吗?

图片里的电话号码不能点击拨打——图片就是图片,没有交互。但客户可以:

  • 长按识别二维码,进入名片页后一键拨打、复制微信
  • 或者你发图片时附上名片链接,客户点链接就能直接操作

两种方式结合最方便:图片让客户一眼看到名片,链接让客户能一键操作。

正确姿势:发一张名片图 + 紧跟一条消息:"完整版可以点这里 👉 [名片链接]"。客户既能马上看到你是谁,也能一键拨号。
名片数据存在哪里?会不会泄露?

名片数据和统计一样,都存在您自己服务器上:

  • 名片信息:data/users.json
  • 头像和 Logo 等图片:uploads/cards/ 目录

不上传任何第三方平台。除非服务器本身被攻破,否则数据不会被任何外部人员获取。

这也是我们和市面上第三方名片工具(如名片全能王、微名片等)最大的区别——那些工具的名片数据存在它们的服务器上,你无法控制,也不清楚它们拿来做什么。

记得做好 data/ 目录的服务器备份,也建议在 Nginx 层加访问限制,防止 users.json 被直接下载。
名片能统计访客吗?谁扫过我的名片?

目前名片模块还不带访客统计,但我们已经在路线图里规划。上线后,你可以在后台看到:

  • 名片被扫了多少次
  • 扫的人来自什么地区
  • 用什么设备(iOS / Android / PC)
  • 是首次访问还是复访

这项功能对于销售和商务特别有用——能判断哪些客户对你的名片真正感兴趣,跟进时更有针对性。

目前的替代方案:你可以在名片链接后加不同的 UTM 参数(如 &utm_source=email、&utm_source=wechat),用网站的统计模块查看不同渠道的扫码来源。

没有找到答案?

把你的具体问题和现象(截图/报错)发给我们,1 个工作日内回复

联系我们