[PHP] Counter die Bots nicht mitzählen

@ Mondschatten
Danke, scheint zu klappen! :)

@ Keita
Wie soll denn dieses Suchmuster aussehen? Bis jetzt ist ja die performance doch sehr gut von meiner Seite!


Offtopic
@ davidbaumann
Hmm, bin zurzeit ein Nachtaktiver Mensch! Bis um 5 gefeiert und war so aufgedreht das ich nicht schlafen konnte :lol:
 
Du mußt im Prinzip nach Gemeinsamkeiten unter den UA-Strings von Bots und Spidern suchen, die nicht in "normalen" UA-Strings vorkommen. Typische Zeichenfolgen sind z.B. bot, spider, spyder, crawler, libcurl, libwww, search, archive etc.
Das ganze kannst du zu einem regulären Ausdruck zusammenfassen und ggf. noch optimieren, so unterscheiden sich spider und spyder nur in einem Buchstaben, was sich durch den Ausdruck sp[iy]der abdecken ließe, bei libwww und libcurl wäre es lib(?:curl|www).
wenn man das ganze zusammenfassen würde, käme sowas wie
Code:
/bot|sp[iy]der|crawler|lib(?:cur|www)|search|archive/
raus, in PHP sähe die Prüfung dann wie folgt aus:
PHP:
  if (!preg_match('/bot|sp[iy]der|crawler|lib(?:cur|www)|search|archive/i', $_SERVER['HTTP_USER_AGENT'])) {
  // scheint kein bot zu sein
}

Du kannst natürlich auch die einzelnen Zeichenketten in ein Array schreiben und zu einem String zusammenführen, was die Les- und Wartbarkeit erhöhen würde:

PHP:
$pattern = array(
  'bot',
  'sp[iy]der',
  'crawler',
  'lib(?:cur|www)',
  'search',
  'archive'
);

if (!preg_match('/' . implode('|', $pattern) . '/i', $_SERVER['HTTP_USER_AGENT'])) {
  // scheint kein bot zu sein
}

greetings, Keita
 
Schonmal Danke, funktioniert wunderbar.

Jetzt will ich noch einige IPs sperren und dachte mir, das ich diese in ein Array schreibe das wiefolgt aussieht:

PHP:
$serveradressen = array(
	"212.162.14.235",
	"212.227.83.149",
	"128.30.52.34",
	);

$suchmuster = '/bot|sp[iy]der|Francis|Snappy|W3C|Jigsaw|Java|Yahoo|URL|http|crawler|lib(?:cur|www)|search|archive/i';



if (!preg_match($suchmuster, $_SERVER['HTTP_USER_AGENT']) && !in_array(getenv("REMOTE_ADDR"), $serveradressen)) {

...

}

Hmm so recht will dies aber nicht funktionieren mit den IPs!?
Löst man das anders?

Mfg chriz



EDIT :

PHP:
if (!preg_match($suchmuster, $_SERVER['HTTP_USER_AGENT']) || !in_array(getenv("REMOTE_ADDR"), $serveradressen)) {

Habe das jetzt so geändert und es funktioniert anscheinend!? Was ist denn der unterschied zwischen dem " && " und " || " bei der If-Abfrage?

Mfg chriz
 
Zuletzt bearbeitet:
&& ist ein logisches UND, || ein logisches ODER ;)
Muster paßt nicht UND Adresse ist nicht in der Liste ist ja was anderes als Muster paßt nicht ODER Adresse ist nicht in der Liste...

greetings, Keita
 

Ähnliche Themen

J
Antworten
5
Aufrufe
1.080
C
M
Antworten
3
Aufrufe
1.022
Zurück
Oben