gora.
įrašas · 2026 m. gegužės 12 d. · 8 min skaityti

Canonical URL: kada reikia, kada kenkia

Kovą vienas iš projektų, kuriuos prižiūriu, ėmė prarasti paieškos pozicijas. Ne pagrindinis – atskiros produktų kortelės. Puslapis du mėnesius rinko parodymus, kabėjo top-20 pagal kelis raktažodžius, o paskui – kritimas. Per savaitę nuo 300 parodymų per dieną iki penkių. Pagal vieną raktažodį – apskritai iškrito iš indekso.

Įlindau į Google Search Console, paleidau URL Inspection. Google rašo: „User-declared canonical: https://example.com/“. Tai yra mano paties puslapis sako Google: „neindeksuok manęs, indeksuok pagrindinį“. Atveriu DevTools, žiūriu <head> – tikrai stovi <link rel="canonical" href="https://example.com/">. Visuose puslapiuose. Tas pats canonical, vedantis į domeno šaknį.

Toliau pradėjau žiūrėti, iš kur tai išlindo. Pasirodė – kažkas taisė next.config.js, pridėjo bloką su numatytaisiais meta tegais, įrašė ten canonical per process.env.SITE_URL be path. Šablonas pritaikytas visai svetainei. Google paklusniai suklijavo viską į vieną puslapį.

Atstatymui ir reindeksavimui prireikė trijų savaičių. Dalies pozicijų iki šiol negrąžinau.

Tai tipinis atvejis. Canonical – galingas signalas, ir jį lengva sulaužyti viena eilute konfige. Per pastaruosius pusę metų išgrieždavau tokias istorijas penkiuose skirtinguose projektuose. Visur priežastys skirtingos – kažkur WordPress įskiepis, kažkur Next.js konfigas, kažkur Shopify tema, kažkur programuotojo pataisymas, kuris „turėjo viską suvienodinti“. O pasekmės vienodos: puslapiai išlekia iš indekso, ir tu nesupranti kodėl, kol neįlendi į išeities kodą.

Toliau – kas tai yra, kada jis tikrai reikalingas, ir kur iš pagalbininko jis virsta šūviu sau į koją.


Kas yra canonical

Canonical – tai nurodymas Google, kurią puslapio versiją laikyti pagrindine, jei indekse jų yra kelios panašios ar vienodos.

Techniškai jis gyvena dviejose vietose. Pirma – HTML, <head> viduje:

<link rel="canonical" href="https://example.com/product/red-shoes">

Antra – HTTP-header, ne HTML resursams (PDF, paveikslėliai, dokumentai):

Link: <https://example.com/whitepaper.pdf>; rel="canonical"

Ką svarbu suprasti. Canonical – tai ne redirect. Tai ne blokavimas. Tai net ne direktyva. Tai signalas, užuomina. Google žiūri į canonical ir nusprendžia, ar juo tikėti. URL Inspection pamatysi du laukus: „User-declared canonical“ (ką deklaravai tu) ir „Google-selected canonical“ (ką pasirinko Google). Jie dažnai nesutampa.

Google gali ignoruoti tavo canonical, jei:

  • jis veda į noindex puslapį
  • jis veda į 404 ar 5xx
  • puslapių turinys radikaliai skirtingas
  • canonical veda į kitų canonical grandinę
  • viename puslapyje stovi keli canonical su skirtingais URL

Tai yra rekomendacija, kurią Google sveria pagal faktorių visumą. Bet 90% atvejų – klauso. Todėl ir pavojinga: tu nustatai canonical tikėdamasis „pasiūlyti“ Google, o gaunasi, kad iš esmės peradresavai visą paieškos srautą. Tik be redirect ir be pėdsako serverio loguose.

Atskira painiava – canonical prieš robots.txt prieš noindex. Tai skirtingi įrankiai skirtingoms užduotims. Robots.txt draudžia crawling (Google apskritai neužkrauna puslapio). Noindex leidžia crawling, bet draudžia indeksavimą. Canonical leidžia ir crawling, ir indeksavimą, bet sako: „į rezultatus pridėk štai šitą versiją“. Painioti juos – ir gausi arba puslapius, kurių Google nemato, arba puslapius, kuriuos mato, bet nerodo.


Kada canonical reikalingas

Yra penki scenarijai, kuriuose canonical tikrai padeda.

URL dublikatai su query parametrais. Dažniausias atvejis. Tu turi internetinę parduotuvę, produkto puslapis /product/red-shoes. Vartotojas filtruoja – URL tampa /product/red-shoes?size=42&color=red&utm_source=google. Turinys tas pats. Be canonical Google gali suindeksuoti abi versijas ir padalinti ranžavimą tarp jų. Su canonical į /product/red-shoes – Google supranta, kad tai vienas puslapis, ir visas svoris eina į pagrindinį URL.

Sena HTTP/HTTPS, www/non-www istorija. Jei svetainė migravo iš HTTP į HTTPS arba iš www į pliką domeną, ir ne visur sustatyti redirectai – canonical gali padėti. Nors atvirai: 301-redirect šiuo atveju visada geriau. Canonical – tai atsarginis parašiutas, pagrindinis mechanizmas turi būti redirect nginx ar CDN lygyje.

Print versijos, AMP, mobilios versijos. Jei turi atskirą print-friendly puslapio versiją – /article?print=1 – ji turi canonical'intis į pagrindinę. Ta pati istorija su AMP versija: joje stovi canonical į pagrindinį HTML variantą. Tai standartinė praktika.

A/B testai. Testuoji du landing puslapio variantus – /landing-a ir /landing-b. Variantas B turi canonical'intis į variantą A (arba abu – į neutralų URL). Kitaip pats sau sukursi dublikatą, ir Google padalins ranžavimą tarp dviejų testo pusių.

Sticky filters sąrašuose. Kategorija su rūšiavimu: /catalog, /catalog?sort=price, /catalog?sort=date. Turinys tas pats, tvarka skirtinga. Canonical visų variantų į /catalog – Google ranguoja vieną puslapį, o ne tris panašius.

Cross-domain canonical. Tai įdomus atvejis. Jei tu paskelbei straipsnį pas save, o paskui leidai jį perspausdinti kitoje svetainėje – ant kopijos turi stovėti canonical į tavo originalą. Google tai gerbia. Mačiau atvejų, kai straipsnis stambioje žiniasklaidoje su canonical į mažą blogą-originalą – ir paieškoje kildavo būtent blogas. Veikia.


Kada canonical kenkia

O dabar – penki būdai viską sulaužyti. Visus šiuos atvejus pagavau rankomis arba pas save, arba pas klientus.

Canonical į pagrindinį iš visų puslapių. Mano istorija iš įrašo pradžios. Tai dažniausia klaida, ir ji užmuša svetainę pilnai. Atsiranda dėl blogai sukonfigūruoto next.config.js, Astro šablono, WordPress įskiepio, Shopify temos – visur, kur canonical nustatomas pagal numatymą be esamo URL įvertinimo. Google indeksuoja tik pagrindinį. Visi kiti puslapiai – paieškoje nepasirodo. Tikrinama viena komanda:

curl -sS https://example.com/some-page | grep canonical

Jei išvedime href veda į šaknį – tu turi problemą.

Self-canonical su kitu domenu ar schema. Svetainė https://example.com, o canonical stovi http://example.com/page (be s) arba https://www.example.com/page (su www, nors svetainė be www). Atsiranda dėl hardcoded URL šablone arba dėl migracijos, po kurios canonical nebuvo atnaujintas. Google arba ignoruoja, arba sulieja su neegzistuojančia versija. Pataisyti – penkios minutės, surasti – kartais valandos.

Canonical į noindex puslapį. Savitarpio prieštaravimas. Tu sakai: „štai ši pagrindinė versija“, ir tame pačiame pagrindiniame – <meta name="robots" content="noindex">. Google šiuo atveju canonical ignoruoja, bet ir originalo gali neindeksuoti – nes tu aiškiai pasakei, kad ne ta versija pagrindinė. Atsiranda paprastai staging aplinkose, kurios atsitiktinai pateko į indeksą.

Canonical grandinės. Puslapis A canonical'inasi į B, B canonical'inasi į C. Google apdoroja tik pirmą žingsnį. Tai yra A → B jis pamatys, B → C – ne. Galiausiai indekse lieka B, nors tu norėjai C. Grandinės atsiranda svetainėse su migracijų istorija, kai canonical buvo taisomas kelis kartus ir nebuvo sutvarkytas.

Canonical esant materialiai skirtingam turiniui. /search?q=seo turi canonical į /search. Atrodo logiška – tai gi vienas paieškos puslapis. Bet ?q=seo atiduoda rezultatus pagal „seo“, o /search be parametro – tuščia forma. Turinys skirtingas, query parametras materialiai keičia puslapį. Google sulies – ir tu prarasi visas SERP pozicijas pagal konkrečias paieškos užklausas. Tas pats taikoma katalogo filtrams, kurie stipriai keičia rezultatus: /laptops?brand=apple – tai ne /laptops dublikatas, tai atskiras puslapis, kuris gali ranguotis pagal „macbook“.

Pagrindinis principas: canonical reikalingas ten, kur turinys dubliuojasi. Jei turinys skirtingas – canonical kenkia.



Kaip patikrinti canonical

Trys būdai, didėjančio tikslumo tvarka.

curl. Greičiausias. Bet kuriame puslapyje:

curl -sS https://example.com/page | grep -i canonical

Turi grąžinti eilutę <link rel="canonical" href="...">. Jei href sutampa su užklausos URL (atsižvelgiant į schemą, www, trailing slash) – self-canonical, viskas gerai. Jei veda dar kažkur – aiškinkis, tai sąmoningai ar bug.

DevTools. Atveri puslapį, F12, kortelė Elements, Ctrl+F, ieškai „canonical“. Matai, ką sugeneravo naršyklė. Tai svarbu: kartais canonical įterpiamas JavaScript'u, ir curl jo nematyti – o DOM yra. Ypač SPA tipo React/Next su client-side rendering.

Google Search Console → URL Inspection. Sąžiningiausias būdas. Įvedi URL – Google rodo du laukus:

  • User-declared canonical – kas pas tave stovi HTML
  • Google-selected canonical – ką Google realiai laiko pagrindiniu

Jie turi sutapti. Jei nesutampa – Google ignoravo tavo canonical ir pasirinko kažką kita. Tai signalas: arba tavo canonical aiškiai sulaužytas, arba turinys panašus į kitą puslapį ir Google nusprendė juos sujungti. Ir štai „Google-selected“ – tai, kas realiai veikia indeksavimą ir ranžavimą, o ne tai, ką tu deklaravai.

Tikrinti – kartą per mėnesį pagrindiniuose puslapiuose. Stambiuose kataloguose – atrankiniu būdu, per GSC API iškart pagal tūkstančius URL.


Savicanoniniai puslapiai

Best practice, kurią statau kiekviename projekte. Kiekvienas unikalus puslapis nustato canonical į save patį – pilnu absoliučiu URL.

<!-- Puslapyje /article/seo-tips -->
<link rel="canonical" href="https://example.com/article/seo-tips">

Kam to reikia, jei puslapis ir taip unikalus? Tam, kad jis gali pasirodyti pasiekiamas per URL variantus, apie kuriuos tu nežinai:

  • ?utm_source=... – reklamos parametrai
  • ?fbclid=... – Facebook click ID
  • #section – inkaras
  • /article/seo-tips/ – trailing slash
  • /Article/Seo-Tips – skirtingas registras

Be self-canonical Google gali suindeksuoti bet kurią iš šių versijų kaip atskirą. Su self-canonical – viskas suklijuojama į vieną, tą, kurią tu nurodei. Tai draudimas nuo atsitiktinumų.

Realizuojama paprastai Next.js / WordPress / bet kurios CMS šablone – funkcija, kuri ima request.url, normalizuoja (pašalina query, normalizuoja case, stato trailing slash kaip tau priimta) ir įstato į <link rel="canonical">. Vieną kartą sukonfigūruoji – veikia visuose puslapiuose.

Next.js tai daroma per metadata.alternates.canonical layout.tsx arba puslapio lygyje:

export const metadata = {
  alternates: {
    canonical: 'https://example.com/article/seo-tips',
  },
}

Svarbu: URL absoliutus, su schema ir domenu. Reliatyvūs canonical (/article/seo-tips) formaliai galioja, bet mačiau atvejų, kai Google juos interpretuodavo keistai – ypač jei puslapis pasiekiamas per kelis host'us (apex ir www). Geriau visada rašyti pilną URL.


Išvada

Canonical – tai signalas Google: „kai pamatysi panašius puslapius, indeksuok štai šitą“. Naudingas query parametrams, filtrams, A/B testams, perspausdinimams. Kenkia, kai nustatomas masiškai į pagrindinį, į noindex, į http esant https svetainei, arba kai query parametrai materialiai keičia turinį.

Taisyklė paprasta. Jei turinys dubliuojasi – canonical reikalingas. Jei turinys unikalus – self-canonical. Jei turinys skirtingas – canonical apskritai nereikalingas, tegul būna savas puslapis su savu URL.

Tikrink per GSC URL Inspection. „Google-selected canonical“ – vienintelis skaičius, kuris realiai veikia paieškos rezultatus. Visa kita – tavo ketinimai.

Taip pat žr.: 30+ SEO faktorių 2026, ką blokuoti robots.txt, hreflang: subdomain ar subdirectory.

Canonical URL: kada reikia, kada kenkia · hiregora.com