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

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>

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

Das könnte dich auch interessieren …