gclid キャッシュ:広告クリックのクエリとページキャッシュキー、最初のバイトの実測

公正取引委員会の広告文 Ver 3.1
公正取引委員会の広告文 Ver 3.2(モバイル専用)
テスト環境 RHEL系AlmaLinux 9.8Nginx 1.28 + Apache 2.4WP Rocket 3.23.5.12026-10-17 確認

gclidのキャッシュ処理とは、広告クリックのURL末尾に付くgclidクエリを無視し、クエリのないURLのキャッシュファイルで応答する動作です。Nginx + Apache構成のWordPressサーバーでクエリとキャッシュの有無ごとに最初のバイトまでの時間を測った結果、gclidが加えた時間は0.014〜0.015秒で、数秒単位の遅れはキャッシュを使えなかった場合にだけ発生しました。

同じサーバー内で測った最初のバイトまでの時間は、クエリがないときは0.014〜0.015秒、広告クリックのクエリを付けたときは0.029〜0.030秒でした。キャッシュなしでWordPressが同じページを新しく生成したときは、3.639秒と3.260秒かかりました。

1️⃣ gclidキャッシュ:広告クリックのURLとキャッシュキー

Google広告の自動タグ設定を使うと、広告をクリックした訪問者のURL末尾に[?gclid=値]が追加されます。この値は広告クリックを識別するパラメーターなので訪問者ごとに変わりますが、同じ人が同じ広告をもう一度押すと同じ値が使われることもあります。

実際の広告クリックのURLにはgclidだけが付くわけではありません。gad_source、gad_campaignid、gbraidが一緒に付くことが多く、wbraidが加わることもあります。

https://example.com/sample-page/?gad_source=1&gad_campaignid=1234567890&gbraid=EXAMPLE&gclid=EXAMPLE
https://example.com/sample-page/?gclid=EXAMPLE&gbraid=EXAMPLE&wbraid=EXAMPLE

URLの末尾にクエリが付いてもブラウザでは同じページが開きますが、キャッシュにとっては別のURLです。HTTPキャッシュの標準(RFC 9111)は、キャッシュが保存した応答を選ぶ基準であるキャッシュキーを、少なくともリクエストメソッドと対象URIで構成すると定義しており、対象URIにはクエリ文字列も含まれます。

キャッシュキーにクエリ文字列がそのまま入ると、gclidの値が違うクリックはすべて新しいURLになります。応答が通るCDN、nginx、WP Rocketは、このクエリをそれぞれ異なる基準で処理します。

広告クリック https://example.com/sample-page/?gad_source=1&gbraid=…&gclid=…
CDN
キャッシュキーから広告クエリを除くと→ クエリのないURLのコピーで応答
コピーがなければ→ クエリを付けたままオリジンサーバーへリクエスト
nginx
クエリが一つでもあれば→ キャッシュファイルの直接応答を飛ばしてApacheへ渡す
WP Rocket
無視するクエリリストのクエリだけなら→ クエリのないURLのキャッシュファイルで応答
キャッシュファイルがなければ→ WordPressがページを新しく生成

CDNにコピーがないか、キャッシュキーがクエリを区別すると、リクエストはオリジンサーバーに渡されます。その後の速さは、nginxとWP Rocketがキャッシュファイルを見つけるかどうかで決まります。

🧭 広告クリックのリクエストの流れ
WP Rocket解説ダイアグラム
🔗 リクエストURL
☁️ CDNのコピー
🌐 リクエスト
/sample-page/クエリなし
/sample-page/?gclid=…gad_source · gbraid · gclid
→リクエスト
☁️ CDN
🔑 キャッシュキーから広告クエリを除外
✅ 同じコピーで応答
➡️ オリジンサーバーへリクエスト
➡️ クエリを付けたままオリジンサーバーへ
→オリジンへのリクエスト
🖥️ nginx
🔎 クエリ文字列が空かどうか
通らない
✅ キャッシュファイルを直接応答 · HIT
➡️ クエリがあるのでApacheへ渡す
→Apache
🚀 WP Rocket
📋 無視するクエリのリスト
Apache · PHP
通らない
通らない
✅ 広告クエリを除いて同じキャッシュファイルで応答
CDNにコピーがあれば、クエリのないリクエストにはCDNがコピーですぐ応答し、オリジンサーバーのnginxとWP Rocketは通りません。
CDNがキャッシュキーから広告クエリを除くと、gclidの値が違ってもクエリのないURLと同じコピーで応答し、リクエストはオリジンサーバーまで届きません。
CDNにコピーがなければリクエストはオリジンサーバーに渡され、クエリがないのでnginxがWP RocketのキャッシュファイルをPHPなしですぐ応答します。サーバー内で測った最初のバイトまでの時間は0.014〜0.015秒でした。
広告クエリが付いたリクエストはクエリを付けたままオリジンサーバーに渡され、nginxはクエリがあるためキャッシュファイルの直接応答を飛ばしてApacheへ渡します。続いてWP Rocketが広告クエリを除いて同じキャッシュファイルで応答し、最初のバイトまでの時間は0.029〜0.030秒でした。

2️⃣ nginxの静的配信:クエリがあればApacheへ渡す

キャッシュファイルがディスクにあっても、Nginx + Apache構成のnginxはクエリが付いたリクエストにそのファイルを直接返しません。nginxにWP Rocketのキャッシュファイルを直接読ませる下の設定が、クエリ文字列が空のときだけファイルパスを作るからです。

# nginx.conf — httpブロック:キャッシュファイルを飛ばす条件
map $http_cookie $rocket_cookie {
    default                   0;
    '~*wordpress_logged_in'   1;
    '~*wp-postpass'           1;
    '~*comment_author'        1;
    '~*woocommerce_items'     1;
}
map $request_method $rocket_method {
    default  1;
    GET      0;
    HEAD     0;
}
map $query_string $rocket_query {
    default  1;
    ''       0;      # クエリ文字列が空のときだけ0
}

# serverブロック
set $rocket_bypass '';
if ($rocket_cookie = 1) { set $rocket_bypass '1'; }
if ($rocket_method = 1) { set $rocket_bypass '1'; }
if ($rocket_query  = 1) { set $rocket_bypass '1'; }
set $rocket_file '/wp-content/cache/wp-rocket/example.com${request_uri}index-https.html';
if ($rocket_bypass = '1') { set $rocket_file ''; }

location / {
    try_files $rocket_file @apache;                       # パスが空かファイルがなければApacheへ
    add_header X-Rocket-Nginx-Serving-File 'HIT' always;  # nginxがキャッシュファイルを直接返した印
}

[$rocket_query]はクエリ文字列全体が空かどうかだけを確認するので、WP Rocketが無視するgclidもほかのクエリと同じように扱われます。モバイル用のコピーを別に持つ設定なら、ファイル名に[-mobile]を付ける判定がもう一つ入ります。

WP RocketがApache用に作る[.htaccess]のルールにも、クエリ文字列が空でなければならないという条件が入っています。PHPを通さずにキャッシュファイルを直接返す段階は、nginxでもApacheでも、クエリのないリクエストにだけ適用されます。

クエリのないリクエストには[X-Rocket-Nginx-Serving-File: HIT]ヘッダーが含まれ、gclidや広告形式のクエリを付けた6回のリクエストにはこのヘッダーがありませんでした。クエリ付きのリクエストで最初のバイトまでの時間が0.014〜0.015秒延びたのは、ApacheとPHPがキャッシュファイルを読んで応答する過程が加わったためです。

curl -so /dev/null -H 'Accept-Encoding: gzip' -w '%{time_starttransfer}\n' \
  'https://example.com/sample-page/'
0.015127
curl -so /dev/null -H 'Accept-Encoding: gzip' -w '%{time_starttransfer}\n' \
  'https://example.com/sample-page/?gclid=test123'
0.029525
curl -sI 'https://example.com/sample-page/' | grep -i x-rocket-nginx-serving-file
x-rocket-nginx-serving-file: HIT

[time_starttransfer]は、リクエストから最初のバイトを受け取るまでの時間です。CDNを通さずにサーバー内で測るときは[--resolve example.com:443:127.0.0.1]を一緒に付けます。

3️⃣ WP Rocketの無視クエリリスト:同じキャッシュファイルで応答

クエリが付いたURLをキャッシュしないのがWP Rocketの基本動作ですが、広告クリックのクエリは例外です。WP Rocketは無視するクエリリストにあるパラメーターを判定の前に除き、残ったクエリがなければクエリのないURLのキャッシュファイルで応答します。

// wp-rocket/inc/classes/Buffer/class-tests.php (3.23.5.1)
public function get_query_params() {
    // …
    $params = array_diff_key(                                  // 無視するクエリを先に除く
        self::$get,
        $this->config->get_config( 'cache_ignored_parameters' )
    );
    // …
}

public function can_process_query_string() {
    // …
    $params = $this->get_query_params();

    if ( ! $params ) {                                         // 残ったクエリがなければキャッシュで処理
        return self::memoize( __FUNCTION__, [], true );
    }
    // lang · s · permalink_name · lp-variation-id と[Cache Query String(s)]に入れたクエリだけ通過
    // …
}

[get_query_params]が無視するクエリを除いた結果が空なら、キャッシュファイルのパスもクエリのないURLに決まります。gclidを付けたリクエストはApacheとPHPを通りましたが、HTML末尾のキャッシュコメントはクエリのないリクエストと同じで、応答サイズもキャッシュファイル(gzip)と同じ350,668バイトでした。

無視するクエリのリストは、WP Rocketが週に一度自社サーバーから受け取って[wp-content/wp-rocket-config/dynamic-lists.json]に保存する基本リストです。2026年10月17日時点のリストには、gclid、gbraid、wbraid、gad_source、gad_campaignidが入っています。

リストにないクエリが一つでも混ざるとWP Rocketはキャッシュを使わず、リストにない任意のクエリを付けた同じページは、キャッシュコメントなしでWordPressが新しく生成しました。広告のURLに自作の追跡用クエリを一緒に付けているなら、そのクリックは毎回この経路で処理されます。

リストを変えるときは、WP Rocketが案内している ヘルパープラグインを使います。このプラグインは[rocket_cache_ignored_parameters]フィルターでクエリを追加・削除し、有効化・無効化のときにWP Rocketの設定ファイルを作り直します。

// WP Rocket | Ignore Query Strings 1.1.1(WP Rocketサポートチームのヘルパープラグイン)より
function define_ignored_parameters( array $params ) {
    $params['new_query_string'] = 1;      // 無視するクエリに追加
    //unset ( $params['utm_source'] );    // 無視するクエリから外す
    return $params;
}
add_filter( 'rocket_cache_ignored_parameters', __NAMESPACE__ . '\define_ignored_parameters', 999 );

register_activation_hook( __FILE__, __NAMESPACE__ . '\flush_wp_rocket' );   // 有効化時に rocket_generate_config_file() を実行

WP Rocketはこのリストを[wp-content/wp-rocket-config/]内のドメイン名の設定ファイルに書いておき、リクエストのたびにそのファイルを読むので、フィルターだけ入れて設定ファイルを作り直さないと新しいリストは適用されません。リストに入れたクエリは値が違っても基本URLのキャッシュファイル1つを使うため、値によってページの内容が変わるクエリは入れません。

ヘルパープラグインにリストになかった[uk_test]を加えて有効化すると、設定ファイルが作り直され、そのクエリがリストの末尾に追加されました。続いて、クエリのないURLと[uk_test]の値が違う2つのURLを順にリクエストしました。

curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/'
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/?uk_test=abc'
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/?uk_test=xyz'
21390 0.025720
21390 0.025507
21390 0.027929

3つのリクエストはすべて同じ21,390バイトで0.03秒以内に応答し、[uk_test]を付けたリクエストのHTML末尾を開いてキャッシュの時刻を確認しました。

curl -s --compressed 'https://example.com/sample-page/?uk_test=abc' | tail -c 200
ck=lazyLoadYoutubeIframe;}});</script></body>
</html>

<!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me - Debug: cached@1792248839 -->

末尾コメントのキャッシュ時刻は、クエリのないURLのキャッシュファイルと同じでした。ヘルパープラグインを有効にする前は、同じリクエストがキャッシュコメントなしで0.36〜0.38秒かけて新しく生成されていました。

有効化した後も、リストにない[foo]を一緒に付けたリクエストはキャッシュファイルを使わずに新しく生成されました。

設定ファイルを作り直した直後の1分間は、[uk_test]のリクエストも新しく生成されました。PHP OPcacheが変更されたファイルを再確認する間隔(revalidate_freq)が60秒の構成なので、1分が過ぎてからキャッシュファイルで応答しました。

ヘルパープラグインを無効化して削除しても、設定ファイルには[uk_test]の行が残りました。無効化時に実行されるコードが、優先度999で入れたフィルターを既定の優先度で外そうとするため、フィルターが残ったまま設定ファイルを作り直すからです。プラグインを削除した後にもう一度設定ファイルを作り直すと、リストから消えます。

4️⃣ CDNのキャッシュキー:広告クエリの除外とオリジンへのリクエスト

CDNがキャッシュキーにクエリ文字列をそのまま入れると、gclidの値が違うクリックのたびにコピーがなく、リクエストがオリジンサーバーまで届きます。クエリを丸ごと除けばこの問題はなくなりますが、検索結果のようにクエリによって内容が変わるURLがあるサイトには合わないので、広告クエリだけをキャッシュキーから除くのが適切です。

このように広告クエリを除くと、gclidの値が違ってもCDNはクエリのないURLと同じコピーで応答し、コピーがないときだけクエリを付けたままオリジンサーバーにリクエストします。

# gclidの値が違う2つのリクエストのCDNキャッシュ状態(ヘッダー名はCDNによって異なる)
curl -sI 'https://example.com/sample-page/?gclid=test1' | grep -i -E 'cache|age'
curl -sI 'https://example.com/sample-page/?gclid=test2' | grep -i -E 'cache|age'

値の違う2つのリクエストがどちらもHITで、コピーを保存した時刻がクエリのないURLと同じなら、そのCDNはgclidをキャッシュキーから除いています。コピーが空の拠点への最初のアクセスは、CDNが広告クエリをキーから除いていても、オリジンサーバーのnginxとWP Rocketの処理をそのまま通ります。

5️⃣ 広告クリックが遅くなる原因:空のページキャッシュ

広告から来た最初の画面が遅いと、gclidがキャッシュを迂回したと考えがちですが、キャッシュファイルがあればクエリが付いても同じキャッシュファイルで応答します。最初のバイトまでの時間を数秒も延ばすのは、キャッシュファイルが空でWordPressがページを新しく生成する場合です。

📊キャッシュの有無別の最初のバイトまでの時間サーバー内で測定 · 秒
キャッシュファイルで応答WordPressが新しく生成
キャッシュファイルがあるとき
同じページをクエリなしで、そして広告クリックのクエリを付けてリクエストしたときの最初のバイトまでの時間です。クエリが付くとApacheとPHPを通りますが、同じキャッシュファイルで応答します。
0.0000.0070.0150.0220.030
クエリなし0.014〜0.015秒nginxが直接応答
gclid0.029〜0.030秒Apache · PHP経由
キャッシュファイルがあるときとないとき
広告クリックのクエリを付けたリクエストと、キャッシュファイルなしでWordPressがページを新しく生成したリクエストの最初のバイトまでの時間です。
0.00.91.82.73.6
gclid0.029〜0.030秒キャッシュファイルあり
新規生成3.639秒1回目
新規生成3.260秒2回目
数値は、Nginx + Apache構成のWordPressサーバー内で同じページをリクエストして測った最初のバイトまでの時間です(2026年10月17日)。

キャッシュファイルは キャッシュの有効期間が過ぎると削除され、WP Rocketの既定値は10時間です。投稿や設定を保存すると関連するキャッシュも一緒に削除され、WP Rocketが週に一度受け取るリストが新しい版に替わって保存されるときも、サイトのキャッシュ全体が空になります。

プリロードを有効にしておけば、空になったURLをWP Rocketが開き直してキャッシュを埋め、それより前に来た訪問者はページが新しく生成される時間を待つことになります。広告クエリだけが付いたリクエストもクエリのないURLとしてキャッシュファイルを作るので、空のキャッシュに最初に当たった広告クリックが次の訪問者のためにキャッシュを埋めます。

キャッシュを空にした直後に広告形式のクエリで開いた最初のリクエストは、キャッシュファイルがないため0.341〜0.369秒かけて新しく生成され、同じ秒にクエリのないURLのキャッシュファイルができました。

curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/?gclid=EXAMPLE1'
ls -l --time-style='+%F %T' wp-content/cache/wp-rocket/example.com/sample-page/
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/'
21361 0.366881
合計 116
-rw-r--r-- 1 example nobody 90908 2026-10-17 23:56:38 index-https.html
-rw-r--r-- 1 example nobody 21385 2026-10-17 23:56:38 index-https.html_gzip
21385 0.025379

3回とも同じ順で進み、続けて開いたクエリのないリクエストは新しいキャッシュファイルで0.023〜0.025秒で応答しました。モバイル端末からのリクエストではないので、PC用のファイル2つだけができました。

広告のリンク先URLは、キャッシュファイルがあるかと作成時刻を直接確認し、モバイル用のコピーを別に作る設定ならPC用とモバイル用のファイルを一緒に確認します。

ls -l --time-style='+%F %T' wp-content/cache/wp-rocket/example.com/sample-page/
合計 3520
-rw-r--r-- 1 example nobody 1445922 2026-10-17 14:07:44 index-https.html
-rw-r--r-- 1 example nobody  350668 2026-10-17 14:07:44 index-https.html_gzip
-rw-r--r-- 1 example nobody 1446862 2026-10-17 14:07:47 index-mobile-https.html
-rw-r--r-- 1 example nobody  351042 2026-10-17 14:07:47 index-mobile-https.html_gzip
curl -s --compressed 'https://example.com/sample-page/?gclid=test123' | tail -c 200
n/1/wp-content/uploads/example-plugin/style.css' media='all' /></noscript></body>
</html>
<!-- Cached for great performance - Debug: cached@1792213663 -->

キャッシュファイルから出た応答には、HTML末尾のコメントの[Debug: cached@]の後ろに、キャッシュファイルを作った時刻がUnix時間で書かれています。この表示がなければ、その応答はWordPressが新しく生成したものです。

🔢 FAQ & おすすめコンテンツ

2026年10月17日時点のWP Rocketの基本リストには、utm_sourceのようなutmクエリ、Facebookのfbclid、Microsoft Advertisingのmsclkid、Googleショッピングのsrsltidも入っているので、同じキャッシュファイルを使います。リストにないクエリはヘルパープラグインで追加するまでキャッシュを使わないため、使っている広告プラットフォームのクエリ名が[dynamic-lists.json]にあるかを先に確認します。

できません。WP Rocketは無視するクエリを先に除いてから[Cache Query String(s)]のリストを確認するので、gclidはこの欄に入れても基本URLのキャッシュファイルを使います(3.23.5.1のコード基準)。値ごとにキャッシュファイルを分けたいなら、公式の案内どおりヘルパープラグインで無視リストから外してからこの欄に入れます。

nginxとApacheの基本のアクセスログ形式には処理時間がないので、応答サイズで見当をつけることになります。同じページを圧縮応答で2回ずつ受け取ると、キャッシュファイルの応答は2回とも同じサイズで、新しく生成した応答は2回のサイズが2バイト違いました。これからのリクエストは、nginxのログ形式に[$request_time]を加えればリクエストごとに処理時間が残ります。

🧭 WP Rocket・Perfmatters関連記事 記事15・ツール3
🗂️ WPとは?
📋 WP Rocket設定ガイド 📄 Perfmattersガイド 📄 WP Rocket With Perfmatters 📄 WP Rocket MCP Server 📄 WP Rocket 韓国語URL 📄 nginx njs 📄 WP Rocket 多言語キャッシュ 📄 gclid キャッシュ
📄 WP Rocket速度テスト 📝 キャッシュ・最適化プラグイン 📝 速度改善の事例
📋 キャッシュ:定義とすべての分野 📄 ウェブサイトキャッシュ&サーバー内部キャッシュ
📋 BESTホスティングTOP 7 📄 高速ホスティング2026
🛠️ WordPressの検出 🛠️ Whoisドメイン検索 🛠️ 自分のIPアドレスを確認する
WP Rocket設定ガイド:メニュー別の基本設定と20% Promo Code
WordPress · WP Rocket
WP Rocket設定ガイド:メニュー別の基本設定と20% Promo Code
WP Rocketのメニューごとの基本設定と料金をまとめた記事です。
記事を見る →現在の記事
Perfmattersプラグインのレビュー & ガイド:5年間使ったWordPressパフォーマンス最適化の設定方法
WordPress · Perfmatters
Perfmattersプラグインのレビュー & ガイド:5年間使ったWordPressパフォーマンス最適化の設定方法
Perfmattersのメニューごとの推奨設定とScript Managerの使い方です。
記事を見る →現在の記事
WP Rocket With Perfmattersの使い方:最適化機能の設定ガイド
WordPress · Perfmatters
WP Rocket With Perfmattersの使い方:最適化機能の設定ガイド
WP RocketとPerfmattersを併用するときの設定方法です。
記事を見る →現在の記事
WP Rocket MCP Server:AIツールでキャッシュと設定を扱う
WordPress · MCP
WP Rocket MCP Server:AIツールでキャッシュと設定を扱う
AIツールからWP Rocketのキャッシュと設定を扱う方法です。
記事を見る →現在の記事
WP Rocket 韓国語URLのリクエストの流れ図
WordPress · WP Rocket
WP Rocket 韓国語URL
韓国語URLへのリクエストでエンコードの大文字・小文字が違うためにnginxがキャッシュファイルを見つけられない原因と、njsで直す方法です。
記事を見る →現在の記事
nginx njs の変数とキャッシュファイルのパスの図
Server · nginx
nginx njs:モジュールのインストールと js_set の設定、reload の適用で JavaScript 変数を作る
nginx の設定の中で JavaScript 関数から変数を作る njs モジュールをインストールし、js_set 変数を reload で適用する方法です。
記事を見る →現在の記事
WP Rocket 多言語キャッシュの記事保存の流れ図
WordPress · WP Rocket
WP Rocket 多言語キャッシュ
下書きを保存すると翻訳版のキャッシュが言語フォルダごと削除される原因と、それを防ぐコードです。
記事を見る →現在の記事
広告クエリ付きのリクエストが CDN にコピーがないとき元のサーバーへ渡り、nginx から Apache に移った後、WP Rocket が広告クエリを外して同じキャッシュファイルで応答する流れ
Server・キャッシュ
gclid キャッシュ:広告クリックのクエリとページキャッシュキー、最初のバイトの実測
広告クリックの URL 末尾に付く gclid クエリを無視し、クエリのない URL のキャッシュファイルで応答する動作を、最初のバイトまでの時間で測った記事です。
記事を見る →現在の記事

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 8   +   8   =