nginx: Bots/Browserkennungen sperren

Bekanntlich nutzt nginx keine .htaccess-Dateien, um die Performance stets hoch zu halten. Aus diesem Grunde gestaltet sich auch das Sperren bestimmter Browserkennungen von z. B. Bots etwas anders, kann aber über eine einfache if-Abfrage in der Konfiguration erreicht werden.

Jeder Besucher auf einer Webseite liefert eine Browserkennung (auch User Agent), die eine einfache Zeichenkette ist und bestimmte Informationen enthält. Auch Bots haben oftmals eine eindeutige Kennung und können daher auch blockiert werden. Für die Blockierung nutzen wir einfach eine „Zugriff verweigert“-Meldung, die über den HTTP-Statuscode 403 erreicht wird.

Eine Abfrage nach einer Browserkennung sieht in der Konfigurationsdatei von nginx folgendermaßen aus:

if ($http_user_agent ~* useragent) {
	// what happens?
}Code-Sprache: PHP (php)

Hierbei wird alles innerhalb der geschweiften Klammern auf Besucher angewendet, welche innerhalb ihrer Browserkennung die Zeichenkette „useragent“, egal in welcher Konstellation von Groß- und Kleinschreibung, nutzen.

Den Statuscode 403 übergibt man dann einfach an diese Besucher mit return: 403;, was dann insgesamt folgendermaßen aussieht:

if ($http_user_agent ~* useragent) {
	return 403;
}Code-Sprache: PHP (php)

Wer möchte, kann auch mehrere Browserkennungen innerhalb von einer if-Abfrage sperren. Da alles hinter dem ~-Zeichen als regulärer Ausdruck interpretiert wird (das direkt anschließende Asterisk-Zeichen * gibt an, dass die Groß-/Kleinschreibung nicht beachtet werden soll), kann man hier auch reguläre Ausdrücke nutzen. Ein useragent|browserkennung schließt dann z. B. die Zeichenketten „useragent“ und „browserkennung“ aus. Das |-Zeichen fungiert hier als „oder“. Dies kann man einfach so weiterführen, so dass das Ganze auch so aussehen kann:

if ($http_user_agent ~* useragent|browserkennung|wget|spider|robot) {
	return 403;
}Code-Sprache: PHP (php)

Nach der Änderung der Konfigurationsdatei muss selbige nur neu von nginx geladen werden:
service nginx reload

Meiner Meinung nach bietet es sich an, die Abfrage in eine separate Datei zu speichern, z. B. unter /etc/nginx/blocked_bots und dann in jedem benötigten vHost zu inkludieren:
include /etc/nginx/blocked_bots;.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert