1. 首页
  2. >
  3. 程序开发
  4. >
  5. 网络与运维

使用 Workers 反代 Google Analytics 加速访问

添加评论

之前写过一篇《使用 Nginx 反代 Google Analytics 加速访问》通过在 nginx 配置文件中设置替换规则,将脚本内的 /g/collect 网址替换为反代服务器的地址,从而实现数据的转发 。然而,随着 Google Analytics 脚本的更新以及内部变量的动态更新,其网址结构也可能发生变化。
因我将服务器全面迁移至本地环境,反带时需要先让 Google Analytics 经过本地路由搭建的代理进行访问。但代理的稳定性一直是一个难题,尤其是在网络环境复杂的情况下,代理经常会出现连接中断、延迟过高的问题,而且,代理的不稳定还会导致数据丢失,因为当代理连接中断时,正在上报的数据可能会被丢弃,从而影响数据的完整性。

使用 CloudFlare Workers 进行反代

通过 CloudFlare 的全球节点优势,能够将请求路由到离用户最近的节点进行处理,从而减少网络延迟。无论用户位于世界的哪个角落,都能够快速地访问 Google Analytics,获取准确的数据。而且,CloudFlare Workers 的响应速度非常快,能够在毫秒级的时间内处理请求,确保数据上报的及时性 。

JAVASCRIPT
  1. export default {
  2. async fetch(request, env, ctx) {
  3. var src = null;
  4. // 请求网址
  5. const url = new URL(request.url);
  6. // 请求路径
  7. const route = url.pathname;
  8. // 获取真实地址
  9. const location = request.headers.get('CF-Connecting-IP') || '';
  10. // 复制头
  11. const header = new Headers( request.headers );
  12. // 删除源站地址,避免校验异常
  13. header.delete('Host');
  14.  
  15. // 核心脚本
  16. if ( route.startsWith('/analytics.js') )
  17. {
  18. src = 'https://www.googletagmanager.com/gtag/js' + url.search;
  19. }
  20. // 数据上报
  21. else if ( route.startsWith('/analytics/g/collect') )
  22. {
  23. src = 'https://www.google-analytics.com/g/collect' + url.search + '&_uip=' + location;
  24. }
  25. // 无效请求
  26. else
  27. {
  28. return new Response('Not found', { status: 404 });
  29. }
  30.  
  31. // 发起请求
  32. return await fetch( src, {
  33. method: request.method,
  34. headers: header,
  35. body: request.body
  36. });
  37. }
  38. };

为 Workers 添加路由
借助 CloudFlare Workers 将核心脚本 gtag.js 以及上报接口 /g/collect 先行进行反代,在由前端 Google Analytics 配合 transport_url 接口,达到原生反代及响应上报接口,无需担心服务器的维护和性能问题。而且,CloudFlare Workers 还提供了丰富的 API 和工具,方便我对反代进行监控和管理,确保其稳定运行。

前端 Google Analytics 引用及入口

JAVASCRIPT
  1. window.dataLayer = window.dataLayer || [];
  2. function gtag() { dataLayer.push( arguments ); };
  3. gtag('js', new Date() );
  4. gtag('config', 'G-XXXXXXXXXX', {
  5. transport_url: '//res.example.com/analytics/'
  6. });

如上所述,直接使用官方原生 transport_url 接口就能直接替换 /g/collect 为 Workers 所反代的地址,不会因 gtag.js 脚本更新及内部动态变更而导致替换网址失效。

注意事项

我的服务器全局使用 CloudFlare 做为隧道并使用了优选,使用 Workers 亦是与服务器同一个地址方便维护管理。但 Workers 本身有 100, 000 次/日请求的限制,访问量大的站点建议做好缓存,减少请求次数。

文章作者
许可协议
CC BY-NC 4.0
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
  1. 暂无评论
浏览记录
  • 暂无记录