【问题标题】:Injecting Google Analytics Tracking Snippet into Websites Behind Nginx Reverse Proxy将 Google Analytics 跟踪代码段注入 Nginx 反向代理背后的网站
【发布时间】:2018-08-08 07:52:35
【问题描述】:

我一直想使用 Google Analytics 有一段时间了,我想避免将跟踪 sn-p 手动插入每个网页。此外,Plex、Deluge 等第三方应用程序甚至可能不支持这样做。

我在 Nginx 反向代理后面托管所有这些服务。我知道可以使用ngx_http_sub_module 结合sub_filter 指令将Google Analytics 跟踪sn-p 注入每个Location 块。

在过去的几个小时里,我一直在试图弄清楚如何做到这一点,但在几种不同的配置下都失败了。基本上,我已经到了三个不同的时间点,我的配置将通过 linting 测试并且我可以成功启动 Nginx 服务,但是尽管 Nginx 按预期运行,但没有任何指标被传递给 Google Analytics。

有人有什么想法吗?是否需要转发端口或任何东西才能使用 Google Analytics?目前所有传出请求都未经过滤,值得一提。以下是我目前尝试过的配置:

1) 全局站点标签:

http {
    server  {
        listen  443 ssl;
        server_name www.website.com;
        ssl  on;
        location  / {
            proxy_pass http://12.34.56.78:2000/;

            sub_filter   </head>
                    "<script>
                        <!-- Global site tag (gtag.js) - Google Analytics -->
                        <script async src='https://www.googletagmanager.com/gtag/js?id=UA-##########-1'></script>
                        <script>
                          window.dataLayer = window.dataLayer || [];
                          function gtag(){dataLayer.push(arguments);}
                          gtag('js', new Date());

                      gtag('config', 'UA-##########-1');
                    </script>
                </script>";
            sub_filter_once on;
    }
}

2) Analytics.js:

http {
    server  {
        listen  443 ssl;
        server_name www.website.com;
        ssl  on;
        location  / {
            proxy_pass http://12.34.56.78:2000/;

            sub_filter </head> '<script>(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,"script","https://www.google-analytics.com/analytics.js","ga");ga("create","UA-##########","auto");ga("send","pageview");</script></head>';        

            sub_filter_once on;
    }
}

3) 配置中没有嵌入 JS sn-p 的 Analytics.js:

http {
    server  {
        listen  443 ssl;
        server_name www.website.com;
        ssl  on;
        location  / {
            proxy_pass http://12.34.56.78:2000/;

            sub_filter  </head>
            '<script language="javascript" src="/etc/nginx/analytics.js"></script></head>';
            sub_filter_once on;
    }
}

上面引用的analytics.js 文件:

<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-##########', 'auto');
ga('send', 'pageview');
</script>
<!-- End Google Analytics -->

系统信息:

操作系统:CentOS 7.5
Nginx 版本:1.15.2
包含的模块:http_ssl_modulestreamhttp_stub_status_modulehttp_sub_module

我消费过的来源:

抱歉,这些不是超链接。 StackOverflow 说我的超链接没有“正确格式化为代码”,因为拒绝让我发表这篇文章。将它们格式化为代码破坏了超链接语法,所以我不得不这样做......

1) GitHub Gist 概念证明:https://gist.github.com/jirutka/5279057

2) 博客帖子概念证明:https://adarrohn.com/blog/nginx-google-analytics

3) Ruby-论坛问题:https://www.ruby-forum.com/topic/1985946

4) gtag.js: https://developers.google.com/analytics/devguides/collection/gtagjs/ 上的 Google Analytics 文档

5) analytics.js: https://developers.google.com/analytics/devguides/collection/analyticsjs/ 上的 Google Analytics 文档

6) http_sub_module: https://nginx.org/en/docs/http/ngx_http_sub_module.html 上的 Nginx 文档

【问题讨论】:

    标签: nginx google-analytics centos reverse-proxy javascript-injection


    【解决方案1】:

    这对我来说是这样的

    sub_filter '</body>' '<script src="/tealeaf/file.js" type="text/javascript"></script>\r\n</body>';
    

    即一行。

    向每个网站页面添加 GA 代码并不是当今人们所做的事情。我建议开始使用 GTM 并在每个页面上插入 GTM 代码 sn-p(使用相同的方法)。通过这种方式,您将能够自定义您的数据收集,而无需更改跟踪代码 [太多]。

    需要检查的东西,您没有在此处提供有问题的网站网址,而是 - 请加载页面并确保 GA 代码 sn-p 包含在标记之前

    • 请在浏览器中打开开发人员工具,切换到网络选项卡并 cntrl+f5(硬刷新)页面。比看看是否从谷歌服务器加载了文件 analytics.js

    • 如果是,请查看是否向 /collect 谷歌分析端点发出了请求。 如果这是真的,您应该会在 GA 中看到数据。

    如果以上都不是,我会查看 nginx 中的 proxy_pass 位置是否支持 sub_flter

    2018 年 8 月 8 日编辑

    【讨论】:

    • 您好,感谢您的回复。在我的浏览器中检查网络选项卡后,它确实显示 javascript 文件是 404ing。这是因为它的目标文件不在公共网络服务器上,而是在文件系统的其他地方。不能将静态文件传递给 sub_filter 吗?毕竟,我不想让这个文件公开可读,因为它包含私有跟踪 ID。
    • 您的跟踪 ID 不是私密的,因为您的客户端库 (javascript) 需要访问它。您无法向想要提取它的人隐藏它。它确实适用于“本地”文件。路径有问题? nginx如何处理相对路径的一种方式?你的 404 请求的 url 是什么?
    • 这是有道理的。问题是我的反向代理而不是网络服务器上有 js 文件。我已经解决了这个问题,现在我有反向代理插入两个不同的 sub_filter 行,具体取决于您连接到的子域。第一个是您的解决方案,第二个是上面 1) 中列出的全局站点标签。我可以确认 analytics.js 文件在 Internet 上是可读的,此外,两个实例都在 部分中注入脚本。但是,开发控制台的“网络”部分显示没有流向 Google Analytics 的流量。而且GA不报告任何流量:(
    • @TJZimmerman - 你能分享一下网站的网址吗,我可以看看它是否被跟踪?
    • 正在尝试附加图片,但没有成功。但是您的 GA 代码 sn-p 有问题。您将 sn-p(即 HTML)复制/粘贴到浏览器试图解释的 JS 文件(JavaScript)中,但显然失败了。尝试删除 标签、 SCRIPT > 和 (HTML cmets 标签)
    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 2014-02-18
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多