How to log the URL scheme (http / https) in Apache?

nginx has the $scheme variable usable in its log_format lines.

%H is the request protocol (e.g. "HTTP/1.1").

How can I do the same with Apache?


Solution 1:

This works for me with Apache 2.4.23:

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

%{varname}x is only available when mod_ssl is loaded, see: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats

Solution 2:

One way to do it is to have two conditional CustomLog directives, controlled by whether the HTTPS variable is set.

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

I have also tried using SetEnvIf in the following manner, but it doesn't work (it logs -):

SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."

Solution 3:

For some reason I could not get the examples above to work, so found another way: you can add 2 rewrite rules into your configuration as follows:

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

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

Then add this into your LogFormat definition.

scheme=\"%{SCHEME}e\"