Wie konfiguriere ich Apache damit bestimmte Zugriffe nicht im Access Log vermerkt werden

Version 1.0
Author: Falko Timme


Normalerweise vermerkt Apache alle Zugriffe in seinem Access Log. In bestimmten Fällen kann dies Deine Page View Statistiken verfälschen (wenn Du ein Tool wie Webalizer oder AWStats verwendest, das Statistiken basierend auf Apaches Access Log erzeugt), wenn Du zum Beispiel viele Besuche von Suchmaschinen-Spider oder bestimmten IP Adressen hast (z.B. Deiner eigenen), oder wenn jede Deiner Seiten eine andere Seite von Deiner Webseite (z.B. in einem iframe) mit einschließt (das würde Deine Page Views sofort verdoppeln, was ganz offensichtlich nicht korrekt wäre). Diese Kurzanleitung veranschaulicht, wie man Apaches SetEnvIf Direktive verwendet, um Apache daran zu hindern, solche Zugriffe zu loggen.

Diese Anleitung ist ohne jegliche Garantie! Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 SetEnvIf verwenden

Die SetEnvIf Direktive kann in Deiner Apache Konfiguration in folgenden Kontexten verwendet werden: In der globalen Apache Konfiguration (wenn die Direktive für den gesamten Server gelten soll), in den vhost Konfigurationen (wenn die Direktive nur für den bestimmten vhost gelten soll), zwischen <Directory ...></Directory> (wenn die Direktive nur für ein bestimmtes Verzeichnis und deren Unterverzeichnisse gelten soll) und in .htaccess Dateien (AllowOverride FileInfo muss eingestellt sein).

Basierend auf folgenden Kriterien kannst Du mit SetEnvIf verhindern, dass Zugriffe geloggt werden (siehe außerdem http://httpd.apache.org/docs/2.0/mod/mod_setenvif.html für nähere Angaben):
  • Host
  • User-Agent
  • Referer
  • Accept-Language
  • Remote_Host: der Hostname (wenn verfügbar) des Client, der zugreift.
  • Remote_Addr: die IP Adresse des Client, der zugreift.
  • Server_Addr: die IP Adresse des Servers, auf dem der Zugriff erhalten wurde (nur bei Versionen, die älter als Version 2.0.43 sind).
  • Request_Method: die Bezeichnung der Methode, die verwendet wird (GET, POST, etc.).
  • Request_Protocol: die Bezeichnung und die Version des Protokolls, mit dem zugegriffen wurde (z.B. "HTTP/0.9", "HTTP/1.1", etc.).
  • Request_URI: die Ressource, die mittels HTTP Protokoll angefordert wurde - im Allgemeinen der Teil der URL zwischen HTTP:// und dem "?".
Die SetEnvIf Direktive hat folgende Form:

SetEnvIf attribute regex env-variable

wobei "attribute" eines der Kriterien ist, die ich gerade erwähnt habe. "regex" ist eine Perl-kompatibler regulärer Ausdruck.

Gehen wir nun davon aus, dass Monit einmal in der Minute auf die Datei /monit/token zugreift um zu überprüfen, ob Apache immer noch ausgeführt wird. Natürlich möchten wir diese Zugriffe nicht loggen, da sie nicht von einem realen Benutzer stammen. Daher verwenden wir die folgende SetEnvIf Direktive:

SetEnvIf Request_URI "^/monit/token$" dontlog

^ bedeutet, dass die Request_URI mit /monit/token beginnen muss, $ bedeutet, dass sie auch mit /monit/token enden muss (also passt nur /monit/token zu diesem regulären Ausdruck). Wenn wir "^/monit/token" verwenden würden, würde jede URL, die mit /monit/token beginnt, auf den regulären Ausdruck passen, z.B. /monit/token/example.html; "/monit/token$" würde auf jede URL passen, die mit /monit/token endet, z.B. /example/monit/token.

Nun haben wir einen iframe in /iframe/iframe.html, den wir ebenfalls nicht loggen möchten. Folgendes würden wir verwenden:

SetEnvIf Request_URI "^/iframe/iframe.html$" dontlog

Nun müssen wir Apache mitteilen, dass es alle Zugriffe, die mit "dontlog" gekennzeichnet sind, nicht loggen darf. Suche in Deiner Apache Konfiguration die CustomLog Direktive, z.B.

CustomLog /var/log/apache2/access.log combined

oder

CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" combined

und füge env=!dontlog der Zeile hinzu:

CustomLog /var/log/apache2/access.log combined env=!dontlog

oder

CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" combined env=!dontlog

Starte Apache danach neu. Nun werden keine Zugriffe geloggt, die mit "dontlog" gekennzeichnet sind.

Hier sind einige weitere Beispiele, die ich auf dieser Seite gefunden habe:
Um zu verhindern, dass Zugriffe, die durch einen bestimmten Browser erzeugt werden, z.B. Internet Explorer, geloggt werden, könntest Du dies verwenden:

SetEnvIf User_Agent "(MSIE)" dontlog

Um zu verhindern, dass Zugriffe von einem Client, dessen Hostname mit bla.example.com endet, geloggt werden, verwende Folgendes:

SetEnvIf Remote_Host "bla.example.com$" dontlog

Um zu verhindern, dass Zugriffe von einem Client, dessen Hostname mit example beginnt, verwende Folgendes:

SetEnvIf Remote_Host "^example" dontlog

Um zu verhindern, dass Zugriffe von einer bestimmte IP Adresse geloggt werden, verwende etwas in der Art:

SetEnvIf Remote_Addr "192.168.0.154" dontlog

Wenn Du nicht möchtest, dass Zugriffe von Deiner robots.txt geloggt werden, verwende Folgendes:

SetEnvIf Request_URI "^/robots.txt$" dontlog

Abgesehen von SetEnvIf, wobei Groß- und Kleinbuchstaben unterschieden werden, kannst Du SetEnvIfNoCase verwenden, hier werden Groß- und Kleinbuchstaben nicht unterschieden.

Um zum Beispiel bestimmte Suchmaschinen-Spider nicht zu loggen, könntest Du dies verwenden:

SetEnvIFNoCase User-Agent "Slurp/cat" dontlog
SetEnvIFNoCase User-Agent "Ask Jeeves/Teoma" dontlog
SetEnvIFNoCase User-Agent "Googlebot" dontlog
SetEnvIFNoCase Remote_Host "fastsearch.net$" dontlog

Oder wenn Du nicht möchtest, dass bestimmte Dateiendungen geloggt werden, verwende etwas in der Art:

SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)|(eot)$" dontlog

Damit bestimmte referrals nicht geloggt werden (z.B. von Deiner eigenen Domain), verwende etwas in der Art:

SetEnvIfNoCase Referer "www.mydomain.com" dontlog


2 Links

7 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: rubo77

[QUOTE]
SetEnvIfNoCase Request_URI “.(gif)|(jpg)|(png)|(css)|(js)|(ico)|(eot)$” dontlog
[/QUOTE]
das funktioniert zwar (auch für Grossbuchstaben .GIF,...), aber die Klammern sind falsch gesetzt. daher filtert das zu viel raus:
meiner ansicht nach würde das auch dateien wie z.b.
mein_gif_script.php
rausfiltern

besser ist z.b.

SetEnvIfNoCase Request_URI "(.gif|.jpe?g|.png|.css|.js|.ico|.eot|.otf)$|/style.php" dontlog

das filtert sogar die datei "style.php"


Von: rubo77

Das Forum löscht hier ja die backslashes!!!

da muss vor jedem punkt und slash ein Backslash stehen!
also statt
style.php
muss da stehen
_backslash_/style_backslash_.php

ich versuch das nochmal zu posten, vielleicht geht's so:
SetEnvIfNoCase Request_URI "(\.gif|\.jpe?g|\.png|\.css|\.js|\.ico|\.eot|\.otf)$|\/style.php" dontlog


Von: rubo77

ja, geht, aber auch am ende bei style noch:

SetEnvIfNoCase Request_URI "(\.gif|\.jpe?g|\.png|\.css|\.js|\.ico|\.eot|\.otf)$|\/style\.php" dontlog


Von: Lunatic

Ich möchte eine einfach nur bestimmte IP global nicht loggen und habe folgendes der apache2.conf (Ubuntu 14) hinzugefügt:


SetEnvIf Remote_Addr "a.b.c.d" dontlogCustomLog ${APACHE_LOG_DIR}/Global-access_log combined env=!dontlog


Trotzdem taucht a.b.c.d im Global-access_log auf. Jemand eine Idee?


Von: Lunatic

Ich möchte eine einfach nur bestimmte IP global nicht loggen und habe folgendes der apache2.conf (Ubuntu 14) hinzugefügt:


SetEnvIf Remote_Addr "a.b.c.d" dontlogCustomLog ${APACHE_LOG_DIR}/Global-access_log combined env=!dontlog


Trotzdem taucht a.b.c.d im Global-access_log auf. Jemand eine Idee?


Von: bajowar

Als Newcomer habe ich grosse Schwierigkeiten, obige Anleitung zu verstehen.


1.Wo bzw. in welcher Datei muss ich diese Angabe speichern : "SetEnvIf Remote_Addr "192.168.0.xxx" dontlog"


2.Den Eintrag "CustomLog /var/log/apache2/access.log combined" finde ich nicht und somit ist die Vervollständigung mit "env=!dontlog"für mich nicht nachvollziehbar.


Ich benutze RaspberryPi 2. Er läuft als Webserver und beim Administrieren entstehen hunderte von Einträgen mit meiner IP. Über Hilfe würde ich mich sehr freuen!


Von: bajowar



Ich bitte als Newcomer um Hilfe. In meinem Raspberry Pi, der als Webserver läuft, entstehen beim Administrieren hunderte von Einträgen in der access.log. Alle Aufrufe, die von meiner lokalen IP-Adresse kommen sollen nicht eingetragen werden. Ich bin nun auf die Anleitung in diesem Link gekommen und habe Probleme beim Einrichten:


https://www.howtoforge.de/anleitung/wie-konfiguriere-ich-apache-damit-bestimmte-zugriffe-nicht-im-access-log-vermerkt-werden/


In welcher Datei soll nun dieser Ausdruck gespeichert werden: SetEnvIf Remote_Addr "192.168.0.127" dontlog (das Modul „mod_setenvif“ ist auf meinem Rechner nicht vorhanden)


Wo finde ich die CustomLog Direktive? In der apache2.conf ist dieser Eintrag nicht vorhanden: CustomLog  /var/log/apache2/access.log combined