Wie deaktiviere ich die Apache-Protokollierung beim Zugriff auf bestimmte Verzeichnisse?

7

Wie erhalte ich Apache, um zu verhindern, dass http-Anforderungen auf Verzeichnisbasis protokolliert werden? Ich möchte etwas Ähnliches tun

<IfModule mod_userdir.c>
    UserDir public_html

    <Directory /home/*/public_html/nolog>
        Options NoAccessLog
    </Directory>
</IfModule>
Nidi
quelle

Antworten:

10

Sie können ein Umgebungsflag setzen, wenn eine bestimmte URL angefordert wird, und die Protokollierung basierend darauf filtern:

<IfModule mod_userdir.c> 
    UserDir public_html 

    SetEnvIf Request_URI "/nolog" dontlog
    CustomLog /var/log/apache2/useraccess_log combined env=!dontlog
</IfModule> 

Alle zugehörigen Informationen finden Sie unter http://httpd.apache.org/docs/2.2/env.html Abschnitt "Verwenden von Umgebungsvariablen - Bedingte Protokollierung"

Wenn diese beiden Zeilen eine URL anfordern, die die Zeichenfolge "/ nolog" enthält, wird die Umgebungsvariable dontlog festgelegt.

In der nächsten Zeile weist die Option "env =! Dontlog" die CustomLog-Direktive an, den Clientzugriff zu protokollieren, sofern die Variable dontlog nicht festgelegt ist. Das ! negiert die Richtlinie. Wenn du das verlassen würdest! Damit wird "env = dontlog" angezeigt, als nur der Zugriff auf Pfade protokolliert wird, deren angeforderte URL "/ nolog" enthält.

BEARBEITEN: Ich habe das ^ im regulären Ausdruck "/ nolog" entfernt, um mit Ihrem Beispiel zu arbeiten, und weitere Erklärungen hinzugefügt.

Lukas Loesche
quelle
Funktioniert bei mir nicht - der Zugriff ist noch protokolliert. Können Sie bitte etwas näher darauf eingehen und es in das angegebene mod_userdir-Beispiel integrieren? Vielen Dank!
Nidi
Ok, ich habe meine Antwort aktualisiert, um sie Ihrem Beispiel anzupassen. Grundsätzlich lassen Sie das ^ in der regulären Ausdrücke einfach weg. "^ / nolog" würde nur mit URLs wie example.com/nolog/foobar übereinstimmen, aber da Sie immer zuerst einen Benutzernamen wie example.com/~user/nolog/foobar haben, würde dieser nicht übereinstimmen. Also einfach das ^ entfernen und es sollte funktionieren. Natürlich können Sie diesen regulären Ausdruck weiter optimieren, um die Übereinstimmung des Benutzernamens usw. einzuschließen. Jetzt würde er mit jeder URL übereinstimmen, die die Zeichenfolge "/ nolog" enthält.
Lukas Loesche
Ich hatte Probleme, dies zum Laufen zu bringen (Apache 2.2.3), bevor ich von Graceful zu Apachectl Restart wechselte. Dann hat es gut funktioniert.
Antti Rytsölä