robots.txt: ką blokuoti, ką leisti
Vienas klientų praėjusią žiemą skundėsi: „Svetainės Google visiškai neranda. Pagal patį prekės ženklo pavadinimą mūsų nėra paieškoje. Ką jūs padarėte?“ Svetainė prieš mėnesį persikėlė į naują serverį, viskas veikė, dizainas naujas, turinys vietoje. Bet indekse — nulis puslapių. Visiškai nulis.
Atidariau https://site.com/robots.txt. Ten buvo keturios eilutės:
User-agent: *
Disallow: /
Štai ir viskas. Svetainė visiškai uždaryta nuo visų paieškos sistemų. Šis nustatymas buvo paliktas iš staging aplinkos — kai svetainė dar buvo kuriama ir nenorėta, kad ją indeksuotų. Diegiant į prodakšeną failas buvo tiesiog nukopijuotas toks, koks yra. Niekas nepatikrino.
Pataisyti užtruko dešimt sekundžių: pašalinti / po Disallow. Kad Google vėl indeksuotų svetainę — trys savaitės. Kad grįžtų organinis srautas — pusė metų. Mėnuo be indeksavimo = prarasti signalai, prarastos pozicijos, prarasti naudotojai.
robots.txt — vienas pavojingiausių failų svetainėje. Ne todėl, kad sudėtingas. Priešingai — todėl, kad per daug paprastas. Tai plain text, keturios direktyvos, nėra validatoriaus IDE, nėra autotestų. Sumaišei pasvirąjį brūkšnį, padėjai wildcard ne toje vietoje — ir pusė svetainės dingo iš paieškos. Niekas neperspėja. Niekas raudonai nepažymi klaidos. Google tyliai nustoja eiti ten, kur jam uždraudei, ir tu apie tai sužinai po dviejų savaičių, kai pozicijos jau pradėjo griūti.
Šiame įraše — ką daryti, kad nepakartotum mano istorijos.
Kas yra robots.txt
Tekstinis failas, kuris guli domeno šaknyje: https://example.com/robots.txt. Ne poaplankyje, ne pokataloge — būtent šaknyje, kitaip botai jo neras. Vienas failas vienam hostui. Jei turi subdomenus — kiekvienas turi savo robots.txt.
Tai yra REP — Robots Exclusion Protocol — standarto dalis. Standartas senas, 1994 metų, gimęs prieš tai, kai paieškos sistemos tapo tuo, kuo tapo. 2022 metais IETF pagaliau iš jo padarė RFC 9309 — formaliai dokumentuotą standartą. Iki tol kiekvienas botas interpretavo robots.txt kaip norėjo.
Iš esmės tai yra instrukcija krauleriams: kurių kelių svetainėje jie neturi skenuoti. Google, Bing, Yandex, DuckDuckGo ir dauguma normalių botų jos laikosi. ChatGPT taip pat dabar žiūri į robots.txt — per direktyvas GPTBot ir ClaudeBot. Skam-krauleriai ir parseriai jos paprastai ignoruoja, nes tai ne draudimas, o prašymas.
Du dalykai, kurių robots.txt NEDARO:
robots.txt — tai ne saugumas. Bet kas gali atidaryti site.com/robots.txt ir perskaityti sąrašą to, ką uždarei. Jei ten parašysi Disallow: /secret-admin-panel/ — ką tik nurodei slaptos administracinės skydelio adresą visam internetui. Uždarinėti privačius kelius per robots.txt — tas pats, kas pakabinti lentelę „čia seifas“ ant namo be užrakto.
robots.txt — tai ne noindex. Disallow draudžia eiti į puslapį. Bet jei į tą puslapį yra nuorodų iš kitų svetainių, Google vis tiek gali parodyti jį paieškoje — su tuščiu snippet ir žyma „No information is available for this page“. Nori pašalinti puslapį iš indekso visam laikui — reikia noindex, o ne robots.txt.
Bazinis sintaksė
Failas susideda iš blokų. Kiekvienas blokas prasideda User-agent, toliau eina direktyvos.
User-agent: *
Disallow: /admin/
Allow: /admin/public/
Sitemap: https://example.com/sitemap.xml
User-agent: * — taisyklės visiems botams iš karto. Žvaigždutė reiškia „bet koks krauleris“.
User-agent: Googlebot — taisyklės tik Google. Jei nori skirtingų taisyklių skirtingiems botams, darai atskirus blokus. Googlebot skaito savo bloką ir ignoruoja bloką su žvaigždute. Jei konkrečiam botui bloko nėra — jis skaito bendrą su žvaigždute.
Disallow: /admin/ — draudžia viską, kas prasideda /admin/. Tai yra ir /admin/, ir /admin/users, ir /admin/settings/permissions. Pasvirasis brūkšnys gale svarbus: Disallow: /admin be brūkšnio uždarys ir /admin/users, ir /admin-panel-secret. Ne visada tai, ko norėjai.
Allow: /public/ — leidžia kelią. Turi prasmę tik tada, kai viršuje turi platų Disallow, o nori padaryti išimtį. Be Disallow direktyva Allow beprasmė — viskas ir taip leidžiama pagal nutylėjimą.
Sitemap: https://example.com/sitemap.xml — kelias iki sitemap. Galima kelios eilutės, jei sitemap'ų yra keli. Nurodomas pilnas URL, ne reliatyvus.
Wildcards: * — bet kokia simbolių seka, $ — eilutės pabaiga.
Disallow: /*.pdf$
Disallow: /*?session=
Pirma eilutė uždarys visus PDF failus. Antra — visus URL su parametru session query string'e.
URL pathai jautrūs raidžių registrui. /Admin/ ir /admin/ — tai du skirtingi keliai. Jei tavo svetainėje toks atskyrimas yra, reikia uždaryti abu.
Komentarai — per #. Naudok juos gausiai, kad po pusės metų suprastum, ką ir kodėl čia parašei.
Ką paprastai blokuoti
Ne viską iš eilės. Tik tai, kas neturi šiukšlinti indekso arba veltui eikvoti crawl budget.
/admin/, /wp-admin/, /login/, /dashboard/ — vidiniai puslapiai administratoriams ir registruotiems naudotojams. Google ten nėra ką veikti, šie puslapiai arba reikalauja autorizacijos, arba apskritai skirti tik tau vienam.
/cart/, /checkout/, /account/, /order/ — privatūs e-commerce puslapiai. Krepšelis kiekvieno naudotojo savo, asmeninė paskyra taip pat. Indeksuoti juos — daugintis dublikatus ir eikvoti crawl budget.
/search/ — vidinės svetainės paieškos puslapiai. Kiekviena naudotojo paieškos užklausa — tai naujas URL forma /search?q=.... Jei jų neuždarysi, Google ras milijoną tokių URL per nuorodas ir bandys visus indeksuoti. Išėjime — tūkstančiai thin-content puslapių, kurie patrauks žemyn visą svetainę.
/api/ — JSON endpoint'ai, REST API. Tai ne puslapiai, tai duomenys. Krauleris jų neturi matyti kaip turinio.
?session=, ?utm_source=, ?ref= — URL su tracking parametrais. Sukuria to paties puslapio dublikatus. Geriausias sprendimas — canonical, bet jei canonical sukonfigūruoti sudėtinga, galima iš dalies uždengti per robots.txt. Tik atsargiai: jei uždarysi ?utm_*, užblokuosi ir puslapius su realiu turiniu tais URL.
/staging/, /preview/, /test/, /dev/ — atskiros aplinkos. Dažnai tai subdomenai (staging.site.com), ir tada jie turi savo robots.txt, ir tai teisingiau. Bet jei staging kabo pagrindiniame domene poaplankyje — uždaryk.
Senos laikinos landing'ai. Paleidai reklamos kampaniją, padarei /black-friday-2024/, ji atgyveno — užblokuok, kol nepašalinai.
Failai su besidubliuojančiu turiniu. Puslapio PDF versija, RSS feed'as su pilnais tekstais, print versijos — jei jos dubliuoja pagrindinį turinį, laikyk juos už indekso ribų.
Ko NEBLOKUOTI
Tai ta dalis, kur žmonės dažniausiai šauna sau į koją.
CSS ir JavaScript. Nuo 2014 metų Google renderina puslapį kaip naršyklė — jis užkrauna HTML, paskui pritraukia CSS ir JS, vykdo skriptus ir žiūri į galutinį rezultatą. Jei užblokuosi /wp-content/themes/ arba /static/js/ — Google pamatys svetainę be stilių ir be JS logikos. Mobile-friendly testas neišlaikys. Layout sulūš. Turinys, kuris renderinamas per JS, nepateks į indeksą. Niekada neuždarinėk statikos.
/sitemap.xml patį savaime. Mačiau atvejį, kai žmogus pridėjo Disallow: /sitemap.xml, nes „nenoriu, kad konkurentai matytų mano struktūrą“. Sitemap — tai tai, ką Google specialiai skaito, kad žinotų, ką tu turi. Uždaręs sitemap, pats sau amputavai indeksavimą.
Paveikslėliai, jei nori, kad jie būtų indeksuojami Google Images. /images/ arba /uploads/ uždarymas — dažna klaida po persikraustymo iš konstruktoriaus. Į paveikslėlius eina atskiras srautas per Google Images, ir blokavimas užmuša šį kanalą.
PDF ir failai su unikaliu turiniu. Jei turi PDF dokumentaciją, ataskaitas, techninius whitepaper'ius — jie gali ranžuotis patys savaime ir atvesti srautą. Uždarinėti juos robots.txt — prarasti matomumą.
Puslapiai su noindex meta. Tai kontraintuityvus dalykas. Jei nori pašalinti puslapį iš indekso per noindex meta tag'ą, Google turi įeiti į puslapį, perskaityti HTML ir pamatyti šį tag'ą. Jei papildomai uždarysi jį robots.txt — Googlebot ten neis, noindex nepamatys, ir puslapis gali likti indekse pagal išorines nuorodas. Logika atvirkštinė: norint pašalinti puslapį per noindex, jį reikia ATIDARYTI robots.txt.
JSON-LD ir structured data, kurie guli atskiruose failuose. Jei schema.org žymėjimas iškeltas į /schema/, šį aplanką palik atvirą.
robots.txt vs noindex vs canonical
Trys skirtingi įrankiai. Juos dažnai painioja, ir iš to gimsta gražiausi SEO bug'ai.
robots.txt Disallow — tai „neik“. Krauleris neįeis į puslapį. Tai nereiškia, kad puslapio nėra indekse: jei į jį veda išorinės nuorodos, Google žino apie jo egzistavimą ir gali parodyti jį paieškoje. Su žyma „No information is available for this page“ arba apskritai su pavadinimu iš anchor teksto išorinių nuorodų. Disallow taupo crawl budget, bet negarantuoja deindex.
<meta name="robots" content="noindex"> — tai „eik, skaityk, neindeksuok“. Googlebot įeina į puslapį, mato meta tag'ą, ir puslapis iškrenta iš indekso. Tai yra vienintelis patikimas būdas pašalinti puslapį iš paieškos. Pagrindinė sąlyga: puslapis turi būti PASIEKIAMAS krauleriui. Jei jis uždarytas robots.txt, Google neįeis, nepamatys noindex, ir puslapis toliau kabos paieškoje pagal išorines nuorodas.
<link rel="canonical" href="..."> — tai „indeksuok aną versiją vietoj manęs“. Naudojama, kai turi kelis URL su tuo pačiu turiniu ir nori pasakyti Google, kurį laikyti pagrindiniu. Dublikatai per parametrus, spausdinimo versijos, AMP puslapiai — visa tai sprendžiama per canonical, o ne per robots.txt. Žr. kada reikia canonical URL.
Derinys tipinėms užduotims:
— Nori pašalinti puslapį iš indekso visam laikui: atidaryk jį robots.txt + uždėk noindex meta + lauk dvi-keturias savaites, kol Google perskenuos ir išmes.
— Nori sutaupyti crawl budget nereikalinguose puslapiuose: uždaryk robots.txt. Jie gali likti indekse, bet Google nustos juos apeiti.
— Nori suklijuoti dublikatus: canonical. Ne robots.txt.
— Nori visiškai pašalinti puslapį: 410 Gone HTTP statuse + ištrinti iš sitemap. robots.txt čia tik trukdo.
Dažniausia klaida: „aš uždariau puslapį per robots.txt IR uždėjau noindex patikimumui“. Tai ne „patikimumui“, tai konfliktas. Google negalės perskaityti noindex ir puslapis užstrigs indekse.
Kaip patikrinti
Paprasčiausia — atidaryti naršyklėje arba curl'u:
curl https://site.com/robots.txt
Iš karto matosi, ką atiduoda serveris. Jei 404 — tu neturi robots.txt, kas savaime nėra katastrofa, bet vis dėlto geriau jį sukurti.
Google Search Console yra robots.txt Tester (jis persikėlė, dabar yra skiltyje Settings → Crawling). Ten galima įklijuoti URL ir paklausti: ar jis leidžiamas Googlebot. Naudinga, kai taisyklės sudėtingos su wildcard'ais.
URL Inspection tool GSC parodo pagal konkretų URL, ar jis užblokuotas, ir kokia taisykle. Idealu diagnozuoti „kodėl šis puslapis neindeksuojamas“.
screaming-frog ar analogai svetainės kraulinimo metu iš karto pažymės, kas užblokuota robots.txt. Jei prieš diegimą paleidi Frog — pamatysi problemą, kol ji nepatenka į produkciją.
Po kiekvieno robots.txt pakeitimo būtinai patikrink rankomis pagrindinių puslapių URL. Ir per GSC nusiųsk atnaujintą robots.txt — Google jį perskaitys ne iš karto, paprastai per parą.
Išvada
robots.txt — penkios teksto eilutės, kurios gali tau kainuoti metinį organinį srautą. Tai ne vieta eksperimentams ir ne vieta „padarysiu kaip pas kaimyną“.
Bazinė taisyklė: uždaryk tik tai, kas tikrai neturi būti indekse. Ne iš paranojos, ne „dėl visa pikta“. Kiekviena direktyva turi turėti priežastį, ir ta priežastis turi būti užrašyta komentare.
Prieš kiekvieną diegimą — atidaryk robots.txt ir perskaityk jį akimis. Tai penkios eilutės. Tai užtrunka dešimt sekundžių. Tai gelbsti nuo mėnesių pozicijų atstatymo.
Ir atmink: robots.txt blokuoja apėjimą, o ne indeksavimą. Indeksavimui yra noindex. Dublikatams — canonical. Nepainiok įrankių. Žr. taip pat 30+ SEO faktorių ir hreflang: subdomain vs subdirectory — ten taip pat daug vietų, kur viena eilute galima pakloti visą pusės metų darbą.