Miksi Google ei indeksoi sivua?
12 syytä, miksi sivu ei näy Googlessa, ja niiden korjaukset.
Google osaa suorittaa JavaScriptiä, mutta se tekee sen viiveellä ja omilla ehdoillaan. Moni tekoälybotti ei suorita sitä lainkaan. Jos sivusi sisältö syntyy vasta selaimessa, osa siitä voi jäädä hakukoneilta näkemättä.
Lyhyesti, näin optimoit JavaScript- tai SPA-sivuston hakukoneille:
<a href>-linkkejä.Tämä opas näyttää, miten Google käsittelee JavaScript-sivun, mitkä ovat yleisimmät ongelmat ja miten testaat oman sivustosi. Jokaisessa osiossa on demo, jolla voit kokeilla asian itse.
Eikö sivusi näy Googlessa lainkaan? Lue myös Miksi Google ei indeksoi sivua.
Google käsittelee JavaScript-sivun kolmessa vaiheessa. Näin Google itse kuvaa ne ohjeessaan:
Kun sisältö on valmiina HTML:ssä, Google näkee sen jo ensimmäisessä vaiheessa. Kun sisältö syntyy JavaScriptillä, se odottaa renderöintiä. Jos jokin menee siinä pieleen, sisältö jää näkemättä.
Renderöintijonoon pääsevät vain sivut, jotka vastaavat koodilla 200. Jos sivun HTML:ssä on noindex, Google voi jättää renderöinnin kokonaan väliin.
Käynnistä viereinen demo: sama hinnasto HTML:nä ja JavaScriptillä Googlebotin silmin.
Valitse sivu ja käynnistä Googlebot.
Sisältö HTML:ssä
<title>Hinnasto – Kampaamo Kulma</title>
<h1>Hinnasto</h1>
<li>Miesten hiustenleikkaus 29 €</li>
<a href="/ajanvaraus/">Varaa aika</a>
Sisältö JavaScriptillä
<title>Kampaamo Kulma</title>
<div id="app"></div>
<script src="/app.js"></script>
Linkit, jotka Googlebot löysi hakujonoon
Tulos Näkyy viiveellä
JavaScript-sivun teksti ja linkit odottavat renderöintiä. Jos JavaScript kaatuu, Google ei näe niitä lainkaan, eivätkä JavaScriptiä suorittamattomat botit näe niitä koskaan.
JavaScript-sivuston hakukoneoptimoinnissa tärkein kysymys on, missä sivun HTML tehdään. Vaihtoehtoja on kolme:
Google suosittelee palvelinrenderöintiä tai valmiiksi tehtyä HTML:ää, koska se nopeuttaa sivua ihmisille ja boteille, eivätkä kaikki botit osaa suorittaa JavaScriptiä.
Dynaamista renderöintiä, jossa boteille näytetään eri versio kuin ihmisille, Google kutsuu kiertotieksi, joka ei ole pitkän aikavälin ratkaisu. Sen tilalle Google neuvoo palvelinrenderöintiä, staattista renderöintiä tai hydraatiota.
SPA-sivuston optimointi alkaa siksi yleensä siitä, että tärkeät sivut tehdään palvelimella tai valmiiksi. Esimerkiksi Next.js, Nuxt ja Astro osaavat molemmat.
Kokeile viereistä demoa: vaihda renderöintitapaa ja katso, mitä ensimmäisessä HTML:ssä on.
Valitse, miten sivu tehdään, ja vaihda ensimmäisen HTML:n ja selaimen näkymän välillä.
Selainrenderöinti (CSR): ensimmäinen HTML
<head>
<title>Kampaamo Kulma</title>
</head>
<body>
<div id="app"></div>
<script src="/app.js"></script>
</body>
Palvelinrenderöinti (SSR): ensimmäinen HTML
<head>
<title>Hinnasto – Kampaamo Kulma</title>
</head>
<body>
<h1>Hinnasto</h1>
<li>Miesten hiustenleikkaus 29 €</li>
<li>Naisten hiustenleikkaus 39–49 €</li>
<li>Lasten hiustenleikkaus (alle 12 v.) 29 €</li>
<script src="/app.js"></script>
</body>
Staattinen sivu (SSG): ensimmäinen HTML
<head>
<title>Hinnasto – Kampaamo Kulma</title>
</head>
<body>
<h1>Hinnasto</h1>
<li>Miesten hiustenleikkaus 29 €</li>
<li>Naisten hiustenleikkaus 39–49 €</li>
<li>Lasten hiustenleikkaus (alle 12 v.) 29 €</li>
<script src="/app.js"></script>
</body>
Selaimessa: sama kaikilla kolmella tavalla
Kampaamo Kulma
Hinnasto
Selaimessa sivu näyttää samalta tavasta riippumatta.
Selainrenderöinti (CSR)
Ongelmat ja korjaukset
Kun JavaScript-sivusto ei näy Googlessa, syy on yleensä jokin näistä kuudesta. Useimmat korjaukset ovat pieniä koodimuutoksia, kun tietää, mitä etsiä.
Viereinen kartta näyttää, missä vaiheessa kukin ongelma katkaisee sivun matkan hakutuloksiin tai tekoälyn vastaukseen.
Valitse numero: näet, missä vaiheessa ongelma osuu ja miten sen korjaat.
Ongelma 1
Linkit, joita Google ei seuraa
Linkki ilman href-osoitetta ei vie Googlea mihinkään: sivut sen takana jäävät löytymättä.
Lue korjausGoogle löytää uudet sivut linkkejä seuraamalla. Se seuraa vain linkkejä, jotka ovat <a>-elementtejä ja joilla on href-attribuutti. Näin Google sanoo ohjeessaan.
JavaScript-sovelluksissa siirtymä tehdään usein klikkauksen käsittelijällä. Ihmiselle linkki toimii, mutta Googlelle se ei ole linkki lainkaan.
<a href="/hinnasto/"> toimii.<a href="/hinnasto/" onclick="…"> toimii myös: JavaScript saa hoitaa siirtymän, kunhan href on paikallaan.<span onclick="…">, <a onclick="…"> ilman href:iä ja href="javascript:…" eivät toimi.Kehysten omat linkkikomponentit, kuten Next.js:n Link, tekevät oikean <a href>-elementin. Tarkista se silti valmiista sivusta.
Käynnistä viereinen demo: Googlebot seuraa valikosta vain linkit, joilla on osoite.
Käynnistä Googlebot. Korjaa sitten linkit ja aja uudelleen.
<a href="/palvelut/">Palvelut</a> a-elementti ja href <a href="/hinnasto/" onclick="go(event)">Hinnasto</a> href on paikallaan, vaikka JavaScript hoitaa siirtymän <span onclick="go('/ajanvaraus/')">Ajanvaraus</span> span ei ole linkki <a onclick="go('/lahjakortit/')">Lahjakortit</a> href puuttuu <a href="javascript:go('/blogi/')">Blogi</a> javascript: ei ole osoite <span href="/yhteystiedot/">Yhteystiedot</span> href span-elementissä ei kelpaa Sivut, jotka Googlebot löysi 2/6 sivua löytyi
Googlebot löysi 2 sivua kuudesta. Ajanvaraus, lahjakortit, blogi ja yhteystiedot jäivät löytymättä, koska niiden linkeissä ei ole kelvollista href-osoitetta.
Moni JavaScript-sovellus vaihtaa sivun otsikon ja metatiedot vasta selaimessa. Google hyväksyy osan tästä, mutta ei kaikkea:
Varmin tapa on kirjoittaa kaikki kolme jo palvelimen lähettämään HTML:ään.
Kokeile viereistä demoa: vertaa ensimmäistä HTML:ää ja JavaScriptin jälkeistä sivua kolmessa tapauksessa.
Valitse tapaus ja vertaa ensimmäistä HTML:ää JavaScriptin jälkeiseen. Paina sitten ”Näytä korjaus”.
Title
<head>
<title>Kampaamo Kulma</title>
</head>
<head>
<title>Hinnasto – Kampaamo Kulma</title>
<meta name="description" content="Hiustenleikkaus alkaen 29 €.">
</head>
<head>
<title>Hinnasto – Kampaamo Kulma</title>
<meta name="description" content="Hiustenleikkaus alkaen 29 €.">
</head>
<head>
<title>Hinnasto – Kampaamo Kulma</title>
<meta name="description" content="Hiustenleikkaus alkaen 29 €.">
</head>
Google Toimii Googlessa
Google lukee JavaScriptillä asetetun titlen ja kuvauksen renderöidystä sivusta. Botit, jotka eivät suorita JavaScriptiä, näkevät vain yleisen otsikon.
Kanoninen
<head>
<link rel="canonical" href="https://kampaamokulma.fi/">
</head>
<head>
<link rel="canonical" href="https://kampaamokulma.fi/hinnasto/">
</head>
<head>
<link rel="canonical" href="https://kampaamokulma.fi/hinnasto/">
</head>
<head>
<link rel="canonical" href="https://kampaamokulma.fi/hinnasto/">
</head>
Google Ristiriita
HTML sanoo, että sivun ensisijainen osoite on etusivu, ja JavaScript vaihtaa sen hinnastoon. Google ei suosittele kanonisen osoitteen muuttamista JavaScriptillä: osoitteen pitää olla sama kuin HTML:ssä.
noindex
<head>
<meta name="robots" content="noindex">
</head>
<head>
<meta name="robots" content="index, follow">
</head>
<head>
<meta name="robots" content="noindex">
</head>
<head>
<meta name="robots" content="index, follow">
</head>
Google Ei hakemistoon
Kun Google näkee noindexin ensimmäisessä HTML:ssä, se voi jättää renderöinnin väliin. JavaScriptin poisto ei silloin ehdi vaikuttaa, eikä sivu päädy hakemistoon.
Lazy loading lataa kuvat ja sisällön vasta, kun niitä tarvitaan. Se nopeuttaa sivua, mutta yksi asia pitää muistaa: Google ei vieritä sivua eikä klikkaa sen nappeja.
Jos kirjoitukset, tuotteet tai arvostelut latautuvat vasta vierittäessä tai ”Näytä lisää” -napista, Google ei näe niitä. Googlen ohje neuvoo näin:
loading="lazy")./blogi/sivu/2/, ja linkitä osat toisiinsa.Kokeile viereistä demoa: vaihda ihmisen ja Googlebotin näkymän välillä.
Valitse tapa ja vaihda ihmisen ja Googlebotin näkymän välillä.
Kampaamo Kulma
Blogi
<a href="/blogi/sivu/2/">Seuraava sivu</a>
Tästä alaspäin sisältö latautuu vasta vierittäessä kampaamokulma.fi/blogi/sivu/2/
<a href="/blogi/sivu/3/">Seuraava sivu</a>
Tästä alaspäin sisältö latautuu vasta vierittäessä kampaamokulma.fi/blogi/sivu/3/
Löydetyt kirjoitukset 3/9 kirjoitusta
Googlebot ei vieritä sivua, joten se näkee vain ensimmäiset kolme kirjoitusta. Kuusi jää hakemiston ulkopuolelle.
Osa SPA-sovelluksista vaihtaa näkymää osoitteen #-merkin jälkeisellä osalla, esimerkiksi kampaamokulma.fi/#/hinnasto. Selain ei lähetä #-merkin jälkeistä osaa palvelimelle, eikä Google yleensä tue sitä.
Silloin hinnasto, palvelut ja yhteystiedot eivät saa omaa osoitetta, eivätkä ne voi näkyä hakutuloksissa omina sivuinaan.
Korjaus on History API, jota Google myös suosittelee: jokaisella näkymällä on tavallinen osoite, kuten /hinnasto/. Varmista lisäksi, että osoite toimii suoraan avattuna: palvelimen pitää palauttaa sivu eikä virhettä.
Kokeile viereistä demoa: klikkaa sovelluksen valikkoa ja katso, mitä osoitteita Google saa.
Valitse reititystapa ja klikkaa sovelluksen valikkoa.
Hinnasto
Osoitteet, jotka Google saa 1 sivu
kampaamokulma.fi/ kampaamokulma.fi/#/palvelut kampaamokulma.fi/ kampaamokulma.fi/#/hinnasto kampaamokulma.fi/ kampaamokulma.fi/#/yhteystiedot kampaamokulma.fi/ Selain ei lähetä #-merkin jälkeistä osaa palvelimelle, eikä Google yleensä tue sitä. Kaikki neljä näkymää ovat Googlelle yksi ja sama osoite.
SPA-sovelluksen palvelin vastaa usein jokaiseen osoitteeseen samalla sivulla ja koodilla 200. Jos osoitetta ei ole, sovellus näyttää ”Sivua ei löytynyt”, mutta palvelin on jo kertonut Googlelle, että kaikki on kunnossa.
Google merkitsee tällaisen sivun Search Consolessa pehmeäksi 404-virheeksi (soft 404). Googlen suomenkielisessä ohjeessa tilan nimi on ”404-uudelleenohjaus”.
Google neuvoo kaksi korjausta:
<meta name="robots" content="noindex">.Palvelinrenderöidyssä tai staattisessa sivustossa palvelin voi vastata koodilla 404 suoraan.
Kokeile viereistä demoa: sama puuttuva sivu ilman korjausta ja kahdella korjauksella.
Vaihda tilaa: puuttuva sivu ilman korjausta ja Googlen kahdella korjauksella.
Kampaamo Kulma
Hups, sivua ei löytynyt
Tätä palvelua ei enää ole. Katso kaikki palvelumme.
Ei korjausta
Palvelimen vastaus
GET /palvelut/permanentti/
HTTP/1.1 200 OK
Search Console
404-uudelleenohjaus Englanniksi: Soft 404
Palvelin sanoo ”200 OK”, mutta sivu kertoo, ettei sitä ole. Google merkitsee sen pehmeäksi 404-virheeksi.
Ohjaus 404-sivulle
Palvelimen vastaus
GET /palvelut/permanentti/
HTTP/1.1 200 OK → JavaScript ohjaa
GET /404/
HTTP/1.1 404 Not Found
Search Console
Ei löydy (404) Englanniksi: Not found (404)
Google saa oikean vastauksen: sivua ei ole. Poistettu sivu ei kuulu hakemistoon.
const service = services.find((item) => item.path === location.pathname);
if (!service) {
// Palvelua ei ole: ohjaa osoitteeseen, johon palvelin vastaa koodilla 404.
window.location.href = '/404/';
}noindex
Palvelimen vastaus
GET /palvelut/permanentti/
HTTP/1.1 200 OK
+ <meta name="robots" content="noindex">
Search Console
URL-osoitteella on noindex-merkintä Englanniksi: URL marked ‘noindex’
Virhesivu pysyy poissa hakemistosta. Google lukee noindexin renderöidystä sivusta.
const service = services.find((item) => item.path === location.pathname);
if (!service) {
// Palvelua ei ole: kerro hakukoneille, ettei virhesivua lisätä hakemistoon.
const robots = document.createElement('meta');
robots.name = 'robots';
robots.content = 'noindex';
document.head.appendChild(robots);
}ChatGPT, Claude ja Perplexity hakevat sivuja omilla boteillaan. Vercelin ja MERJ:n selvityksessä (joulukuu 2024) yksikään niistä ei suorittanut JavaScriptiä: ne lukevat vain palvelimen lähettämän HTML:n.
Selvityksessä JavaScriptiä suorittivat vain Googlebot, jota myös Gemini käyttää, ja Applen AppleBot. ChatGPT:n ja Clauden botit kyllä hakivat JavaScript-tiedostoja, mutta eivät suorittaneet niitä.
Määrät eivät ole pieniä: Vercelin verkossa GPTBot teki kuukaudessa 569 miljoonaa hakua ja Clauden botti 370 miljoonaa. Googlebotin vastaava luku oli 4,5 miljardia.
Jos hinnasto tai palvelukuvaus syntyy JavaScriptillä, tekoäly ei näe sitä eikä voi suositella sinua sen perusteella. Lue lisää tekoälyoptimoinnin oppaasta.
Kokeile viereistä demoa: vaihda hinnaston tekotapaa ja katso, mitkä botit näkevät hinnat.
Vaihda hinnaston tekotapaa ja katso, mitkä botit näkevät hinnat.
Botti ja hakuja kuukaudessa
Tulos 2/5 näkee hinnat
Vain JavaScriptiä suorittavat botit näkevät hinnat. Muut tekivät Vercelin verkossa yhteensä noin 963 miljoonaa hakua kuukaudessa.
Lähde: Vercel ja MERJ: The rise of the AI crawler (17.12.2024). Hakumäärät ovat Vercelin verkosta yhden kuukauden ajalta. Selvityksessä myös Metan ja ByteDancen botit jättivät JavaScriptin suorittamatta.
Testaa aina valmis sivu, älä vain koodia. Kolme tarkistusta riittää useimmiten:
Jos sivusto ei ole omasi, Googlen Rich Results -testi näyttää saman renderöidyn sivun. Google neuvoo käyttämään näitä kahta työkalua.
Viereisen koodin voit liittää selaimen konsoliin millä tahansa sivulla. Se laskee, montako sanaa sivun tekstistä on ensimmäisessä HTML:ssä ja montako selaimessa.
Kokeile viereisiä välilehtiä: sama sivu kolmella työkalulla.
Valitse työkalu: sama JavaScriptillä tehty hinnasto kolmen työkalun silmin.
Ctrl+U
<title>Kampaamo Kulma</title>
<body>
<div id="app"></div>
<script src="/app.js"></script>
Ctrl+U Hinnat puuttuvat
Lähdekoodi näyttää ensimmäisen HTML:n eli sen, minkä palvelin lähettää. Hinnat eivät ole siinä: ne syntyvät JavaScriptillä.
F12
<body>
<div id="app">
<h1>Hinnasto</h1>
<li>Miesten hiustenleikkaus 29 €</li>
<li>Naisten hiustenleikkaus 39–49 €</li>
<li>Lasten hiustenleikkaus (alle 12 v.) 29 €</li>
</div>
F12 Hinnat näkyvät
Kehitystyökalut näyttävät sivun sellaisena kuin selain sen rakensi JavaScriptin jälkeen. Ero lähdekoodiin kertoo, mitä JavaScript lisäsi.
URL-tarkistus
<body>
<div id="app">
<h1>Hinnasto</h1>
<li>Miesten hiustenleikkaus 29 €</li>
<li>Naisten hiustenleikkaus 39–49 €</li>
<li>Lasten hiustenleikkaus (alle 12 v.) 29 €</li>
</div>
URL-tarkistus Google näki hinnat
Live-testi näyttää HTML:n sellaisena kuin Google sen renderöi, kuvakaappauksen ja JavaScript-konsolin viestit. Jos hinnat näkyvät täällä, Google näkee ne.
Vertaa itse: liitä selaimen konsoliin (F12 → Console)
// Liitä selaimen konsoliin (F12 → Console) sivulla, jonka haluat tarkistaa.
const html = await (await fetch(location.href)).text();
const words = (doc) => {
const copy = doc.cloneNode(true);
copy.querySelectorAll('script, style, noscript, template').forEach((el) => el.remove());
const parts = new Intl.Segmenter('fi', { granularity: 'word' }).segment(copy.body.textContent);
return [...parts].filter((part) => part.isWordLike).length;
};
const first = words(new DOMParser().parseFromString(html, 'text/html'));
const browser = words(document);
console.log('Ensimmäinen HTML: ' + first + ' sanaa. Selaimessa: ' + browser + ' sanaa.');Siirsin tapiokauranen.com-sivuston WordPressistä Astroon 29.9.2026. Astro tekee jokaisesta sivusta valmiin HTML-tiedoston jo julkaisuvaiheessa, ja palvelin lähettää tiedoston sellaisenaan.
Siksi tämän oppaan teksti, otsikot ja linkit ovat jo ensimmäisessä HTML:ssä. JavaScriptillä toimivat vain lisät, kuten demot, haku ja teeman vaihto. Google ja tekoälybotit saavat saman tekstin kuin sinä.
Viereinen mittari tekee tälle sivulle saman vertailun kuin edellisen kohdan koodi.
Paina viereistä nappia: mittari hakee tämän sivun HTML:n ja vertaa sitä selaimen näkymään.
Vertaa tämän sivun ensimmäistä HTML:ää ja selaimen näkymää.
| Mitta | Ensimmäinen HTML | Selaimessa |
|---|---|---|
| Tekstin sanoja | – | – |
| Linkkejä (a href) | – | – |
| Otsikoita (h1–h3) | – | – |
Ensimmäisessä HTML:ssä –
Mittari tarvitsee JavaScriptin. Tämän sivun teksti näkyy silti, koska se on palvelimen lähettämässä HTML:ssä.
Osaa. Google suorittaa sivun JavaScriptin Chromium-selaimella ennen kuin se lisää sivun hakemistoon.
Renderöinti tapahtuu kuitenkin jonossa, ja Googlebot ei vieritä sivua eikä klikkaa sen nappeja. Jos JavaScript kaatuu tai lataa sisällön vasta vierittäessä, osa sisällöstä jää näkemättä.
Tee tärkein sisältö valmiiksi HTML:ään palvelinrenderöinnillä tai staattisena. Käytä linkkeinä a-elementtejä, joissa on href-osoite, ja anna jokaiselle näkymälle oma osoite ilman #-merkkiä.
Kirjoita title, kanoninen osoite ja robots-tagi jo HTML:ään ja palauta puuttuvalle sivulle koodi 404. Testaa lopuksi Search Consolen URL-tarkistuksella.
Ei itsessään. Ratkaisevaa on, mitä palvelin lähettää. Kun sovellus tehdään palvelinrenderöitynä tai staattisena, esimerkiksi Next.js:llä tai Nuxtilla, sisältö on HTML:ssä heti.
Pelkästään selaimessa rakentuva sovellus jättää sisällön renderöinnin varaan, eivätkä JavaScriptiä suorittamattomat botit näe sitä.
Et. Google kutsuu dynaamista renderöintiä kiertotieksi, joka ei ole pitkän aikavälin ratkaisu, ja suosittelee tilalle palvelinrenderöintiä, staattista renderöintiä tai hydraatiota.
Eivät yleensä. Vercelin ja MERJ:n selvityksessä (joulukuu 2024) OpenAI:n, Anthropicin, Metan, ByteDancen ja Perplexityn botit eivät suorittaneet JavaScriptiä. Googlen ja Applen botit suorittivat.
Googlen mukaan sivu voi olla renderöintijonossa muutaman sekunnin tai kauemmin. Tarkkaa aikaa Google ei lupaa.
Search Consolen URL-tarkistuksella: valitse Testaa live-URL-osoite ja sitten Näytä testattu sivu. Näet renderöidyn HTML:n, kuvakaappauksen ja JavaScript-konsolin viestit. Jos sivusto ei ole omasi, käytä Googlen Rich Results -testiä.
Teen teknistä hakukoneoptimointia osana Koodaava SEO konsultti -palvelua.
Selvitän, mitä Google ja tekoälybotit sivustostasi näkevät, mitkä sivut puuttuvat hakemistosta ja miksi. Sen jälkeen korjaan syyt.
Lue lisää teknisestä hakukoneoptimoinnista ja hakukoneoptimoinnin auditoinnista, tai varaa ilmainen tsekki, niin katsotaan sivustosi yhdessä.
Suositeltu
Koodaava SEO konsultti
Korjauksia ja hakukoneoptimointia joka kuukausi, ja samaan hintaan kotisivujen ylläpito ja Google Ads.
760 € /kk
Tyypillisesti 8 tuntia kuussa. Hinta alv 0 %.
Ei aloitusmaksua. Voit lopettaa koska tahansa.
Tarvitsetko vain yhden asian? Räätälöity tilaus
Mitä tarkistan
Ilmainen SEO tsekki
60 minuutin Google Meet -palaveri: katsotaan yhdessä, miten sivustosi näkyy Googlessa ja mitä kannattaa korjata ensin.
Tai laita sähköpostia: tapio@tapiokauranen.com
12 syytä, miksi sivu ei näy Googlessa, ja niiden korjaukset.
Mitä tarkistan ja korjaan sivuston tekniikassa.
Näin tekoäly löytää yrityksesi ja alkaa suositella sitä.
Syvempi opas teknisestä optimoinnista, sisällön rakenteesta ja linkeistä.
Ilmainen tapa löytää 404-virheet ja ohjata ne oikeisiin osoitteisiin.
Perusteet: näin sivusi löytyy Googlesta.