Проведение Split URL тестирования (разные версии страниц)
Split URL тест — разновидность A/B теста, где контроль и вариант размещены на разных URL. В отличие от стандартного A/B (одна страница, DOM изменяется через JS), Split URL используется когда версии принципиально разные и нецелесообразно держать обе в одном шаблоне.
Когда применяется Split URL
- Полностью новый дизайн страницы vs старый
- Сравнение двух разных лендингов
- Тестирование нового чекаут-флоу vs старого
- Сравнение разных CMS/платформ для одной страницы
- Landing page на разных технологиях (React SPA vs static HTML)
Настройка через nginx
# Случайное разделение трафика 50/50
split_clients "${remote_addr}${http_user_agent}${date_gmt}" $split_variant {
50% "variant";
* "control";
}
server {
listen 80;
server_name company.com;
location = /landing {
if ($split_variant = "variant") {
rewrite ^ /landing-v2 last;
}
# control - остаётся на /landing
}
# Сохранить вариант в cookie для стабильности
location = /landing {
if ($cookie_ab_landing = "variant") {
rewrite ^ /landing-v2 last;
}
if ($cookie_ab_landing = "control") {
# оставить
}
# Назначить и редиректнуть
add_header Set-Cookie "ab_landing=$split_variant; Path=/; Max-Age=2592000; SameSite=Lax";
}
}
Настройка через Cloudflare Workers
addEventListener('fetch', event => {
event.respondWith(handleSplitTest(event.request))
})
const CONTROL_URL = 'https://company.com/checkout-v1'
const VARIANT_URL = 'https://company.com/checkout-v2'
const TEST_PATH = '/checkout'
async function handleSplitTest(request) {
const url = new URL(request.url)
if (url.pathname !== TEST_PATH) {
return fetch(request)
}
// Проверить cookie для stickiness
const cookie = request.headers.get('Cookie') || ''
const cookieMatch = cookie.match(/split_checkout=([^;]+)/)
let variant = cookieMatch ? cookieMatch[1] : null
if (!variant) {
// Детерминированное назначение по IP + UA
const key = request.headers.get('CF-Connecting-IP') + request.headers.get('User-Agent')
const hash = await hashKey(key)
variant = (hash % 2 === 0) ? 'control' : 'variant'
}
const targetUrl = variant === 'variant' ? VARIANT_URL : CONTROL_URL
const response = await fetch(targetUrl, request)
// Клонировать ответ для добавления cookie
const newResponse = new Response(response.body, response)
if (!cookieMatch) {
newResponse.headers.append('Set-Cookie',
`split_checkout=${variant}; Path=/; Max-Age=2592000; SameSite=Lax`)
}
return newResponse
}
Canonical для предотвращения дублей в SEO
Важно: два URL с похожим контентом без canonical → проблема дублей:
<!-- /landing-v2 (тестовая версия) -->
<link rel="canonical" href="https://company.com/landing">
<!-- Или если тест временный, добавить noindex на вариант -->
<meta name="robots" content="noindex, follow">
Если оба URL должны временно быть в индексе — использовать rel="alternate":
<link rel="alternate" href="https://company.com/checkout-v2">
Отслеживание в аналитике
// На обеих версиях страницы — отправить событие с вариантом
const variant = getCookieValue('split_checkout') || 'control'
// GA4 Custom dimension
gtag('set', 'user_properties', {
split_test_checkout: variant
})
// Или как параметр события
gtag('event', 'page_view', {
split_test: 'checkout_redesign',
split_variant: variant
})
// При конверсии
gtag('event', 'purchase', {
transaction_id: orderId,
value: total,
split_test: 'checkout_redesign',
split_variant: variant
})
-- GA4 BigQuery: конверсия по вариантам Split URL теста
SELECT
user_properties.value.string_value AS variant,
COUNT(DISTINCT user_pseudo_id) AS users,
COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_pseudo_id END) AS converters,
ROUND(COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_pseudo_id END) * 100.0 /
COUNT(DISTINCT user_pseudo_id), 2) AS cvr
FROM `project.analytics.events_*`,
UNNEST(user_properties) AS user_properties
WHERE user_properties.key = 'split_test_checkout'
GROUP BY variant;
После теста: промоция победителя
Если вариант победил — заменить контрол и убрать сплит:
# Убрать split, отдавать всем v2
location = /checkout {
rewrite ^ /checkout-v2 last;
}
# Или сменить /checkout-v2 на /checkout
Обновить canonical и убрать noindex/alternate теги.
Срок выполнения
Настройка Split URL теста с cookie-stickiness, аналитикой и SEO-защитой — 1–2 рабочих дня.







