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

聯盟行銷揭露 Ver 3.1
聯盟行銷揭露 Ver 3.2(僅限行動版)
測試環境 RHEL 系列AlmaLinux 9.8Nginx 1.28 + Apache 2.4WP Rocket 3.23.5.12026-10-17 確認

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,各自用不同的標準處理這個查詢。

廣告點選 https://example.com/sample-page/?gad_source=1&gbraid=…&gclid=…
CDN
如果從快取鍵排除廣告查詢→ 用沒有查詢的網址的副本回應
如果沒有副本→ 帶著查詢向來源伺服器請求
nginx
只要有任何一個查詢→ 跳過直接用快取檔案回應,轉給 Apache
WP Rocket
如果只有忽略清單中的查詢→ 用沒有查詢的網址的快取檔案回應
如果沒有快取檔案→ WordPress 重新產生頁面

CDN 沒有副本,或快取鍵會區分查詢時,請求就會轉到來源伺服器。之後的速度取決於 nginx 與 WP Rocket 是否找到快取檔案。

🧭 廣告點選請求流程
WP Rocket說明圖解
🔗 請求網址
☁️ 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 值不同,也會用和沒有查詢的網址相同的副本回應,請求不會送到來源伺服器。
CDN 沒有副本時,請求會轉到來源伺服器,而因為沒有查詢,nginx 會不經 PHP 直接用 WP Rocket 快取檔案回應。在伺服器內量到的首位元組是 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 與廣告形式查詢的六次請求則沒有這個標頭。帶查詢的請求首位元組增加 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 忽略的查詢清單:用同一個快取檔案回應

不快取帶有查詢的網址是 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 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 -->

結尾註解中的快取時間,和沒有查詢的網址的快取檔案相同。啟用輔助外掛之前,同樣的請求會在 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 必須重新產生頁面的情況。

📊有無快取的首位元組伺服器內測量 · 秒
用快取檔案回應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 每週下載一次的清單換成新版本並儲存時,整個網站的快取也會被清空。

開啟預先載入時,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_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 加進這個欄位,仍會使用基本網址的快取檔案(依 3.23.5.1 程式碼)。如果要依值分別保存快取檔案,請照官方說明,先用輔助外掛把它從忽略清單中移除,再加進這個欄位。

nginx 與 Apache 預設的存取記錄格式沒有處理時間,只能從回應大小判斷。同一個頁面以壓縮回應各取兩次時,快取檔案的回應兩次大小相同,重新產生的回應兩次相差 2 位元組。之後的請求只要在 nginx 記錄格式加上 [$request_time],就會留下每個請求的處理時間。

🧭 WP Rocket 相關文章 文章 16 · 工具 3
📋 WP Rocket 設定教學 📄 WP Rocket MCP Server 📄 WP Rocket 韓文網址 📄 nginx njs 📄 WP Rocket 多語系快取 📄 gclid 快取
📄 WP Rocket 速度測試 📝 快取 · 優化外掛 📝 速度改善案例
📋 快取:定義與所有領域 📄 網站快取 & 伺服器內部快取
📋 BEST 主機 TOP 7 📄 快速主機 2026
🛠️ WordPress 偵測 🛠️ WHOIS 網域查詢 🛠️ 我的 IP 查詢

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 6   +   5   =