PageSpeed Insights 99/100 因为 Google Analytics - 如何缓存 GA



我正在努力在PageSpeed上达到100/100,我快到了。 我正在尝试找到一个好的解决方案来缓存谷歌分析。

这是我收到的消息:

利用浏览器缓存在静态资源的 HTTP 标头中设置到期日期或最长期限会指示浏览器从本地磁盘而不是通过网络加载以前下载的资源。对以下可缓存资源利用浏览器缓存:http://www.google-analytics.com/analytics.js(2小时(

我找到的唯一解决方案是从 2012 年开始的,我认为这不是一个好的解决方案。 本质上,您复制 GA 代码并自己托管它。 然后,您运行一个 cron 作业,每天重新检查一次 Google,以获取最新的 GA 代码并替换它。

http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/

在使用谷歌分析的同时,我还能做些什么来达到100/100?

谢谢。

好吧

,如果谷歌欺骗了你,你可以欺骗谷歌回来:

这是 pageSpeed 的用户代理:

“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.8 (KHTML, like Gecko; Google Page Speed Insights) Chrome/19.0.1084.36 Safari/536.8”

您可以插入条件以避免将分析脚本提供给 PageSpeed:

<?php if (!isset($_SERVER['HTTP_USER_AGENT']) || stripos($_SERVER['HTTP_USER_AGENT'], 'Speed Insights') === false): ?>
// your analytics code here
<?php endif; ?>

显然,它不会有任何真正的改进,但如果你唯一关心的是获得 100/100 的分数,这将做到。

Google Analytics js 库有一个名为 ga-lite 的子集,您可以根据需要进行缓存。

该库使用Google Analytics的公共REST API将用户跟踪数据发送到Google。您可以从有关 ga-lite 的博客文章中阅读更多内容。

免责声明:我是这个库的作者。我在这个特定问题上苦苦挣扎,我发现最好的结果是实施这个解决方案。

这是一个使用 JS 的非常简单的解决方案,用于基本的 GA 跟踪,它也适用于边缘缓存/代理(这是从注释转换而来的(:

if(navigator.userAgent.indexOf("Speed Insights") == -1) {
  (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-XXXXXXXXX-X', 'auto');
  ga('send', 'pageview');
}

注意:这是默认的 GA 脚本。您可能还有其他ga()调用,如果是这样,则需要在调用ga()之前始终检查用户代理,否则可能会出错。

我不会担心的。不要把它放在你自己的服务器上,听起来这是谷歌的问题,但尽可能好。将文件放在您自己的服务器上会产生许多新问题。

他们可能需要每次都调用该文件,而不是从客户端的缓存中获取它,因为这样您就不会计算访问次数。

如果你有问题,感觉很好,在谷歌洞察本身上运行谷歌洞察网址,开怀大笑,放松一下,继续你的工作。

在Google文档中,他们确定了一个pagespeed过滤器,该过滤器将异步加载脚本:

ModPagespeedEnableFilters make_google_analytics_async

您可以在此处找到文档:https://developers.google.com/speed/pagespeed/module/filter-make-google-analytics-async

需要强调的一件事是过滤器被认为是高风险的。从文档中:

make_google_analytics_async过滤器是实验性的,尚未进行广泛的实际测试。重写会导致错误的一种情况是,如果过滤器错过了对返回值的Google Analytics方法的调用。如果找到此类方法,则跳过重写。但是,如果取消资格的方法在加载之前出现,位于"onclick"等属性中,或者如果它们位于外部资源中,则将错过这些方法。预计这些病例将很少见。

您可以尝试在本地托管分析.js并使用缓存脚本或手动更新其内容。

js文件每年只更新几次,如果您不需要任何新的跟踪功能,请手动更新它。

https://developers.google.com/analytics/devguides/collection/analyticsjs/changelog

存储本地分析.js,但Google不建议这样做:https://support.google.com/analytics/answer/1032389?hl=en

不建议这样做,因为Google可以在他们想要的时候更新脚本,所以只需做一个每周下载分析JavaScript的脚本,你就不会有麻烦!

顺便说一下,此解决方案可防止广告拦截阻止谷歌分析脚本

> varvy.com(100/100 Google 页面速度洞察(仅在用户滚动页面时才加载 Google Analitycs 代码:

var fired = false;
window.addEventListener("scroll", function(){
    if ((document.documentElement.scrollTop != 0 && fired === false) || (document.body.scrollTop != 0 && fired === false)) {
        (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','//www.google-analytics.com/analytics.js','ga');
        ga('create', 'UA-XXXXXXXX-X', 'auto');
        ga('send', 'pageview');
        fired = true;
    }
}, true);

您可以通过自己的服务器代理谷歌分析脚本,将其保存在本地,并每小时自动更新文件,以确保它始终是谷歌的最新版本。

我现在已经在几个网站上完成了此操作,一切正常。

NodeJS/MEAN Stack 中的 Google Analytics 代理路由

这就是我在使用 MEAN 堆栈构建的博客上实现它的方式。

router.get('/analytics.js', function (req, res, next) {
    var fileUrl = 'http://www.google-analytics.com/analytics.js';
    var filePath = path.resolve('/content/analytics.js');
    // ensure file exists and is less than 1 hour old
    fs.stat(filePath, function (err, stats) {
        if (err) {
            // file doesn't exist so download and create it
            updateFileAndReturn();
        } else {
            // file exists so ensure it's not stale
            if (moment().diff(stats.mtime, 'minutes') > 60) {
                updateFileAndReturn();
            } else {
                returnFile();
            }
        }
    });
    // update file from remote url then send to client
    function updateFileAndReturn() {
        request(fileUrl, function (error, response, body) {
            fs.writeFileSync(filePath, body);
            returnFile();
        });
    }
    // send file to client
    function returnFile() {
        res.set('Cache-Control', 'public, max-age=' + oneWeekSeconds);
        res.sendFile(filePath);
    }
});

ASP.NET MVC 中的谷歌分析代理操作方法

这就是我在使用 MVC 构建的其他站点上实现它的方式 ASP.NET。

public class ProxyController : BaseController
{
    [Compress]
    public ActionResult GoogleAnalytics()
    {
        var fileUrl = "https://ssl.google-analytics.com/ga.js";
        var filePath = Server.MapPath("~/scripts/analytics.js");
        // ensure file exists 
        if (!System.IO.File.Exists(filePath))
            UpdateFile(fileUrl, filePath);
        // ensure file is less than 1 hour old
        var lastModified = System.IO.File.GetLastWriteTime(filePath);
        if((DateTime.Now - lastModified).TotalMinutes > 60)
            UpdateFile(fileUrl, filePath);
        // enable caching for 1 week for page speed score
        Response.AddHeader("Cache-Control", "max-age=604800");
        return JavaScript(System.IO.File.ReadAllText(filePath));
    }
    private void UpdateFile(string fileUrl, string filePath)
    {
        using (var response = WebRequest.Create(fileUrl).GetResponse())
        using (var dataStream = response.GetResponseStream())
        using (var reader = new StreamReader(dataStream))
        {
            var body = reader.ReadToEnd();
            System.IO.File.WriteAllText(filePath, body);
        }
    }
}

这是 MVC ProxyController 用于 Gzip 压缩的 CompressAttribute

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;
        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;
        if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}

更新了谷歌分析脚本

在客户端,我将分析路径附加当前日期到小时,以便浏览器不会使用超过一小时的缓存版本。

<!-- 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', '/analytics.js?d=' + new Date().toISOString().slice(0, 13), 'ga');
</script>

对于 Nginx:

location ~ /analytics.js {
        proxy_pass https://www.google-analytics.com;
        expires 31536000s;
        proxy_set_header Pragma "public";
        proxy_set_header Cache-Control "max-age=31536000, public";
    }

然后将路径 https://www.google-analytics.com/analytics.js 更改为 https://yoursite.com/analytics.js

PHP

在 HTML 或 PHP 代码中添加以下内容:

<?php if (!isset($_SERVER['HTTP_USER_AGENT']) || stripos($_SERVER['HTTP_USER_AGENT'], 'Speed Insights') === false): ?>
  <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-PUT YOUR GOOGLE ANALYTICS ID HERE', 'auto');
    ga('send', 'pageview');
  </script>
<?php endif; ?>

JavaScript

这适用于 JavaScript:

  <script>
  if(navigator.userAgent.indexOf("Speed Insights") == -1) {
    (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-<PUT YOUR GOOGLE ANALYTICS ID HERE>', 'auto');
    ga('send', 'pageview');
  }
  </script>

NiloVelez已经说过:显然,它不会有任何真正的改善,但如果你唯一关心的是获得100/100的分数,这将做到。

请尝试在之前插入

<script async='async' src='https://cdn.jsdelivr.net/ga-lite/latest/ga-lite.min.js'></script> <script>var galite=galite||{};galite.UA="xx-xxxxxxx-x";</script>

请将 xx-xxxx-x 更改为您的代码,请在此处检查实现 http://www.gee.web.id/2016/11/how-to-leverage-browser-caching-for-google-analitycs.html

在 2020 年,页面速度洞察的用户代理是:移动设备的"Chrome-Lighthouse"和桌面版的"谷歌网页速度洞察"。

<?php if (!isset($_SERVER['HTTP_USER_AGENT']) || stripos($_SERVER['HTTP_USER_AGENT'], 'Chrome-Lighthouse') === false  || stripos($_SERVER['HTTP_USER_AGENT'], 'Google Page Speed Insights') === false): ?>
// your google analytics code and other external script you want to hide from PageSpeed Insights here
<?php endif; ?>

Google 警告不要使用解析脚本的本地副本。但是,如果您正在这样做,则可能需要使用插件和调试脚本的本地副本。

主动缓存的第二个问题是,您将从缓存的页面中获得点击 - 这些页面可能已更改或已从站点中删除。

要解决此问题,您必须在本地下载文件并运行 cron 作业以保持更新。注意:这根本不会使您的网站更快,因此最好忽略它。

但是,出于演示目的,请遵循本指南:http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/

这可能会起到:)

作用
<script>
  $.ajax({
  type: "GET",
  url: "https://www.google-analytics.com/analytics.js",
  success: function(){},
  dataType: "script",
  cache: true
  });
</script>

根据您对Google Analytics数据的使用情况,如果您想要基本信息(例如访问,UI交互(,则可以根本不包含分析.js但仍会在GA中收集数据。

一种选择可能是在缓存脚本中使用测量协议。谷歌分析:测量协议概述

将传输方法显式设置为映像时,可以看到 GA 如何构造自己的映像信标。

ga('set', 'transport', 'image');
https://www.google-analytics.com/r/collect
  ?v={protocol-version}
  &tid={tracking-id}
  &cid={client-id}
  &t={hit-type}
  &dl={location}

您可以使用所需的有效负载创建自己的 GET 或 POST 请求。

但是,如果您需要更详细的信息,则可能不值得您付出努力。

您可以设置以 www.google-analytics.com 作为其源服务器的 Cloudfront 分配,并在 Cloudfront 分配设置中设置更长的到期标头。然后在谷歌代码段中修改该域名。这可以防止您自己的服务器上的负载以及需要在 cron 作业中不断更新文件。

这是设置和忘记。因此,您可能需要向 cloudfront 添加账单警报,以防有人"复制"您的代码段并窃取您的带宽 ;-(

编辑:我试过了,这并不容易,Cloudfront 通过缓存控制标头,没有简单的方法来删除它

在新选项卡中打开 https://www.google-analytics.com/analytics.js 文件,复制所有代码。

现在在您的网络目录中创建一个文件夹,将其重命名为谷歌分析。

在同一文件夹中创建一个文本文件,并粘贴上面复制的所有代码。

重命名文件本地.js

现在更改网址以在Google Analytics代码中调用本地托管的分析脚本文件。它看起来像这样,即 https://domain.xyz/google-analytics/ga.js

最后,将您的新谷歌分析代码放入网页的页脚中。

你很好去。现在检查您的网站 谷歌页面速度洞察.它不会显示利用浏览器缓存谷歌分析的警告。此解决方案的唯一问题是定期手动更新分析脚本。

您可以使用以下方法缩小页面中的所有脚本,包括analytics.js

  • 一些服务器端技术 (https://github.com/matthiasmullie/minify(
  • 外部服务 (http://www.cloudflare.com(

请记住在使用前缩小文件。否则将消耗更多的处理时间。

最新更新