GoogleアナリティクスのためにPageSpeed Insights 99/100-GAをキャッシュするにはどうすればよいですか?


243

私はPageSpeedで100/100に到達するための探求にあり、私はほとんどそこにいます。Google Analyticsをキャッシュするための適切なソリューションを見つけようとしています。

ここに私が得るメッセージがあります:

ブラウザーのキャッシュを利用する静的リソースのHTTPヘッダーに有効期限または最大経過時間を設定すると、ブラウザーは以前にダウンロードしたリソースをネットワーク経由ではなくローカルディスクからロードするように指示されます。次のキャッシュ可能なリソースにブラウザのキャッシュを活用します:http : //www.google-analytics.com/analytics.js(2時間)

私が見つけた唯一の解決策は2012年のものであり、それは良い解決策ではないと思います。基本的に、GAコードをコピーして自分でホストします。次に、cronジョブを実行してGoogleを1日に1回再確認し、最新のGAコードを取得して置き換えます。

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

Googleアナリティクスを使用しながら100/100に到達するには、他に何ができますか?

ありがとうございました。


1
私はcronメソッドを使用しましたが、cronを使用しません(ロードとキャッシュonload。必要に応じて、phpコードを共有できます)。そして、私は私のGA修正提案を修正しました。しかし、問題はほとんど残っていません。「Cache-Control:max-age = 604800」ヘッダーを残しました。これは5分のキャッシュよりはるかに高い値です。
Roman Losev、2015

6
しかし、それは本当に良い考えですか?サーバー上でこのファイルをキャッシュすると、ブラウザは、Googleアナリティクスを使用して他のサイトにアクセスすることですでにキャッシュされているファイルを再利用する代わりに、再度ダウンロードする必要があります。したがって、実際には訪問者の反応がわずかに遅くなる可能性があります。
s427

回答:


240

まあ、グーグルがあなたをだましているなら、あなたはグーグルを裏切ることができます:

これは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のスコアを得ることが唯一の懸念事項である場合は、これで十分です。


4
賢い......残念私はエッジキャッシュを使用します。このスクリプトは、リクエストがすべてのリクエストでオリジンに到達した場合にのみ機能するためです:(
Amy Neville

49
それからJS経由でロードします:)if(navigator.userAgent.indexOf("Speed Insights") == -1) { /* analytics here */ }
ハーフ

1
@Jim参照stackoverflow.com/questions/10734968/... -あなたは、このメソッドの内部を使用することになり{ }、他のJS GAの用途(のようなものと一緒に、私の例ではga('create', 'UA-XXXXX-Y', 'auto'); ga('send', 'pageview');、または何でも)
ハーフクレイズド

1
@ジム私はこれをカバーする答えを追加しました。
ハーフクレイズ

6
警告:これはもう機能しません。Lighthouseが提供するPage Speed Insightsは、デフォルトのuserAgentを使用していますが、これはもう検出できません。
David Vielhuber

39

ga-liteと呼ばれるGoogle Analytics jsライブラリのサブセットがあり、必要に応じてキャッシュできます。

ライブラリは、Google AnalyticsのパブリックREST APIを使用して、ユーザー追跡データをGoogleに送信します。詳しくは、ga-liteに関するブログ投稿をご覧ください。

免責事項:私はこのライブラリの作者です。私はこの特定の問題に苦労し、私が見つけた最良の結果はこのソリューションを実装することでした。


21

これは、エッジキャッシュ/プロキシでも機能する、基本的なGAトラッキング用のJSを使用した本当にシンプルなソリューションです(コメントから変換されました)。

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()があります。そうでない場合、エラーが発生する可能性があります。


2
「注:」セクションに対応して、コードを実行するときにこの関数の存在を確認する必要がないように、スニペットを以前のgaようga = function(){};に宣言して、サイレントで失敗するように宣言できga();ます。
イシュトPálinkás

1
これをスクリプトに追加する方法<script async src = " googletagmanager.com/gtag/js?id=UA-xx6600xx-1 "> < / >
Navnish Bhardwaj

16

私はそれについて心配しません。自分のサーバーに配置しないでください。これはGoogleの問題のようですが、問題はありません。自分のサーバーにファイルを置くと、多くの新しい問題が発生します。

クライアントのキャッシュからファイルを取得するのではなく、ファイルを毎回呼び出す必要があります。その方法では、訪問をカウントしないためです。

問題が発生した場合は、Googleインサイト自体でGoogleインサイトURLを実行し、笑ってリラックスして作業を続けてください。


68
彼は99に問題がない場合ではなく、100に到達する方法を知りたいと考えています。
エリックエンゲルハート2015年

4
この答えは正しくありません。Analytics.jsファイルがダウンロードされる場所は、分析が追跡するかどうかに影響しません。独自の分析ファイルをホストする際の問題は、常に手動で最新バージョンに更新する必要があることです(年に数回)。
マシュードルマン

1
それを指摘してくれたマシューに感謝します。どうやら私は間違っていましたが、それは良いことですが、自分のサーバーでこのファイルをホストするのは良い考えではないと思います。OPの質問は、pagespeedで100に到達する方法でした。私の答えは、その100に到達することを心配することではありません。それは本当に迷惑な答えかもしれませんが、それは私です。
Leo Muller 2016年

3
99だと思って迷子になった人への良い答えは十分ではありません。実際の問題に時間を費やしてください。
linqu 2017年

@ErickEngelhardt正解ですが、人々が最良の目標を目指していないと思われる質問をした場合、どのソリューションがより良いサービスを提供できるかを事前に説明する必要があります。
オブザーバー

10

Googleドキュメントではpagespeed、スクリプトを非同期に読み込むフィルターを特定しています。

ModPagespeedEnableFilters make_google_analytics_async

ドキュメントは次の場所にありますhttps : //developers.google.com/speed/pagespeed/module/filter-make-google-analytics-async

強調すべきことの1つは、フィルターが高リスクと見なされることです。ドキュメントから:

make_google_analytics_asyncフィルターは実験的なものであり、実際に行われた広範なテストは行われていません。書き換えによってエラーが発生する1つのケースは、フィルターが値を返すGoogleアナリティクスメソッドの呼び出しを逃した場合です。そのようなメソッドが見つかった場合、書き換えはスキップされます。ただし、不適格なメソッドは、ロードの前に来る場合、「onclick」などの属性内にある場合、または外部リソース内にある場合は見逃されます。これらのケースはまれであると予想されます。


7

varvy.com100/100 Googleページ速度インサイト)は、ユーザーがページをスクロールした場合にのみ、Google アナリティックスコードをロードします。

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);

7
訪問者がスクロールせずにリンクをクリックするだけの場合はどうでしょうか。彼は分析には含まれません。
Ross Ivantsiv 2017

@RossIvantsivあなたもクリックを処理することができます!
ar099968

6

analytics.jsをローカルでホストして、コンテンツをキャッシュスクリプトまたは手動で更新することができます。

jsファイルは年に数回しか更新されません。新しい追跡機能が必要ない場合は手動で更新してください。

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


2
これはGoogleによって明示的にサポートされていないことに注意してください:support.google.com/analytics/answer/1032389
鋼鉄

6

localy analytics.jsを保存しますが、Googleでは推奨していません:https : //support.google.com/analytics/answer/1032389?hl=ja

Googleが必要に応じてスクリプトを更新できるため、お勧めできません。毎週アナリティクスのJavaScriptをダウンロードするスクリプトを実行するだけで、問題が発生することはありません。

ちなみに、このソリューションは、adblockがGoogleアナリティクススクリプトをブロックするのを防ぎます


Adblockは完全にバイパスされません(それでもajax呼び出しはブロックされます)が、少なくともセッションとページビューが表示されます
NiloVelez '19年

5

独自のサーバーを介してGoogleアナリティクススクリプトをプロキシし、ローカルに保存し、ファイルを毎時間自動更新して、Googleからの最新バージョンであることを確認できます。

私はこれをいくつかのサイトで実行しましたが、すべて正常に機能しています。

NodeJS / MEANスタックの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のGoogleアナリティクスプロキシアクションメソッド

これは、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);
        }
    }
}

更新されたGoogle Analyticsスクリプト

クライアント側では、1時間以内の現在の日付を分析パスに追加して、ブラウザーが1時間以上前のキャッシュされたバージョンを使用しないようにします。

<!-- 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>


4

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のスコアを取得することである場合、これはそれを行います。


1

前に挿入してみてください

<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-xxxxxxx-xをコードに変更してください実装については、http://www.gee.web.id/2016/11/how-to-leverage-browser-caching-for-google-analitycs.htmlで確認してください。


1
これは標準の分析ではなくga-liteのためのものであることに注意してください
Rob Forrest 2017年

0

Googleの注意、分析スクリプトのローカルコピーを使用しないようしています。ただし、その場合は、プラグインとデバッグスクリプトのローカルコピーを使用することをお勧めします。

アグレッシブキャッシングの2番目の問題は、キャッシュされたページからヒットを取得することです。これは、サイトから変更されたか、サイトから削除された可能性があります。


0

この問題を修正するには、ファイルをローカルにダウンロードし、cronジョブを実行して更新を続ける必要があります。注:これはあなたのウェブサイトをまったく速くしませんので、それを無視するのが最善です。

ただし、デモンストレーションの目的で、次のガイドに従ってください。http//diywpblog.com/leverage-browser-cache-optimize-google-analytics/


「これはあなたのウェブサイトを速くしません」それは必ずしも本当ではありません。理論的には、分析が含まれている重要でない連結されたJSファイルをgzip圧縮すると、共有ディクショナリのため、分離された分析ファイルよりもわずかに圧縮されます。おそらくそれ以上のトラブルが発生するでしょう。
Ray Foss

0

これはトリックを行うかもしれません:)

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

0

Google Analyticsデータの使用状況によっては、基本情報(訪問、UIインタラクションなど)が必要な場合、analytics.jsをまったく含めなくても、GAでデータを収集できる場合があります。

1つのオプションは、代わりに、キャッシュされたスクリプトで測定プロトコルを使用することです。 Googleアナリティクス:Measurement Protocolの概要

転送方法を明示的に画像に設定すると、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リクエストを作成できます。

ただし、より詳細なレベルが必要な場合は、おそらく努力する価値はありません。


Pagespeedへの接続はどこですか?
Nico Haase

analytics.jsを読み込まないことで、pagespeedのペナルティを回避できます。
ジョナサン

うん。そして、CSS、JS、画像をページからすべてスキップすることで、ページの読み込みがさらに速くなります。OPによると、Google Analyticsをスキップすることは選択肢ではありません
Nico Haase

データがまだGoogleアナリティクスに記録されていることを除いて、私の答えは有効だと思います。Googleアナリティクスに必要な詳細レベルによっては、訪問、UIインタラクション、その他の潜在的な指標を記録することを検討する価値があるオプションであることを明確に述べました。OPが最後の1%を最適化しようとしている場合は、検討する価値のある最適化である可能性があります。
ジョナサン

@NicoHaase私のコメントを編集して、ポイントを明確にしたいと思います。あなたの考えを聞いて興味があります。
ジョナサン

0

www.google-analytics.comをオリジンサーバーとして持つCloudfrontディストリビューションをセットアップし、Cloudfrontディストリビューション設定でより長い有効期限ヘッダーを設定できます。次に、Googleスニペットでそのドメインを変更します。これにより、自分のサーバーに負荷がかかり、cronジョブでファイルを更新し続ける必要がなくなります。

これはセットアップで忘れてしまいます。そのため、誰かがスニペットを「コピー」して帯域幅を盗んだ場合に備えて、cloudfrontに請求アラートを追加することをお勧めします;-)

編集:私はそれを試しました、そしてそれはそれほど簡単ではありません、Cloudfrontはそれを削除する簡単な方法なしでCache-Controlヘッダーを通過します


0

https://www.google-analytics.com/analytics.jsファイルを新しいタブで開き、すべてのコードをコピーします。

次に、Webディレクトリにフォルダーを作成し、名前をgoogle-analyticsに変更します。

同じフォルダーにテキストファイルを作成し、上記でコピーしたすべてのコードを貼り付けます。

ファイルの名前をga-local.jsに変更します。

次に、URLを変更して、Google AnalyticsコードでローカルにホストされているAnalyticsスクリプトファイルを呼び出します。次のようになります。つまり、https://domain.xyz/google-analytics/ga.js

最後に、新しいGoogleアナリティクスコードをウェブページのフッターに配置します。

準備できた。次に、Google PageSpeed Insightsのウェブサイトを確認します。Leverage Browser Caching Google Analyticsの警告は表示されません。このソリューションの唯一の問題は、分析スクリプトを手動で定期的に更新することです。


0

2020年のPage Speed Insightsのユーザーエージェントは、モバイル用の「Chrome-Lighthouse」とデスクトップ用の「Google Page Speed Insights」です。

<?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; ?>

-13

以下を使用することを含め、ページ内のすべてのスクリプトを縮小できますanalytics.js

使用する前に、必ずファイルを圧縮してください。そうしないと、処理時間が長くなります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.