¿Cómo registrar el esquema de URL (http / https) en Apache?

8

nginx tiene la $schemevariable utilizable en sus log_formatlíneas.

%H es el protocolo de solicitud (por ejemplo, "HTTP / 1.1").

¿Cómo puedo hacer lo mismo con Apache?

Vladimir Panteleev
fuente

Respuestas:

3

Una forma de hacerlo es tener dos CustomLogdirectivas condicionales , controladas por si la HTTPSvariable está configurada.

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

También he intentado usar SetEnvIfde la siguiente manera, pero no funciona (se registra -):

SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."
Vladimir Panteleev
fuente
1
sus mod_envesfuerzos pueden haber fallado debido a errores sintácticos . SetEnvtoma su variable y valor sin un signo igual: SetEnv URL_SCHEME http.
glasz
1
Además, la SetEnvIflínea no funciona en Apache <2.4.1 porque mod_setenvifaparentemente no tiene acceso al entorno SSL . Casi me volvió loco en 2.2.22.
glasz
Esta variable de entorno parece específica de mod_ssl. Si usa otro módulo, como mod_gnutls, no lo tiene.
bortzmeyer
Además, mod_sslsolo establece la variable de entorno si le dice explícitamente que lo haga a través de SSLOptions.
Florian Brucker
3

Por alguna razón, no pude hacer que los ejemplos anteriores funcionen, así que lo encontré de otra manera: puede agregar 2 reglas de reescritura en su configuración de la siguiente manera:

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

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

Luego agregue esto a su definición de LogFormat.

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

Como el esquema de URL no está disponible directamente en formato de registro apache, puede registrar el puerto canónico (por ejemplo, 80/443) del servidor que atiende la solicitud utilizando% p como alternativa:

CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Stefan
fuente
¿Cómo consiguió esto dos votos a favor tan rápido? De todos modos, esto no es útil si desea registrar efectivamente las URL de las solicitudes, para lo cual necesita el esquema de URI de protocolo.
Vladimir Panteleev
El puerto indica el protocolo.
Wick
3

Esto funciona para mí con Apache 2.4.23:

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

%{varname}xsolo está disponible cuando se carga mod_ssl, consulte: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats

David Caldwell
fuente
httpd.apache.org/docs/current/mod/mod_rewrite.html documenta esta variable.
Artem Russakovskii
¿Dónde está documentado% {VARNAME} x? httpd.apache.org/docs/current/mod/mod_log_config.html no menciona las variables x. Confirmado trabajando sin embargo.
Artem Russakovskii
-2

Defina su salida de registro y agregue% H a ella. Esto es lo mismo para Apache.

Por lo tanto, crea un tipo LogFormatcomo este y afaik hay un par definido en la configuración predeterminada de apache.

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

y agregue el nombre de LogFormat (en este caso "común") al final de su llamada al archivo de registro

CustomLog logs/access_log common

Simplemente busque aquí más información sobre el registro y aquí sobre las diferentes cadenas de formato.

Chris
fuente
1
Um ... ya he buscado allí. Dije en mi pregunta que %Hno hace lo que necesito.
Vladimir Panteleev