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

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=EXAMPLEURLの末尾にクエリが付いてもブラウザでは同じページが開きますが、キャッシュにとっては別のURLです。HTTPキャッシュの標準(RFC 9111)は、キャッシュが保存した応答を選ぶ基準であるキャッシュキーを、少なくともリクエストメソッドと対象URIで構成すると定義しており、対象URIにはクエリ文字列も含まれます。
キャッシュキーにクエリ文字列がそのまま入ると、gclidの値が違うクリックはすべて新しいURLになります。応答が通るCDN、nginx、WP Rocketは、このクエリをそれぞれ異なる基準で処理します。
CDNにコピーがないか、キャッシュキーがクエリを区別すると、リクエストはオリジンサーバーに渡されます。その後の速さは、nginxとWP Rocketがキャッシュファイルを見つけるかどうかで決まります。
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.015127curl -so /dev/null -H 'Accept-Encoding: gzip' -w '%{time_starttransfer}\n' \
'https://example.com/sample-page/?gclid=test123'0.029525curl -sI 'https://example.com/sample-page/' | grep -i x-rocket-nginx-serving-filex-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.0279293つのリクエストはすべて同じ21,390バイトで0.03秒以内に応答し、[uk_test]を付けたリクエストのHTML末尾を開いてキャッシュの時刻を確認しました。
curl -s --compressed 'https://example.com/sample-page/?uk_test=abc' | tail -c 200ck=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がページを新しく生成する場合です。
キャッシュファイルは キャッシュの有効期間が過ぎると削除され、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.0253793回とも同じ順で進み、続けて開いたクエリのないリクエストは新しいキャッシュファイルで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_gzipcurl -s --compressed 'https://example.com/sample-page/?gclid=test123' | tail -c 200n/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 & おすすめコンテンツ









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






