gclid 快取:廣告點選查詢、頁面快取鍵與實測首位元組

gclid 快取處理是忽略接在廣告點選網址後面的 gclid 查詢,改用沒有查詢的網址的快取檔案回應。在 Nginx + Apache 架構的 WordPress 伺服器上依查詢與有無快取測量首位元組的結果,gclid 增加的時間是 0.014~0.015 秒,幾秒等級的延遲只發生在無法使用快取的情況。
在同一台伺服器內量到的首位元組,沒有查詢時是 0.014~0.015 秒,加上廣告點選查詢時是 0.029~0.030 秒。WordPress 在沒有快取的情況下重新產生同一個頁面時,花了 3.639 秒與 3.260 秒。
1️⃣ gclid 快取:廣告點選網址與快取鍵
使用 Google Ads 的自動標記功能時,點選廣告的訪客網址後面會加上 [?gclid=值]。這個值是識別廣告點選的參數,每位訪客都不同,不過同一個人再次點選同一則廣告時,也可能沿用同樣的值。
實際的廣告點選網址很少只接 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網址後面接了查詢,瀏覽器開啟的仍是同一個頁面,但對快取來說是不同的位址。HTTP 快取標準(RFC 9111)定義,快取挑選已儲存回應的依據——快取鍵,至少由請求方法與目標 URI 組成,而目標 URI 也包含查詢字串。
查詢字串如果原封不動放進快取鍵,gclid 值不同的每次點選都會變成新的位址。回應途經的 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 與廣告形式查詢的六次請求則沒有這個標頭。帶查詢的請求首位元組增加 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 忽略的查詢清單:用同一個快取檔案回應
不快取帶有查詢的網址是 WP Rocket 的預設行為,但廣告點選查詢是例外。WP Rocket 會在判斷前先拿掉忽略清單中的參數,如果沒有剩下的查詢,就用沒有查詢的網址的快取檔案回應。
// 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] 拿掉忽略的查詢後的結果如果是空的,快取檔案路徑也會設為沒有查詢的網址。帶 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 重新產生,沒有快取註解。如果你在廣告網址上一併加了自己做的追蹤查詢,這些點選每次都會走這條路徑。
要修改清單時,請使用 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/] 內以網域命名的設定檔,並在每次請求時讀取該檔,所以只加篩選器而不重新產生設定檔,新清單就不會生效。清單中的查詢不論值是什麼,都使用基本網址的同一個快取檔案,因此不要放入值會改變頁面內容的查詢。
在輔助外掛中加入清單裡沒有的 [uk_test] 並啟用後,設定檔重新產生,那個查詢也加到了清單最後。接著依序請求沒有查詢的網址,以及 [uk_test] 值不同的兩個網址。
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三次請求都在 0.03 秒內回應同樣的 21,390 位元組,並打開帶 [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 -->結尾註解中的快取時間,和沒有查詢的網址的快取檔案相同。啟用輔助外掛之前,同樣的請求會在 0.36~0.38 秒內重新產生,沒有快取註解。
即使啟用之後,同時帶上不在清單中的 [foo] 的請求也不會使用快取檔案,而是重新產生。
重新產生設定檔後的 1 分鐘內,[uk_test] 請求也會重新產生。因為這個架構的 PHP OPcache 每 60 秒重新檢查變更的檔案(revalidate_freq),過了 1 分鐘之後才開始用快取檔案回應。
即使停用並刪除輔助外掛,設定檔中仍留著 [uk_test] 那一行。因為停用時執行的程式碼,試圖用預設優先順序移除以優先順序 999 加入的篩選器,結果在篩選器仍存在的情況下重新產生了設定檔。刪除外掛後要再重新產生一次設定檔,那個查詢才會從清單中移除。
4️⃣ CDN 快取鍵:排除廣告查詢與向來源伺服器請求
CDN 如果把查詢字串原封不動放進快取鍵,gclid 值不同的每次點選都找不到副本,請求會一路送到來源伺服器。把查詢整個拿掉雖然能解決這個問題,但不適合有搜尋結果這類內容會依查詢改變的網址的網站,所以只從快取鍵排除廣告查詢比較合適。
這樣排除廣告查詢後,即使 gclid 值不同,CDN 也會用和沒有查詢的網址相同的副本回應,只有在沒有副本時才帶著查詢向來源伺服器請求。
# gclid 值不同的兩次請求的 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'值不同的兩次請求都是 HIT,且副本儲存時間和沒有查詢的網址相同時,代表那個 CDN 正從快取鍵排除 gclid。副本還是空的節點上的第一次造訪,即使 CDN 從鍵中排除廣告查詢,仍會照樣經過來源伺服器的 nginx 與 WP Rocket 處理。
5️⃣ 廣告點選變慢的原因:空著的頁面快取
從廣告進來的第一個畫面很慢時,很容易以為是 gclid 繞過了快取,但只要有快取檔案,即使帶著查詢也會用同一個快取檔案回應。讓首位元組增加好幾秒的,是快取檔案空著、WordPress 必須重新產生頁面的情況。
快取檔案在超過 快取壽命後會被刪除,WP Rocket 的預設值是 10 小時。儲存文章或設定時,相關快取也會一併刪除;WP Rocket 每週下載一次的清單換成新版本並儲存時,整個網站的快取也會被清空。
開啟預先載入時,WP Rocket 會重新開啟被清空的網址補上快取,在那之前進來的訪客,就得等待頁面重新產生的時間。只帶廣告查詢的請求也會用沒有查詢的網址建立快取檔案,所以第一次遇到空快取的廣告點選,會替下一位訪客補上快取。
清空快取後,第一個用廣告形式查詢開啟的請求找不到快取檔案,花了 0.341~0.369 秒重新產生,而沒有查詢的網址的快取檔案在同一秒產生。
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三次都依同樣的順序進行,接著開啟的沒有查詢的請求,用新的快取檔案在 0.023~0.025 秒內回應。因為請求不是來自行動裝置,所以只產生了兩個電腦版檔案。
廣告連結的網址,請自行確認是否有快取檔案以及建立的時間;如果設定另外產生行動版副本,就要一併確認電腦版與行動版檔案。
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 & 推薦內容





ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。










