Velik del prometa mnogih spletnih strani ne ustvarjajo pravi obiskovalci, temveč avtomatizirani pajki (boti): orodja za analizo SEO, roboti, ki zbirajo podatke za učenje modelov umetne inteligence, tuji iskalniki in preprosti strgalniki. Del teh brez omejitev, pogosto z več zahtevami na sekundo, prečeše vse podstrani, kar spletno stran upočasni za prave obiskovalce in po nepotrebnem porablja okvir virov gostovanja.
Zato na strežnikih naših gostovanj cPanel in WordPress spletni strežnik privzeto z napako 403 Forbidden zavrne zahteve, katerih glava User-Agent (identifikator, ki ga pošlje odjemalec) kaže na bota s seznama blokiranih. Pravilo je v nastavitvah strežnika, velja za vse spletne strani gostovanja, zanj ti ni treba ničesar nastaviti. Če bi kakšnega bota vseeno rad spustil skozi, lahko v datoteki .htaccess narediš izjemo (glej spodaj).
Katere bote blokira pravilo?
Seznam blokiranih trenutno vsebuje bote, ki jih je mogoče razvrstiti v naslednje skupine:
- Boti za SEO, trženje in zbiranje poslovnih podatkov: AhrefsBot in AhrefsSiteAudit, SemrushBot, MJ12bot (Majestic), DotBot (Moz), BLEXBot, BarkRowler, serpstatbot, DataForSeoBot, MegaIndex.ru, seocompany.store, Ezooms, SentiBot, MetaURI, ZoominfoBot, VelenPublicWebCrawler, Dataprovider.com, AwarioBot, IonCrawl, GrapeshotCrawler, CriteoBot, BitSightBot, WellKnownBot, Nimbostratus-Bot, Polaris, brokenlinkcheck.com. Ti zbirajo podatke za zunanje storitve (analizatorje povratnih povezav, spremljanje konkurence, oglaševalske in poslovne podatkovne baze). Na stran ne pripeljejo obiskovalcev, jo pa redno in globoko prečešejo.
- Boti za učenje modelov umetne inteligence in množično zbiranje vsebine: GPTBot (OpenAI), ClaudeBot (Anthropic), CCBot (Common Crawl), Bytespider (ByteDance), Amazonbot (Amazon), ImagesiftBot, FriendlyCrawler, GeedoProductSearch. Vsebino spletnih strani zbirajo za učenje velikih jezikovnih modelov ali v lastne podatkovne baze.
- Tuji in manjši iskalniki: Baiduspider (Kitajska), YandexBot (Rusija), SeznamBot (Češka), PetalBot in njegov predhodnik AspiegelBot (Huawei), SeekportBot, Applebot (predlogi Siri, Spotlight in Safari ter modeli umetne inteligence podjetja Apple). Ti pripadajo legitimnim iskalnikom, vendar na stran, namenjeno slovenskemu občinstvu, običajno pripeljejo malo obiskovalcev.
- Roboti za arhiviranje spleta in ogrodja pajkov: OSZKBOT (madžarski spletni arhiv Narodne knjižnice Széchényi), Archive Team, Nutch (odprtokodno ogrodje pajkov, na katerem temelji veliko posameznih botov).
- Knjižnice odjemalcev HTTP: python-requests, Go-http-client, axios, GuzzleHttp, fasthttp, GRequests. To niso konkretni boti, temveč privzete vrednosti User-Agent programskih knjižnic. Brskalnik tega nikoli ne pošlje, zato so za njimi najpogosteje neidentificirani skripti, iskalniki ranljivosti ali programi za krajo vsebine.
- Strgalniki, preoblečeni v brskalnik: nekaj zastarelih identifikatorjev brskalnikov (na primer Firefox 62 v Ubuntuju, Firefox 95 v Linuxu), ki jih uporabljajo znana omrežja strgalnikov. Današnji brskalniki tega ne pošiljajo.
Česa ne blokiramo?
Pravilo ne zadeva robotov Googla (Googlebot, AdsBot-Google), Binga in DuckDuckGo, pripravljavcev predogledov povezav družbenih omrežij (Facebook, LinkedIn, X), robotov, ki stran odprejo na vprašanje uporabnika ali indeksirajo za iskalnik umetne inteligence (ChatGPT-User, OAI-SearchBot, Claude-SearchBot, PerplexityBot), robota Internet Archive, programov curl in wget, lastnih zahtev WordPressa in večine nadzornikov delovanja (na primer UptimeRobot).
Zakaj te bote blokiramo?
- Manjša obremenitev: nekateri boti se ne držijo navodil
robots.txtin lahko pošljejo tudi več sto zahtev na minuto. To povzroča obremenitev procesorja in podatkovne baze, ki lahko ob dosegu omejitve virov gostovanja privede tudi do napake 508. - Manj podatkovnega prometa: pri spletnih straneh s slikami, videoposnetki ali veliko podstranmi je lahko promet strgalnikov znaten.
- Varnost: za neidentificiranimi odjemalci HTTP so pogosto avtomatizirani poskusi napadov, iskanje ranljivosti ali kraja vsebine.
- Zaščita vsebine: z blokado botov za učenje umetne inteligence vsebina spletne strani ne pride brez dovoljenja med učne podatke velikih jezikovnih modelov.
Kdaj je lahko potrebna izjema?
Lahko se zgodi, da potrebuješ storitev, ki uporablja blokiran User-Agent, na primer:
- svojo spletno stran analiziraš z Ahrefs ali Semrush in njihov pajek strani ne more prečesati;
- tvoja spletna stran cilja tudi na ruski, češki ali kitajski trg (Yandex, Seznam, Baidu) ali ti je pomembna prisotnost v Applovih iskalnikih (Applebot);
- povratni klic ponudnika plačil (IPN), webhook, odjemalec API ali tvoj lasten skript dostopa do spletne strani in uporablja knjižnico HTTP za PHP (Guzzle), Node.js (axios), Python ali Go.
Če taka storitev dobi napako 403, vrstica client denied by server configuration za zahtevo v točki menija Meritve » Napake v cPanelu pokaže, da jo je zavrnil strežnik.
Izjema v datoteki .htaccess
Blokado je mogoče preglasiti v datoteki .htaccess v korenskem imeniku spletne strani, ki jo lahko urejaš v točki menija Upravitelj datotek v cPanelu (prikaz skritih datotek vklopiš pri gumbu Nastavitve).
Pomembno je, da izjema deluje le v bloku <If>: pravilo strežnika se ovrednoti po navadnih vrsticah Require datoteke .htaccess, zato na primer samostojna vrstica Require all granted blokade ne odpravi. Blok <If> v datoteki .htaccess pa sledi pravilu strežnika, zato ga preglasi.
Pri WordPressu izjemo postavi zunaj dela med vrsticama # BEGIN WordPress in # END WordPress, ker WordPress ta del ob shranjevanju nastavitev prepiše.
Na pravila strežnika, ki varujejo datoteke .env in imenike .git, izjeme ne vplivajo, ti ostanejo še naprej blokirani.
Popolno dovoljenje bota
Če želiš določenega bota spustiti od povsod, v pravilo vpiši njegovo ime (ali več imen, ločenih z znakom |):
<If "%{HTTP_USER_AGENT} =~ /(AhrefsSiteAudit|SemrushBot)/i">
Require all granted
</If>
Glavo User-Agent lahko kdorkoli poljubno nastavi, zato lahko s to nastavitvijo vstopi vsak program, ki se izdaja za tega bota. Če storitev prihaja z znanih naslovov IP, je varnejša spodnja izjema na podlagi IP.
Dovoljenje na podlagi naslova IP
Če storitev, ki uporablja blokiran User-Agent (na primer ponudnik plačil, sistem za nadzor ali tvoj lasten strežnik), prihaja z znanih naslovov IP, spusti le te naslove:
<If "%{HTTP_USER_AGENT} =~ /(GuzzleHttp|python-requests|axios|Go-http-client)/i">
<RequireAny>
Require all denied
Require ip 203.0.113.42
Require ip 198.51.100.0/24
</RequireAny>
</If>
Znotraj bloka <RequireAny> zadostuje, da je izpolnjena katera koli vrstica Require. Vrstica Require all denied ni nikoli izpolnjena, vrstica Require ip pa je, če zahteva prihaja z enega od naštetih naslovov. Tako:
- zahteve z naštetih naslovov IP pridejo skozi, tudi če je njihov User-Agent na seznamu blokiranih;
- vse druge zahteve z blokiranim User-Agentom še naprej dobijo napako 403.
V vrstici Require ip lahko navedeš posamezen naslov IP (203.0.113.42) in obseg v zapisu CIDR (198.51.100.0/24), IPv4 in IPv6, v poljubnem številu vrstic. Če je spletna stran za Cloudflarom, moraš tudi takrat navesti pravi naslov IP obiskovalca, strežnik ga prebere iz glave Cloudflare.
Dovoljenje na podlagi skrivne glave
Če naslov IP odjemalca ni stalen (na primer pri sistemu CI ali notranjem testnem orodju), lahko namesto naslova IP ali poleg njega uporabiš edinstveno glavo HTTP:
SetEnvIf X-Bot-Bypass "^skrivni-zeton-sem$" bot_bypass
<If "%{HTTP_USER_AGENT} =~ /(python-requests|GuzzleHttp)/i">
<RequireAny>
Require all denied
Require env bot_bypass
</RequireAny>
</If>
V tem primeru mora odjemalec v vsaki zahtevi poslati glavo X-Bot-Bypass: skrivni-zeton-sem. Žeton je v datoteki .htaccess zapisan kot navadno besedilo, zato to ni prava varnostna rešitev, temveč le preprosto ravnanje z izjemami, na primer za testiranje. Uporabi dolgo, naključno vrednost.
Dodajanje lastne blokade
Če bi rad blokiral bota, ki ga ni na seznamu, lahko to storiš enako, z blokom <If>:
<If "%{HTTP_USER_AGENT} =~ /(meta-externalagent|PerplexityBot)/i">
Require all denied
</If>
Pri botih, ki se držijo navodil robots.txt (na primer pri robotih velikih iskalnikov in podjetij za umetno inteligenco), zadostuje tudi prepoved v datoteki robots.txt.
Testiranje pravila
Po spremembi lahko s programom curl preveriš, ali blokada in izjema delujeta po pričakovanjih:
# Dobiti mora odgovor 403
curl -I -A "Mozilla/5.0 (compatible; BLEXBot/1.0)" https://pelda-domain.hu/
# Dobiti mora odgovor 200 (običajen User-Agent brskalnika)
curl -I -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" https://pelda-domain.hu/
# Pri izjemi na podlagi glave mora z glavo dobiti odgovor 200
curl -I -A "python-requests/2.32" -H "X-Bot-Bypass: skrivni-zeton-sem" https://pelda-domain.hu/
Pri izjemi na podlagi IP mora zahteva z blokiranim User-Agentom, poslana z naslova IP s seznama izjem, vrniti odgovor 200, z vsakega drugega naslova pa 403.
Če storitev tudi po izjemi dobi napako 403, je morda ne blokira to pravilo, temveč požarni zid strežnika (glej: Blokada IP v požarnem zidu). Takrat nam piši in pomagali ti bomo najti vzrok.