Тестування за URL-адресами (різні версії сторінок)
Тестування за URL-адресами — це варіант A/B-тестування, де контроль і варіант розміщені на різних URL. На відміну від стандартного A/B-тестування (одна сторінка, зміни DOM через JS), тестування за URL використовується, коли версії принципово різні та недоцільно тримати обидві в одному шаблоні.
Коли використовувати тестування за URL
- Абсолютно новий дизайн сторінки проти старої версії
- Порівняння двох різних посадкових сторінок
- Тестування нового потоку оформлення замовлення проти старого
- Порівняння різних CMS/платформ для однієї сторінки
- Посадкова сторінка на різних технологіях (React SPA vs статичний 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 для стабільності
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
}
Канонічні теги для запобігання дублікатам 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: конверсія за варіантами тесту розділеної 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;
Після тесту: просування переможця
Якщо варіант переміг — замініть контроль і видаліть спліт:
# Видаліть спліт, подавайте v2 всім
location = /checkout {
rewrite ^ /checkout-v2 last;
}
# Або перейменуйте /checkout-v2 на /checkout
Оновіть канонічний вираз і видаліть теги noindex/alternate.
Час виконання
Налаштування тесту розділеної URL-адреси з cookie-stickiness, аналітикою та SEO-захистом — 1–2 робочих дні.







