гілки стратегії в рекомендаціях Google
Якщо faceted URLs не потрібні в пошуку — не допускайте їх сканування. Якщо вони можуть індексуватися — зробіть URL, відповіді й порядок параметрів передбачуваними для crawler.
Технічне SEO · Faceted navigation · Crawl & indexation
Faceted navigation стає SEO-проблемою, коли корисний інтерфейс фільтрів непомітно перетворюється на неконтрольований генератор URL. Стійке рішення — не вибрати одну директиву для всіх filter pages, а спочатку зафіксувати URL eligibility contract, синхронізувати з ним discovery, crawl, indexation, canonical і sitemap, а після релізу перевірити ті самі URL cohorts.

Коротка відповідь
Не починайте з noindex або canonical для всіх URL фільтрів. Спершу віднесіть кожен filter state до одного класу: indexable landing page, crawlable duplicate, user-only state, noindex exception або invalid/empty URL. Потім змусьте URL generation, internal links, robots.txt, HTTP status, canonical і sitemap виконувати цю роль та перевірте зміни у верифікованих Googlebot logs і Search Console.
Якщо faceted URLs не потрібні в пошуку — не допускайте їх сканування. Якщо вони можуть індексуватися — зробіть URL, відповіді й порядок параметрів передбачуваними для crawler.
Для filter combination без результатів або зі структурно некоректним набором значень Google радить 404, а не редирект на універсальну порожню видачу.
Для crawlable facet URLs із query parameters Google рекомендує стандартний ampersand і стабільний порядок параметрів замість нестандартних розділювачів та випадкових permutations.
Етап 1 · Опишіть систему
На екрані може бути лише кілька фільтрів, але їхні комбінації створюють величезний crawl space. До зміни директив потрібно зрозуміти, які URL взагалі генерує інтерфейс і як crawler їх знаходить.
Актуальна документація Google описує головний failure mode faceted navigation: URL parameters можуть утворювати дуже великий або фактично нескінченний простір адрес. До першого запиту crawler не знає, чи буде нова комбінація корисною, тому неконтрольовані facets здатні спричиняти overcrawling і сповільнювати discovery справді важливих URL. Тому перший об'єкт діагностики — не окремий URL, а URL grammar, що породжує весь cohort.
На репрезентативних category pages зафіксуйте facet keys, можливі values, multi-select, sorting, pagination, tracking parameters і те, чи може змінюватися порядок параметрів. Не пропускайте стани, що виникають лише після JavaScript interaction.
ШляхCategory template → filter UI → generated href/history URL → server response
КритерійВи можете перерахувати параметри й path segments, що створюють різні URL, та пояснити, яка UI-дія генерує кожен з них.
Не змішуйте filtering, sort order, pagination і campaign parameters в один клас. Вони виглядають схоже, але можуть потребувати різної crawl, indexation та canonical policy.
КритерійКожна зміна URL має названий тип і owner: filter, sort, pagination, tracking або application state.
Добуток кількості facet values використовуйте лише як грубу верхню межу. Потім порівняйте теоретичний space з URL, які реально з'являються в links, sitemaps, logs та Search Console. Це діагностична оцінка, а не прогноз трафіку.
КритерійТеоретичний ризик URL space та фактичний discovery/crawl sample задокументовані окремо.
Кастомна схема
Схема відділяє базову категорію від filter dimensions і згенерованих URL states та показує, чому eligibility decision має з'явитися раніше, ніж кожна комбінація стане crawlable link.
Етап 2 · Спершу рішення, потім директиви
Ключове питання — не “robots чи canonical?”. Потрібно вирішити, чи має цей URL взагалі існувати як сторінка для Search, і лише потім підібрати механізми для кожного шару.
Я рекомендую URL eligibility contract, щоб crawl/index рішення не суперечили одне одному. Це інженерна модель Metricum Lab, а не офіційна taxonomy Google. Для кожного state ми задаємо одну роль і звіряємо з нею discovery, HTTP status, index directive, canonical, internal links та sitemap. Такий контракт одразу виявляє несумісні конфігурації — наприклад URL заблокований у robots.txt, але команда очікує, що Google повторно його просканує й побачить noindex.
| Стан | Crawl | Index intent | Canonical / sitemap | Типова реалізація | Перевірка |
|---|---|---|---|---|---|
| Indexable search landing page | Дозволено | Eligible | Self-canonical; canonical URL у sitemap | Stable URL, корисний inventory, crawlable internal links | 200, indexable, self-canonical, linked, у потрібному sitemap cohort |
| Crawlable duplicate/support variant | За потреби | Не має бути окремим preferred URL | Canonical на preferred URL; duplicate без sitemap | Залишати лише за реальної UX/technical потреби | Declared canonical узгоджений; internal links ведуть на preferred URL |
| User-only filter state | Зазвичай без широкого crawl discovery | Немає ролі окремої search landing page | Без sitemap | Button/form state, fragment де доречно або robots pattern для parameter URLs | Фільтр працює для людей; небажаний URL cohort перестає розростатися |
| Noindex exception | Дозволено | Після crawl має бути виключений із Search | Не використовувати як crawl-budget substitute | meta robots noindex або X-Robots-Tag noindex | Google може fetch URL і побачити noindex |
| Empty / impossible state | Може fetch-итися до засвоєння | Не є валідною сторінкою | Без sitemap; canonical не маскує проблему | 404 на тому самому URL + видалення links, що його генерують | Стабільний 404; немає recurring internal discovery path |
Кастомна схема
Decision tree спрямовує filter state до indexable landing page, crawlable duplicate, user-only state, noindex exception або 404 залежно від його user/search purpose та валідності відповіді.
Етап 3 · Виміряйте фактичний crawl demand
Комбінації facet values показують, де потенційно є проблема. Верифіковані server requests показують, чи витрачає Googlebot запити на ці стани зараз.
Якщо є raw access logs, використовуйте їх для групування точних URL patterns, status codes і часу. User-agent рядка недостатньо: Google документує reverse/forward DNS verification та published IP ranges для crawler requests. У Search Console звіт Settings → Crawl stats корисний для trend, response breakdown і host issues, але його example URLs не замінюють повний server log, коли потрібен точний facet cohort.
#!/usr/bin/env python3
"""Summarize verified Googlebot requests by faceted-navigation parameter signature.
Input CSV columns:
timestamp,url,status,user_agent,verified_googlebot
`verified_googlebot` must be produced upstream by reverse/forward DNS validation
or by matching Google's published crawler IP ranges. User-agent text alone is not
sufficient evidence that a request came from Google.
"""
from __future__ import annotations
import csv
import sys
from collections import Counter
from pathlib import Path
from urllib.parse import parse_qsl, urlsplit
FACET_KEYS = {
"brand",
"color",
"size",
"price",
"material",
"rating",
"sort",
}
TRUE_VALUES = {"1", "true", "yes", "verified"}
def facet_signature(url: str) -> str:
"""Return a stable, order-independent signature for known facet keys."""
query = parse_qsl(urlsplit(url).query, keep_blank_values=True)
keys = sorted({key.lower() for key, _ in query if key.lower() in FACET_KEYS})
return "+".join(keys) if keys else "no-known-facets"
def summarize(csv_path: Path) -> Counter[tuple[str, str]]:
counts: Counter[tuple[str, str]] = Counter()
with csv_path.open(newline="", encoding="utf-8") as handle:
reader = csv.DictReader(handle)
required = {"url", "status", "verified_googlebot"}
missing = required.difference(reader.fieldnames or [])
if missing:
raise ValueError(f"Missing CSV columns: {', '.join(sorted(missing))}")
for row in reader:
if row["verified_googlebot"].strip().lower() not in TRUE_VALUES:
continue
signature = facet_signature(row["url"])
status = row["status"].strip() or "unknown"
counts[(signature, status)] += 1
return counts
def main() -> int:
if len(sys.argv) != 2:
print("Usage: python facet-log-classifier.py verified-requests.csv", file=sys.stderr)
return 2
counts = summarize(Path(sys.argv[1]))
print("requests\tstatus\tfacet_signature")
for (signature, status), requests in sorted(
counts.items(), key=lambda item: (-item[1], item[0][0], item[0][1])
):
print(f"{requests}\t{status}\t{signature}")
return 0
if __name__ == "__main__":
raise SystemExit(main())VERIFIED у Python 3.13.5 2026-09-01 на synthetic CSV, який входить до research package. Script навмисно вимагає upstream field verified_googlebot: production traffic не можна вважати Googlebot лише за user-agent string.
Для production analysis перевірте source IP через documented reverse/forward DNS або published crawler IP ranges і лише після цього виставляйте verified Googlebot flag.
ШляхServer access logs → source IP → Google crawler verification
КритерійFacet counts побудовані на verified crawler requests, а не на довірі до user-agent string.
Нормалізуйте parameters у signatures на кшталт brand+color, size+sort або price. Зберігайте HTTP status разом із signature, щоб не втратити error/redirect patterns.
КритерійМожна назвати facet cohorts з найбільшою кількістю requests і їхні основні status codes без ручного перегляду тисяч URL.
Порівняйте crawl requests, response types і host availability за ті самі дати. Crawl Stats використовуйте як site-wide context; для точного URL cohort покладайтеся на logs.
ШляхSearch Console → Settings → Crawl stats
КритерійLog finding і Search Console trend не суперечать один одному суттєво або discrepancy зафіксована для окремого розслідування.
Етап 4 · Просувайте лише корисні стани
Частина filter pages справді може мати власну search landing-page роль. Рішення залежить не від самого факту наявності facet, а від того, чи має сторінка довготривалу мету, відмінну від parent category і сусідніх комбінацій.
У Google guidance, використаному для цієї статті, немає numeric threshold, який визначає, коли filter combination “заслуговує” індексації. Це site-specific decision. Я пропоную вимагати стабільну user/search task, зрозумілий inventory concept, довготривалий URL і достатньо окремої page purpose, щоб сторінка була самостійним landing page. Search demand допомагає пріоритизувати, але не виправдовує порожню, надто мінливу або майже duplicate сторінку.
Після промоції facet стає частиною information architecture. Ведіть на preferred URL послідовними crawlable links і не діліть signals між еквівалентними permutations. Та сама логіка є в canonical guidance Google; практичну модель link graph ми розбираємо окремо у матеріалі про внутрішню перелінковку для SEO.
Етап 5 · Зменшіть URL discovery
Якщо filter state не має самостійної search role, UX можна залишити, прибравши саме шлях неконтрольованого URL discovery. Тут доречні robots.txt, fragments та інша interaction architecture.
Для faceted states, які не потрібні в Search, Google прямо описує два підходи: блокувати відповідні URL patterns у robots.txt або зберігати filter state у URL fragment, оскільки Search зазвичай не трактує fragment states як окремі URL для crawl/index. У тому ж документі canonical і nofollow названі менш ефективними довготривалими crawl controls. Fragment підходить лише user-only state: загальна URL guidance Google не радить покладатися на fragment, якщо цей стан має бути окремо crawlable/indexable content.
# Example policy: query-string states used only for UX stay out of crawl.
# Keep indexable facet landing pages on dedicated, crawlable URLs instead.
User-agent: Googlebot
Disallow: /*?*sort=
Disallow: /*?*price=
Disallow: /*?*size=
Sitemap: https://www.example.com/sitemap.xmlSTATICALLY VERIFIED проти актуального Google robots.txt syntax і wildcard support 2026-09-01. Це illustration, а не ready-to-paste production rule: parameter names, order і наявні Allow/Disallow потрібно перевірити на вашій URL grammar. Indexable examples у guide використовують окремі crawlable landing-page URLs, а не винятки всередині цих blocked patterns.
Кастомна схема
Схема розділяє URL generation/discovery, crawl permission, index eligibility, canonical preference і post-release validation, щоб один механізм не використовувався замість іншого.
Етап 6 · Побудуйте canonical landing pages
Якщо filter state отримав search role, поводьтеся з ним як зі стабільною landing page: передбачуваний URL, discovery, response та canonical-сигналів.
Для facet landing page, яку ви хочете бачити в Search, URL має бути crawlable, давати нормальну successful response, мати стабільну URL convention і несуперечливі canonical-сигналів. У Google redirects та rel=canonical описані як сильні signals, а sitemap inclusion — як слабший; окремо Google радить internal links вести на canonical URL, а не на duplicate variants. Self-canonical не гарантує вибір Google, але прибирає зайву невизначеність.
<a href> links із релевантних category/navigation surfaces.Не використовуйте canonical як cleanup для безконтрольного URL generator. Google зазначає, що canonicalization з часом може зменшити crawl non-canonical variants, але у faceted-navigation guidance robots/fragments залишаються ефективнішими crawl controls, якщо ці URL взагалі не потрібно сканувати. Правильна архітектура зменшує unwanted discovery у джерелі, а не сподівається виправити мільйони variants після їх появи.
Етап 7 · Закрийте dead branches
Faceted system має чітко розрізняти failure і normalization: empty, duplicate-filter або impossible states не повинні залишатися soft destinations, а еквівалентні URL з іншим порядком parameters мають сходитися до однієї identity.
У faceted-navigation guidance Google прямо рекомендує 404 для filter combinations без результатів або для безглуздих комбінацій і не радить редиректити їх на універсальну empty listing. Це дає crawler сигнал, що такого ресурсу немає. На практиці policy має бути однаковою для server rendering, API errors і client-side transitions.
| Стан | Бажана поведінка | Навіщо | Перевірка |
|---|---|---|---|
| Valid combination з корисним inventory | 200 + intended eligibility policy | Це реальна user destination | Status, canonical, robots meta, product set і links відповідають contract |
| Zero-result combination | 404 | Валідного ресурсу для цього state немає | Direct/SSR response залишається 404 і app shell не перетворює його на 200 |
| Impossible/unknown facet value | 404 | Не дозволяє випадковим values стати валідними crawl branches | Random invalid values стабільно дають 404 |
| Той самий state з іншим order parameters | Normalize до одного URL або consolidate duplicates | Одна видача не повинна мати багато identities | Crawler/log sample показує один preferred order/URL |
| Sort-only variant | Зазвичай user-only / non-indexable policy | Інше сортування часто не створює окремої landing-page purpose | Немає в sitemap; crawl/index behavior відповідає contract |
Етап 8 · Не втратьте product discovery
URL explosion можна прибрати так, що одночасно products стануть важчими для discovery. Crawl control та core catalog discovery потрібно валідувати як дві різні задачі.
Ecommerce guidance Google радить робити products reachable через site navigation і нагадує, що Googlebot зазвичай не відправляє запити через internal search box. У link guidance стандартним crawlable link є <a href>; event-only pseudo-links не є надійною заміною. Отже non-indexable filter UI може використовувати buttons/forms/fragments для state, але category → subcategory → product graph усе одно потребує crawlable paths або свідомого discovery mechanism, наприклад sitemap.
Почніть із seed URLs, доступних пошуковому crawler, і перевірте, що важливі categories, subcategories та products залишилися reachable через crawlable links або свідомо представлені в sitemap.
КритерійКритичні product/detail URLs знаходяться без необхідності click filter buttons або submit internal search form.
Для promoted landing page перевірте fresh direct request і rendered output. Якщо client-side router змінює URL, server/SSR route має розв'язувати той самий ресурс без залежності від попереднього UI state.
КритерійPromoted facet URL незалежно завантажується та повертає правильний content/metadata при прямому запиті.
Перевірте rendered anchors і URL changes після використання non-indexable filters. UX залишається інтерактивним, але не має генерувати тисячі crawlable links для states, які eligibility contract виключає.
КритерійUser-only filters працюють, а rendered link graph містить тільки URLs, призначені для crawl discovery.
Якщо filters працюють через JavaScript, перевіряйте rendered DOM і direct-route behavior замість припущення, що framework автоматично створить правильну crawl/index модель. Окремий JavaScript SEO debugging guide Metricum Lab розбирає evidence chain crawl → server response → render → index для client-rendered applications.
Етап 9 · Перевірте ті самі cohorts
Успішний rollout має зменшити небажаний crawl, але не забрати discovery та indexability у filter pages, які ви свідомо залишили для Search.
Не вважайте fix успішним лише тому, що crawler тепер бачить менше URL. Порівняйте однакові parameter signatures і landing-page cohorts до та після релізу. Google окремо попереджає: звільнена crawl capacity не обов'язково буде перенаправлена на інші URL, якщо сайт до цього не впирався у crawl capacity limit. Тому коректний outcome — менше unwanted crawling плюс здорові intended URLs, а не обіцяний відсоток “додаткового crawl”.
Використайте ті самі signatures, crawler-verification criteria та порівнювані date windows, що й у baseline. Перевірте request counts, status-code mix і нові parameter patterns.
КритерійUnwanted facet cohorts перестають розростатися або суттєво зменшуються, а crawl важливих landing/product URLs залишається видимим.
Зіставте crawl requests, response breakdown і host availability з датою deployment. Не можна приписувати policy ефект, якщо в цей же час з'явилась server availability problem.
ШляхSearch Console → Settings → Crawl stats
КритерійCrawl change не пояснюється host errors, availability degradation або іншою незалежною site-wide подією.
Окремо перевірте indexable landing pages, crawlable duplicates, user-only states, noindex exceptions та invalid/empty combinations. Звірте status, robots access, meta robots, canonical, links і sitemap membership із contract.
КритерійКожен sampled URL поводиться відповідно до призначеного state; contradictory signals оформлені як defects.
У Search Console слідкуйте за representative landing-page cohorts і розбирайте unexpected canonical/index states. Один URL може змінюватися або відставати з незалежних причин, тому збережіть cohort evidence і дату релізу.
КритерійВажливі landing-page cohorts залишаються eligible/discoverable, а після crawl controls немає системного indexation regression.
Етап 10 · Зробіть policy довготривалою
Facets змінюються разом із catalog attributes, merchandising, frontend rewrites та localization. Crawl/index policy повинна змінюватися разом із ними.
Практичний принцип: контролюйте URL inventory до того, як доведеться очищати наслідки crawler behavior. Почніть з однієї репрезентативної category page і запишіть eligibility contract для її filter states. Головне обмеження — generic rule не вирішить за будь-який бізнес, які facets заслуговують organic landing page: потрібні реальні inventory, query та conversion context. Але після вибору ролі реалізація стає тестованою: URL generation, crawl permissions, status codes, canonical-сигналів, internal links і sitemap membership можна звірити з одним contract.
Якщо згодом Search Console покаже для важливих facet pages статус Crawled — currently not indexed, це вже окрема index-selection diagnosis після того, як ви довели коректність faceted-navigation policy. Crawl control звужує URL space, але сам по собі не гарантує index selection.
Першоджерела та документація
Кожне змінне твердження про пошукову систему, браузер, інтерфейс або технічну поведінку в матеріалі прив’язане до актуального першоджерела.
Потрібна допомога з діагностикою та впровадженням?
Metricum Lab може описати faceted URL generation, верифікувати crawler demand, визначити cohorts indexable landing pages і перевести policy в engineering rules із before/after validation.
Переглянути послуги Crawl & Indexation