gclid и кеш: запрос из клика по рекламе, ключ кеша страницы и замер первого байта

Обработка gclid в кеше — это поведение, при котором параметр gclid в конце адреса перехода по рекламе игнорируется, а ответ отдаётся из файла кеша адреса без параметров. Замеры времени до первого байта по параметрам и наличию кеша на сервере WordPress с Nginx + Apache показали, что 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 в связке Nginx + Apache не отдаёт его напрямую на запрос с параметрами. Дело в том, что приведённая ниже настройка, позволяющая 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] проверяет только, пуста ли вся строка запроса, поэтому gclid, который WP Rocket игнорирует, обрабатывается так же, как любой другой параметр. Если мобильные копии хранятся отдельно, добавляется ещё одна проверка, которая дописывает [-mobile] к имени файла.
В правилах [.htaccess], которые WP Rocket создаёт для Apache, тоже есть условие пустой строки запроса. Этап прямой отдачи файла кеша без 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]. По состоянию на 17 октября 2026 года в нём есть 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Все три запроса вернули одинаковые 21 390 байт менее чем за 0,03 с, а конец HTML запроса с [uk_test] был открыт для проверки времени кеша.
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), поэтому ответы из файла кеша пошли только через минуту.
Даже после отключения и удаления вспомогательного плагина строка [uk_test] осталась в файле конфигурации. Код, который выполняется при отключении, пытается снять фильтр, добавленный с приоритетом 999, с приоритетом по умолчанию, поэтому файл конфигурации пересоздаётся с оставшимся фильтром. Параметр исчезает из списка, только если после удаления плагина пересоздать файл конфигурации ещё раз.
4️⃣ Ключ кеша CDN: исключение рекламных параметров и запросы к исходному серверу
Если CDN помещает строку запроса в ключ кеша как есть, при каждом клике с другим значением gclid копии нет, и запрос доходит до исходного сервера. Если отбрасывать параметры целиком, проблема исчезает, но это не подходит сайтам с адресами, содержимое которых меняется в зависимости от параметров, например с результатами поиска, поэтому правильнее исключать из ключа кеша только рекламные параметры.
Если так исключить рекламные параметры, CDN отвечает той же копией, что и для адреса без параметров, даже при другом значении gclid, и только при отсутствии копии отправляет запрос с параметрами на исходный сервер.
# Статус кеша CDN для двух запросов с разными значениями gclid (имена заголовков у разных 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 из ключа кеша. Первое посещение в точке, где копии ещё нет, по-прежнему проходит через обработку nginx и WP Rocket на исходном сервере, даже если CDN исключает рекламные параметры из ключа.
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 & рекомендуемые материалы














ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

