¿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?

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://..."

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\"

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"

¿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



¿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.


1
Um ... ya he buscado allí. Dije en mi pregunta que %Hno hace lo que necesito.
Vladimir Panteleev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.