Wie protokolliere ich das URL-Schema (http / https) in Apache?

8

nginx hat die $schemein seinen log_formatZeilen verwendbare Variable .

%H ist das Anforderungsprotokoll (zB "HTTP / 1.1").

Wie kann ich dasselbe mit Apache machen?

Vladimir Panteleev
quelle

Antworten:

3

Eine Möglichkeit besteht darin, zwei bedingte CustomLogAnweisungen zu haben, die davon abhängen, ob die HTTPSVariable gesetzt ist.

CustomLog logs/access.log "https://..." env=HTTPS
CustomLog logs/access.log "http://..." env=!HTTPS

Ich habe auch versucht, SetEnvIfauf folgende Weise zu verwenden, aber es funktioniert nicht (es protokolliert -):

SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."
Vladimir Panteleev
quelle
1
Ihre mod_envBemühungen sind möglicherweise aufgrund von syntaktischen Fehlern gescheitert . SetEnvnimmt seine Variable und seinen Wert ohne Gleichheitszeichen : SetEnv URL_SCHEME http.
Glasz
1
Außerdem SetEnvIffunktioniert die Zeile unter Apache <2.4.1 nicht, da mod_setenvifanscheinend kein Zugriff auf die SSL-Umgebung besteht . hätte mich am 2.2.22 fast verrückt gemacht.
Glasz
Diese Umgebungsvariable scheint spezifisch für mod_ssl zu sein. Wenn Sie ein anderes Modul wie mod_gnutls verwenden, haben Sie es nicht.
Bortzmeyer
Außerdem mod_sslsetzt nur den Umgebungsvariable , wenn Sie explizit sagen , dies zu tun, über SSLOptions.
Florian Brucker
3

Aus irgendeinem Grund konnte ich die obigen Beispiele nicht zum Laufen bringen, also habe ich einen anderen Weg gefunden: Sie können Ihrer Konfiguration zwei Umschreiberegeln wie folgt hinzufügen:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [E=SCHEME:HTTP]

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [E=SCHEME:HTTPS]

Fügen Sie dies dann Ihrer LogFormat-Definition hinzu.

scheme=\"%{SCHEME}e\"
bstokes
quelle
3

Da das URL-Schema im Apache-Protokollformat nicht direkt verfügbar ist, können Sie den kanonischen Port (z. B. 80/443) des Servers, der die Anforderung bedient, protokollieren, indem Sie alternativ% p verwenden:

CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Stefan
quelle
Wie kam es so schnell zu zwei positiven Stimmen? Dies ist jedoch nicht sinnvoll, wenn Sie die URLs von Anforderungen, für die Sie das Protokoll-URI-Schema benötigen, effektiv protokollieren möchten.
Vladimir Panteleev
Der Port gibt das Protokoll an.
Wick
3

Dies funktioniert bei mir mit Apache 2.4.23:

LogFormat "%{REQUEST_SCHEME}x ..." my_log_format

%{varname}xist nur verfügbar, wenn mod_ssl geladen ist, siehe: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats

David Caldwell
quelle
httpd.apache.org/docs/current/mod/mod_rewrite.html dokumentiert diese Variable.
Artem Russakovskii
Wo ist% {VARNAME} x dokumentiert? httpd.apache.org/docs/current/mod/mod_log_config.html erwähnt keine x-Variablen. Bestätigtes Arbeiten.
Artem Russakovskii
-2

Definieren Sie Ihre Protokollausgabe und fügen Sie% H hinzu. Dies gilt auch für Apache.

Sie erstellen also eine LogFormatsolche und afaik gibt es ein paar in der Standard-Apache-Konfiguration definiert.

LogFormat "%h %l %u %t \"%r\" %>s %b" common

und fügen Sie den Namen des LogFormat (in diesem Fall "common") am Ende Ihres Logfile-Aufrufs hinzu

CustomLog logs/access_log common

Suchen Sie hier nach weiteren Informationen zum Protokoll und hier nach den verschiedenen Formatzeichenfolgen.

Chris
quelle
1
Ähm ... ich habe schon dort gesucht. Ich habe in meiner Frage angegeben, dass %Hdas nicht das tut, was ich brauche.
Vladimir Panteleev