Meta, Robots.txt i inne - kompendium wiedzy o kontrolowaniu robotów wyszukiwarek


Każda witryna internetowa ma dwa typy odwiedzających - ludzi i roboty. Roboty również dzielą się na dwie grupy - te dobre i te złe. Złe roboty na ogół przekonują wszystkich wokół, że jednak są ludźmi. Cele stawiane im przez ich właścicieli charakteryzuje bardzo szeroką rozpiętość, od zwykłej analizy konkurencji po działania frauderskie. Dobre roboty należą z kolei do firm o ugruntowanej pozycji rynkowej i wykonują czynności potrzebne do funkcjonowania usług internetowych, z których wszyscy korzystamy na codzień - jak na przykład indeksowanie zawartości stron dla wyszukiwarek. Cechą wyróżniającą tego rodzaju robotów jest także to, że jako webmaster może je kontrolować, a one respektują Twoje wytyczne. Dowiedz się jakie masz możliwości.

Trzy sposoby przedstawiania instrukcji robotom

Dyrektywy odnośnie treści zawartych na witrynie możesz prezentować robotom w jednym z trzech wariantów. Warianty te można również łączyć ze sobą, dopierając ten który w danej sytuacji jest dla Ciebie najkorzystniejszy czy najprostszy do wdrożenia. Są to:

  • Plik tekstowy robots.txt, dostępny zawsze w katalogu głównym domeny, czyli pod adresem example.com/robots.txt
  • Tag meta, umieszczany w sekcji head danego dokumentu html, przykładowo <meta name="robots" content="index, follow" />
  • Nagłówek odpowiedzi serwera X-Robots-Tag, dodawany jako pole w komunikacji pomiędzy klientem a serwerem, niewidoczny w trakcie normalnego przeglądania stron. Przykład: X-Robots-Tag: noarchive

Oprócz doboru preferowanej metody istotne jest także podpieranie się dokumentacją dla interesującego bota i prowadzenie testów na bieżąco, gdyż kwestia zarządzania robotami niestety nie jest standardem. Wielka szkoda, tym bardziej, że prace w tym zakresie trwały, a w 1996 roku powstał nawet szkic odpowiedniego dokumentu: A Method for Web Robots Control. Warto na niego rzucić okiem - z żalu łezka się w oku kręci jak świetną perspektywę standardu i przejrzystej dokumentacji nas ominęła w tamtym okresie, ponieważ szkic ten nie skończył jako oficjalne RFC.

Trzeba też pamiętać, że dobre boty mają imiona i można się po imieniu do nich zwracać. Innymi słowy przy pisaniu instrukcji jest możliwość ich różnicowania w zależności od bota. Na końcu tekstu znajdują się linki do list ze szczegółowymi informacjami na temat botów i nazwami jakich powinno się używać przy wydawaniu dyrektyw.

Dyrektywy w ogóle

No dobrze, skoro już wiadomo, że do botów można mówić, to teraz - co do nich mówić? Szczęśliwie zakres instrukcji nie jest zbyt długi. Poniżej skupiam się na dyrektywach dla botów wyszukiwarkowych, ale są także inne, które mogą mieć swoje własne zestawy.

Dyrektywy stosowane w robots.txt

Zapisy znajdujące się wewnątrz robots.txt muszą być grupowane, to znaczy zawsze zaczynać się od rekordu user-agent.

user-agent
Rozpoczyna serię instrukcji, jako taki musi zatem posiadać odwołanie dla kogo te instrukcje są. Najczęściej stosuje się symbol gwiazdki, w zapisie user-agent: *, czyli dla wszytkich robotów.
disallow
Zabrania botowi dostępu do określonego zasobu. Może występować tylko w grupie.
allow
Pozwala botowi na dostęp, także może występować tylko zgrupowany.
sitemap
Występuje samodzielnie, wskazuje lokalizację sitemapy, w ujęciu URLa absolutnego. Warto pamiętać, że tych rekordów może być więcej niż jeden - jeśli już koniecznie chcesz wystawić sitemapę, to nie ma potrzeby by cała była w jednym pliku.

Dyrektywy stosowane w meta tagu i nagłówku X-Robots-Tag

all
Pozwala robotowi na wszystko - jako taki jest wartością domyślą. Nie trzeba go umieszcza, wyszukiwarki przyjmują, że w razie nieobecności żadnych dyrektyw wolno im wszystko.
noindex
Nazwa zdaje się sugerować, że zabrania indeksacji dokumentu, ale trudno powiedzieć jak to tak naprawdę jest jeżeli bot nie miał zakazu w robots.txt i dostanie go dopiero w ramach kodu źródłowego. Wyjaśnienie w dokumentacji dla webmasterów mówi tylko: Nie pokazuj tej strony ani linku do kopii w pamięci podręcznej w wynikach wyszukiwania - nie wspomina, że kopia strony nie zachowa się w niewidocznym z zewnątrz indeksie.
nofollow
Zabrania botowi podążać za linkami w ramach danego dokumentu. Wiecie, to na potrzeby stron, na której macie linki wzajemne ;).
none
Połączenie noindex i nofollow.
noarchive
Nie pozwala na wyświetlanie się kopii dokumentu w ramach pamięci podręcznej.
nosnippet
Wystawia zakaz wyświetlania fragmentu treści dokument na stronach z wynikami wyszukiwania.
noodp
W czasach gdy jeszcze dinozaury chodziły po internetach, był sobie Open Directory Project, zwany też DMOZem. Prekursor wszystkich katalogów internetowych i podstawa wszystkich indeksów wyszukiwarkowych. Powyższa dyrektywa instruuje bota aby - w razie posiadania certyfikatu #tylewygrać, czyli wpisu w DMOZie przez daną witrynę - nie wykorzystywał informacji z katalogowego wpisu do generowania snippetu na stronie z wynikami wyszukiwania. Tu jeszcze dwie ciekawostki: ta konkretna instrukcja weszła w życie 9 lat temu; oprócz tego mieliśmy też instrukcję noydir - zachowywała się dokładnie tak samo, ale nie dotyczyła DMOZa tylko Yahoo Directory. Ten katalog zakończył żywot w 2014 roku, po 20 latach istnienia.
notranslate
Bot ma powiedzieć wyszukiwarce żeby nie proponowała tłumaczenia dokumentu w wynikach wyszukiwania.
noimageindex
Instrukcja zakazująca indeksacji obrazków z danego dokumentu. Ale konia z rzędem temu, kto powie mi dokładnie jakie formaty plików dokładnie wpisują się w definicję obrazka.
unavailable_after: [RFC-850 date/time]
Popularność tej dyrektywy jest moim subiektywnym zdaniem odwrotnie proporcjonalna do jej użyteczności. Informuje ona bota, że dany dokument powinien nie być pokazywany w wynikach wyszukiwania od określonej daty i czasu (ściślej, według formatu z RFC 850). Gdzie to się może przydać? Na przykład w sklepach, aby nie irytować potencjalnych klientów ściąganiem ich na stronę z towarem, którego już nie ma. Albo kiedy kończy się obowiązywanie jakiejś promocyjnej oferty - to już nie tylko w sklepach.

Plik robots.txt - może (?) prosty, ale ekshibicjonistyczny

Niewątpliwą zaletą umieszczania wszystkich instrukcji botowych w jednym pliku tekstowym jest łatwość zarządzania. Zawsze wiadomo co tam jest, a przy użyciu wersjonowania w CMSie witryny można też zachować sobie dane historyczne.

Jak wspomniałem, robots.txt umieszcza się w katalogu głównym domeny, ale to nie jest wyczerpujące stwierdzenie. Prawidłowymi i jenocześnie różniącymi się od siebie adresami będą następujące:

  • http://example.com/robots.txt
  • http://subdomena.example.com/robots.txt
  • http://example.com:8181/robots.txt

W powyższym układzie zmiana protokołu z http na https również niesie za sobą odrębną interpretację. Jedynym nieprawidłowym zastosowaniem jest umieszczenie robots.txt w katalogu o dowolny poziom poniżej głównego, czyli na przykład http://example.com/katalog/robots.txt.

o2

No dobra, może nie jedynym, jak ładnie pokazuje serce internetu. Serwer zwraca 200 OK i kod strony głównej przy żądaniu o robots.txt. Zresztą można zapytać go o kilka innych rzeczy - odpowie tak samo. Hmm. Nie róbcie tego w domu.

Porównując wcześniej wymienione dyrektywy dla pliku z tymi dla tagu mogłoby się wydawać, że korzystanie z niego jest łatwe. W praktyce nie zawsze tak bywa, a na taki stan rzeczy wpływa kilka kwestii.

disallow nie chowa linków na serpach

Użycie disallow nie oznacza automatycznego braku czy usunięcia występowania zabronionych URLi w wynikach wyszukiwania. Jedyne co się stanie, to zmieni się snippet ich dotyczący - treść dyrektyw na http://www.tvn24.pl/robots.txt wygląda tak:

User-agent: *
Disallow: /user
Disallow: /article-by-category.html
Disallow: /get-category-by-ip.html
Disallow: /raporty-wiecej/
Disallow: /artykuly-wiecej/
Disallow: /magazyny-wiecej/
Disallow: /send-vote.html
Disallow: /weather-meteo-by-id.html
Disallow: /sport-section.html
Disallow: /magazyn-euro,ms
Disallow: /jedynka.html
Disallow: /pilne.json

Tymczasem w Google, używając zapytania site:tvn24.pl inurl:/pilne.json widać dokładnie ten plik z ostatniej linijki:

tvn24

Jeden plik to jeszcze nie aż taka wielka sprawa. Rozważmy więc http://natemat.pl/robots.txt:

User-agent: *
Allow: /
Disallow: /search/
Disallow: /more*
Disallow: /*-json/$
Disallow: /*?ticket=*
Disallow: /next-posts/
Disallow: /fb-get*

Przy zapytaniu site:natemat.pl inurl:/next-posts/ pojawia się już ponad 20 tysięcy wyników:

natemat

Wprawne oko dostrzegło zapewne, że mamy tu listing subdomen - śpieszę nadmienić iż plik o treści cytowanej jak wyżej jest klonowany na subdomenach *.natemat.pl.

Kolejny ciekawy przykład znajduje się pod adresem http://wyborcza.pl/robots.txt. Nie będę go tu cytował w całości, gdyż ma 156 linii, za to dobrze ilustruje jak można z robots.txt najzwyczajniej w świecie przekombinować. Znajdują się w nim między innymi takie egzotyczne zapisy:

(...)
Disallow: /gazetawyborcza_/wyszukaj/artykul/
(...)
Disallow: /wiadomosci/1,114871,14710459,Niewidomy___Restauracja_nie_wpuscila_mnie_z_psem_przewodnikiem__.html
(...)
Disallow: /miejsca_opole/161133445/Eugenia+Wr%C3%B3blewska+-+Khemiri+Po%C5%9Brednictwo+Ubezpieczeniowe/miasto-K%C4%99dzierzyn-Ko%C5%BAle/p/
(...)
Disallow: /1,75478,17068768,CBA_zatrzymalo_wysokich_urzednikow_ZUS__Chodzi_o_przetargi.html

Interesujący jest ten widoczny w wyrywkach w linii 2, z uwagi na:

wyborcza

Znów się przyda wprawne oko, tym razem do zauważenia że nie uwzględniono braku końcowego ukośnika. I bach, nie tylko nie osiągnięto zamierzonego celu zabronienia dostępu do zasobów, ale też z braku odpowiedniego zapisu pojawiło się w indeksie ponad tysiąc URLi zalatujących mielonką. Tu jest pierwszy wynik ze zrzutu ekranu: live i na screenshocie - screen jest bez adbloka, brak jakichkolwiek reklam typu display i ach te linki na dole… (nie no, żartuję, to nie spam - bądźmy tolerancyjni :). Warto też zaznaczyć, że zapisy z powyższego pliku są kropka w kropkę identyczne z tym co wisi na domenie gazeta.pl - tego nie rozumiem już kompletnie.

Zapis user-agent musi być w grupie z allow i/lub disallow. A czy można wymyślić coś ciekawego z sitemap? https://www.bankmillennium.pl/robots.txt

User-Agent: *
Disallow:
Sitemap: http://localhost/sitemap.xml

Można! :) I można też zastosować dyrektywy, których po prostu nie ma - http://nowy.play.pl/robots.txt:

(...)
Request-rate: 1/10              # maximum rate is one page every 10 seconds
Crawl-delay: 10                 # 10 seconds between page requests
Visit-time: 0400-0845           # only visit between 04:00 and 08:45 UTC
(...)

Webmasterom z Playa chodziło chyba o An Extended Standard for Robot Exclusion - tylko że jeśli nawet wersja 1.0 nie doczekała się standaryzacji, to tym bardziej nie może być mowy o kolejnej.

Jak widać, dyrektywy w robots.txt to nie taka prosta sprawa. Ale nie ma się co martwić, nawet Bardzo Znani SEOwcy czasem tego nie ogarniają…

profi

;).

Nie mów czego nie chcesz pokazać

Uwaga, teraz będzie o ekshibicjonizmie. Może i da się czegoś wyszukiwarkom zabronić przez dyrektywy w pliku, ale to cały czas jest zwykły plik tekstowy. Inaczej mówiąc - dostępny dla wszystkich. Nie tylko SEOwcy się mu przyglądają jako jednej z pierwszych rzeczy, gdy sprawdzają daną witrynę. Możesz mieć pewność, że zaglądają tam też hakerzy w poszukiwaniu ciekawych ścieżek do potencjalnych exploitów, jak i co bystrzejsi ludzie z konkurencji. Jeśli nie chcesz ujawnić jakichś rzeczy (nowego layoutu, przygotowywanej promocji, poufnych plików) to trzymaj je przynajmniej za autoryzacją HTTP, w żadnym wypadku nie blokuj w robots.txt.

Oprócz swojej dostępności dla wszystkich, zawartość pliku jest też indeksowana przez Google, więc dostępna do przeszukiwania. To wszystko co potrzebne żeby wymyślić jakiś google dork i znaleźć pliki takie jak ten (generator w PHP, który zachęca do podania mu parametrów) lub ten (fajne xlsy, szkoda że się nie da pobrać).

Wniosek - omijaj Rozłogi.

Pamiętaj, że to już 2015 rok i Google Bot przeszedł do następnej klasy

W przeszłości panowało przekonanie, że do dobrych praktyk należy wykluczanie w robotsach folderów zawierających jakieś elementy, z których witryna jest budowana. Przykładowo, mój blogasek działa na WordPressie - WP ma pewne stałe katalogi w strukturze, między innymi:

  • wp-admin
  • wp-content
    • wp-content/plugins
    • wp-content/themes
  • wp-includes

Na pierwszy rzut oka niby do odstrzału kwalifikuje się np. folder z wtyczkami albo includami. Kłopot jednakże polega na tym, że Google patrzy na strony w obrębie witryny już po renderowaniu. Jeśli zatem miałbym zablokowany w robotsach folder pluginu zasadniczo wpływającego na wygląd witryny, dociągającego swoje frontendowe rzeczy z własnego katalogu instalacyjnego, to byłbym w opałach. Chcąc rankować się blogiem, to nawet całkiem dużych.

Z powyższego względu, po dokonaniu zmian i/lub aktualizacji dyrektyw, warto upewnić się czy wszystko działa jak należy, tzn. czy Google jest w stanie pobrać i zrenderować dokument oraz czy po renderowaniu wygląda on tak, jak powinien. Robi się to poprzez Search Console &gt; Indeksowanie &gt; Pobierz jako Google.

W robots.txt możesz stosować wildcardy

Jeżeli masz większą ilość URLi do objęcia dyrektywą, możesz spróbować posłużyć się dzikimi kartami. Przypominają wyrażenia regularne, ale tylko trochę. Do dyspozycji masz dwa znaki. Gwiazdkę (&#42;), która oznacza zero lub więcej wystąpień dowolnego prawidłowego znaku i dolara ($), który oznacza koniec adresu URL. Ta konkretna funkcjonalność najlepsza będzie na konkretach, zatem posłużę się cytatem z oficjalnych przykładów dopasowania ścieżek.

[ścieżka]PasujeNie pasujeKomentarze
/Każdy prawidłowy URLPasuje do adresów URL na poziomie głównym i wszystkich niższych.
/*Odpowiednik ścieżki /Odpowiednik ścieżki /Odpowiednik ścieżki „/” – robot ignoruje symbol wieloznaczny na końcu.
/fish
/fish
/fish.html
/fish/salmon.html
/fishheads
/fishheads/yummy.html
/fish.php?id=dowolny
Fish.asp
/catfish
/?id=fish
Zwróć uwagę na rozróżnianie wielkości liter podczas dopasowywania.
/fish*
/fish
/fish.html
/fish/salmon.html
/fishheads
/fishheads/yummy.html
/fish.php?id=dowolny
/Fish.asp
/catfish
/?id=fish
Odpowiednik ścieżki „/fish” – robot ignoruje symbol wieloznaczny na końcu.
/fish/
/fish/
/fish/?id=dowolny
/fish/salmon.htm
/fish
/fish.html
/Fish/Salmon.asp
Końcowy ukośnik oznacza zgodność z każdym elementem w danym folderze.
fish/Odpowiednik ścieżki /fish/Odpowiednik ścieżki /fish/Odpowiednik ścieżki /fish/
/*.php
/nazwapliku.php
/folder/nazwapliku.php
/folder/nazwapliku.php?parametry
/folder/dowolny.plik.php.html
/nazwapliku.php/
/ (nawet
jeśli wskazuje /index.php)
/windows.PHP
/*.php$
/nazwapliku.php
/folder/nazwapliku.php
/nazwapliku.php?parametry
/nazwapliku.php/
/nazwapliku.php5
/windows.PHP
/fish*.php
/fish.php
/fishheads/catfish.php?parametry
/Fish.PHP

Testuj i podglądaj innych

Jeśli nie masz pewności czy coś dobrze piszesz, przetestuj swoje pomysły w Search Console. Tam niczego nie popsujesz, a po przetworzeniu żądania diagnostyka poda Ci wyniki zawsze według aktualnie obowiązujących reguł gry.

Brak Ci inspiracji? Spójrz co robią inni. Idealnym miejscem na start są pliki Google:

Trzymaj się oficjalnych informacji

dowody na to, że Google akceptuje jeszcze jedną dyrektywę w ramach robots.txt, mianowicie noindex. Teoretycznie skorzystanie z niej mogłoby rozwiązać problemy, jakie wskazałem powyżej, czyli zapobiec pokazywani się linków w wynikach, opisanych jako zablokowane w robotsach. Pytanie tylko czy warto? Osobiście uważam, że nie. Głównie ze względu na nieoficjalny status wspierania noindex. Może on zniknąć w dowolnym momencie.

Tag <meta name="robots" ...> - więcej pracy, ale elastyczniej

W odróżnieniu od robotsów, tagi meta stosuje się na każdym dokumencie. Trudność używania wzrasta zatem proporcjonalnie do ilości stron wchodzących w skład całej witryny, zatem przy serwisie idącym w tysiące czy dziesiątki tysięcy dokumentów miejscami mogą pojawić się kłopoty.

Z drugiej strony jednak takie szczegółowe podejście daje więcej możliwości, nie tylko ze względu na opisany wcześniej, znacznie bogatszy zakres dyrektyw. Równie istotny jest także fakt, że zabraniając indeksacji z poziomu konkretnego dokumentu ustrzeżemy się przed potencjalnymi stratami w przepływach PageRanku. Strona z zapisem <meta name="robots" content="noindex,follow" /> nie trafi do indeksu, ale jednocześnie, jeżeli posiada linki przychodzące, to przekaże link juice dalej wewnątrz witryny (i na zewnątrz też).

Więcej niż jeden tag robots

Każdy dokument może być dostosowywany indywidualnie do danego bota. Nie wyklucza to tym samy posiadania więcej niż jednej instancji meta tagu, pod warunkiem, że w atrybucie name wpisany zostanie konkretny identyfikator bota. Fajnie, ale tu też trzeba uważać, ponieważ dyrektywy mogą podlegać połączeniu. Przykładowo zapis:

<meta name="robots" content="nofollow">
<meta name="googlebot" content="noindex">

spowoduje, że bot Google odczyta to łącznie, jako nofollow,noindex.

Nagłówek X-Robots-Tag - where magic happens

Chodzi tu naturalnie o pole w nagłówku odpowiedzi serwera http. Generalnie korzystanie z tej formy przekazywania dyrektyw nie różni się od metatagu - można korzystać z tych samych instrukcji, można dodawać to pole wielokrotnie i różnicować nazwy botów. Prawdziwa moc kryje się natomiast w tym, że definiowanie nagłówków odbywa się na poziomie albo silnika CMS albo konfiguracji serwera, np. poprzez plik .htaccess.

Kontroluj więcej niż tylko dokumenty html

Właśnie z trików, jakie wpisać można w .htaccess wynika największa siła korzystania z nagłówków. Po ustawieniu tylko jednej konstrukcji można mieć pewność, że do indeksu nie trafią pliki, w których nie da się ustawić tagu meta, takie jak obrazki, pdfy, pliki excelowe czy wordowe. Przykład:

<Files ~ "\.(png|jpe?g|gif|pdf|xlsx?|docx?)$">
  Header set X-Robots-Tag "noindex"
</Files>

Efekt będzie dokładnie taki, jaki być powinien, a jednocześnie nie ma żadnych śladów w robots.txt, więc ciekawscy niczego nie zobaczą.

Oczywiście można sobie pozwolić na znacznie bardziej rozbudowane konstrukcje, nie trzeba zupełnie zabraniać indeksacji. Wpisy w .htaccess pozwalają na skorzystanie ze wszystkich dobrodziejstw wyrażeń regularnych, a nie tylko dwóch znaków jak to jest w robotsach.

Inne boty niż tylko wyszukiwarki

Rozumiem, że wszystkich nas najbardziej interesują boty wyszukiwarkowe, ale pamiętajmy też o istnieniu robotów działających na rzecz innych narzędzi. O ile jeszcze takie jak np. sprawdzające dostępność zasobów (jak z Wikipedii linki zewnętrzne, właśnie na potrzeby porządku w Wiki) są w miarę przewidywalne (i w sumie korzystne, bo kto by nie chciał mieć linków z Wiki ;), o tyle próba zarządzania botami gromadzącymi dane dla szeroko pojętego business intelligence to moim zdaniem walka z wiatrakami.

Bądźmy szczerzy, jeżeli są sobie usługi sprzedające analizę konkurencji, to ich właściciele nie mają żadnego interesu w przestrzeganiu Robots Exclusion Protocol. Żeby wyglądać ładnie marketingowo mogą mieć strony pomocy, na których opiszą swoje boty, potwierdzą że przestrzegają REP. Ale to nie przeszkadza równocześnie kupować danych od innych dostawców, którzy puszczają w sieć boty zupełnie nie przejmujące się dyrektywami. Trudno się dziwić, to nie jest nielegalne, jest za to dochodowe.

Jeśli chcesz mieć pewność co do wykluczania takich botów, to niestety nie ma innego wyjścia niż mozolne strzelanie po zakresach IP lub skorzystanie z jakiegoś dobrego CDN, który ma już gotowe bazy złych botów i wytnie taki ruch za Ciebie.

Imiona i identyfikatory robotów

Poniżej zamieszczam garść linków do list zawierających informacje identyfikujące roboty. Jeśli jakiś dziwny odwiedza Twoją witrynę, jest szansa że z materiałów poniżej dowiesz się kto zacz.

  • Kompletna lista robotów Google - tak, jest więcej niż jeden.
  • Lista Martina Monperrusa w formie repo gitowego, posiada informacje o botach sformatowane w JSONie.
  • List of all Crawlers - nie wiem czy wszystkich, ale na pewno jest ich sporo :). Oprócz nazw botów posiada też znacznie bardziej szczegółowe informacje, takie jak linki do ich dokumentacji, kompletne user-agenty oraz numery IP z których pojawia się aktywność danego bota.
  • User-Agents.org - podobnie jak powyżej, aczkolwiek informacje nie są już tak bogate.
  • Bots vs Browsers - baza danych z prawie półtora milionem rekordów, zarówno dotyczących botów jak i przeglądarek. Jej największą zaletą jest wyszukiwarka, która zwraca wszystkie rekordy pasującego do danego ciągu znaków. Na przykład to wie o bocie `roger`, który pochodzi o Moz.