Sok weboldalon a látogatói forgalom jelentős részét nem valódi emberek, hanem automatizált crawlerek (botok) adják: keresőmotorok indexelői, SEO-elemző eszközök, AI-modelleket tréningező adatgyűjtők és egyszerű scraperek. Ezek egy része agresszíven, rate limitelés nélkül, sokszor másodpercenként több kéréssel tölti le az oldal minden aloldalát, ami komoly szerverterhelést és lassulást okozhat a valódi látogatók számára.
Milyen botokat blokkol ez a szabály?
A listában szereplő user agentek nagyjából az alábbi kategóriákba sorolhatók:
- SEO- és marketingelemző botok: BLEXBot, DotBot, MJ12bot, Ezooms, SentiBot, MetaURI, MegaIndex.ru, BarkRowler/Barkrowler, Nimbostratus-Bot, Polaris, AspiegelBot, serpstatbot, RSiteAuditor, seocompany.store, AhrefsSiteAudit, DomainStatsBot, SeekportBot, CriteoBot, BitSightBot, WellKnownBot, Cookiebot, trendictionbot, ZoominfoBot — jellemzően backlink-elemzést, versenytárs-figyelést vagy hirdetési célú adatgyűjtést végző, harmadik fél SaaS-szolgáltatásokhoz tartozó crawlerek. Nem hoznak valódi látogatói vagy keresőmotoros forgalmat, viszont rendszeresen és nagy mélységben járják be az oldalt.
- AI-tréning és tartalomgyűjtő botok: meta-externalagent, meta-webindexer, ClaudeBot, Bytespider, GeedoBot, ImagesiftBot, OAI-SearchBot, CCBot — nagy nyelvi modellek betanításához vagy AI-alapú kereséshez gyűjtenek tartalmat a weboldalakról.
- Keresőmotor-jellegű, de az adott oldal szempontjából nem releváns crawlerek: Baiduspider (kínai piacra), SeznamBot (cseh piacra), PetalBot, MojeekBot, OSZKBOT (az Országos Széchényi Könyvtár archiváló robotja), Nutch (nyílt forráskódú crawler-keretrendszer, amelyre sok egyéni bot épül) — ezek legitim keresőmotorokhoz vagy intézményekhez köthetők, de ha az adott célközönség nem ezekről a platformokról érkezik, a forgalmuk felesleges terhelést jelent.
- Generikus HTTP-kliens könyvtárak: python-requests, Go-http-client, fasthttp, GRequests, GuzzleHttp — ezek nem konkrét botok, hanem programozási nyelvi könyvtárak alapértelmezett User-Agent stringjei. Mivel valódi böngésző szinte sosem küld ilyen fejlécet, a gyakorlatban szinte mindig scriptelt, azonosítatlan (esetleg rosszindulatú) lekérésekről árulkodnak.
- Egyéb adatgyűjtő botok: DataForSeoBot — SEO-API szolgáltatáshoz tartozó crawler.
Miért történik a tiltás?
- Terhelés csökkentése: sok felsorolt bot nem tartja be a
robots.txtajánlásait, és percenként több száz kérést is küldhet, ami CPU- és adatbázis-terhelést okoz. - Sávszélesség-megtakarítás: különösen képekkel, videókkal vagy nagy adatbázis-lekérdezésekkel dolgozó oldalaknál számottevő lehet a scraperek okozta forgalom.
- Biztonság: az azonosítatlan HTTP-kliensek (python-requests, Go-http-client, GuzzleHttp stb.) mögött gyakran automatizált támadási kísérletek, sebezhetőség-keresés vagy tartalom-lopás áll.
- Tartalomvédelem: az AI-tréning célú botok blokkolása megakadályozza, hogy az oldal tartalma engedély nélkül kerüljön be nagy nyelvi modellek tanítóadatai közé.
Hogyan lehet felülbírálni (kivételt tenni) a blokkoláson?
Előfordulhat, hogy egy blokkolt User-Agent stringet használó eszközt (pl. saját monitorozó szolgáltatást, terheléstesztet, egy webhookot vagy egy adott IP-címről érkező partnerintegrációt) mégis át kell engedni. Erre a legtisztább megoldás egy IP-cím alapú kivétellista, amit <RequireAny> blokkal lehet a szabályba építeni:
<IfModule mod_authz_core.c>
<If "%{HTTP_USER_AGENT} =~ /(meta-externalagent|meta-webindexer|BLEXBot|DotBot|MJ12bot|Baiduspider|Ezooms|SentiBot|MetaURI|MegaIndex\.ru|BarkRowler|Nimbostratus-Bot|Polaris|AspiegelBot|serpstatbot\.com|PetalBot|RSiteAuditor|seocompany\.store|AhrefsSiteAudit|Nutch|OSZKBOT|SeznamBot|Barkrowler|CCBot|DataForSeoBot|ZoominfoBot|ClaudeBot|python-requests|Bytespider|GeedoBot|Go-http-client|SeekportBot|ImagesiftBot|DomainStatsBot|fasthttp|MojeekBot|CriteoBot|BitSightBot|OAI-SearchBot|GRequests|GuzzleHttp|WellKnownBot|Cookiebot|trendictionbot)/i">
<RequireAny>
# Alapból mindenkit elutasítunk, aki idáig eljutott
Require all granted
# --- Kivételek: ezek az IP-k/tartományok felülbírálják a tiltást ---
Require ip 203.0.113.42
Require ip 198.51.100.0/24
</RequireAny>
</If>
</IfModule>
A logika: a <RequireAny> blokkon belül elég, ha bármelyik Require sor teljesül ahhoz, hogy a kérés engedélyezve legyen. A Require all denied sor önmagában sosem "teljesül" (mindig elutasít), viszont ha a kliens IP-je szerepel a Require ip listában, az a feltétel igazzá válik, és felülírja az elutasítást. Így:
- egy listázott IP-ről érkező kérés — akkor is, ha a User-Agentje egyezik a tiltólistával — átengedésre kerül;
- minden más, tiltott User-Agenttel érkező kérés továbbra is 403-at kap.
A Require ip direktíva egyetlen IP-t (203.0.113.42) és CIDR-jelöléses tartományt (198.51.100.0/24) egyaránt elfogad, tetszőleges számú sorban felsorolva.
Alternatíva: engedélyezés titkos kérésfejléc alapján
Ha nem IP-cím, hanem például egy belső teszteszköz vagy CI-rendszer számára szeretnénk kivételt tenni, egy egyedi HTTP-fejléc is használható IP helyett vagy mellett:
<IfModule mod_authz_core.c>
SetEnvIf X-Bot-Bypass "^titkos-token-ide$" bot_bypass
<If "%{HTTP_USER_AGENT} =~ /(...)/i">
<RequireAny>
Require all denied
Require env bot_bypass
</RequireAny>
</If>
</IfModule>
Ebben az esetben a kliensnek a kérésében el kell küldenie az X-Bot-Bypass: titkos-token-ide fejlécet ahhoz, hogy a tiltás ellenére átengedje a szabály. Fontos, hogy ez a "token" a .htaccess fájlban nyílt szövegként van jelen, ezért nem tekinthető valódi biztonsági intézkedésnek, csak gyakorlati kivétel-mechanizmusnak (pl. tesztelésre).
A szabály tesztelése
A módosítás után érdemes ellenőrizni, hogy a blokkolás és a kivétel is a várt módon működik:
# Ennek 403-at kell adnia
curl -A "BLEXBot/1.0" -I https://pelda-domain.hu/
# Ennek 200-at kell adnia (normál böngésző User-Agent)
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" -I https://pelda-domain.hu/
# Ha van IP-alapú kivétel, a felülbírált IP-ről indított teszt is 200-at kell adjon
curl -A "BLEXBot/1.0" -I https://pelda-domain.hu/ # a szerverről, a whitelistelt IP-ről futtatva