Google analytics PageSpeed Insights 99/100因为谷歌分析-我如何缓存GA?

Google analytics PageSpeed Insights 99/100因为谷歌分析-我如何缓存GA?,google-analytics,pagespeed,Google Analytics,Pagespeed,我正在寻求在PageSpeed上达到100/100,我就快到了。我正试图找到一个好的解决方案来缓存谷歌分析 以下是我得到的信息: 利用浏览器缓存 在HTTP头中为静态资源设置过期日期或最长使用期限会指示浏览器从本地磁盘而不是通过网络加载以前下载的资源。 利用浏览器缓存实现以下可缓存资源: (2小时) 我找到的唯一解决方案是2012年的,我认为这不是一个好的解决方案。基本上,您复制GA代码并自己托管它。然后运行cron作业,每天重新检查一次Google,以获取最新的GA代码并替换它 在使用谷歌分

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

以下是我得到的信息:

利用浏览器缓存 在HTTP头中为静态资源设置过期日期或最长使用期限会指示浏览器从本地磁盘而不是通过网络加载以前下载的资源。 利用浏览器缓存实现以下可缓存资源: (2小时)

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

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


谢谢。

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

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

谷歌反对使用analtics脚本的本地副本。 但是,如果您正在这样做,您可能会希望使用插件的本地副本&调试脚本


第二个使用快速缓存的方法是,您将从缓存的页面中获得点击率,这些页面可能已更改或已从网站中删除。

store localy analytics.js,但谷歌不推荐:

这是不推荐的,因为谷歌可以在他们想要的时候更新脚本,所以只要每周下载一个脚本,你就不会有麻烦了


顺便说一句,这个解决方案可以防止adblock阻止google分析脚本

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

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


如果您对此感到满意,请在Google insights上运行Google insights URL,开怀大笑,放松一下,继续工作。

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

  • 一些服务器端技术()
  • 对外服务()

记得在使用之前缩小文件。否则会消耗更多的处理时间。

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

但是,出于演示目的,请遵循本指南:

Google Analytics js库中有一个子集称为,您可以根据需要进行缓存

该库使用Google Analytics的公共REST API将用户跟踪数据发送到Google。你可以从中读到更多


免责声明:我是此库的作者。我一直在努力解决这个问题,我发现最好的结果就是实现了这个解决方案。

在Google文档中,他们发现了一个
pagespeed
过滤器,可以异步加载脚本:

ModPagespeedEnableFilters make_google_analytics_async
您可以在此处找到文档:

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

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


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

这是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脚本,将其保存在本地,并每小时自动更新该文件,以确保它始终是来自google的最新版本

我已经在几个网站上做过了,一切都很好

NodeJS/MEAN Stack中的谷歌分析代理路由

这就是我在用平均堆栈构建的平台上实现它的方式

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中的Google Analytics代理操作方法

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

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>

(功能(i、s、o、g、r、a、m){
i['GoogleAnalyticsObject']=r;i[r]=i[r]| |函数(){
(i[r].q=i[r].q | |[]).push(参数)
},i[r].l=1*新日期();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(窗口,文档,'script','/analytics.js?d='+newdate().toISOString().slice(0,13),'ga');
()仅当用户滚动页面时,才会加载谷歌分析代码:

var fired=false;
addEventListener(“滚动”,函数(){
if((document.documentElement.scrollTop!=0&&fired==false)| |(document.body.scrollTop!=0&&fired==false)){
(函数(i,s,o,g,r,a,m{i['GoogleAnalyticsObject']=r;i[r]=i[r]| |函数(){(i[r].q=i[r].q | |[])推送
<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>
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');
}
<script>
  $.ajax({
  type: "GET",
  url: "https://www.google-analytics.com/analytics.js",
  success: function(){},
  dataType: "script",
  cache: true
  });
</script>
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";
    }
<?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; ?>
  <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>
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}
<?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; ?>