У nginx есть $scheme
переменная, используемая в его log_format
строках.
%H
протокол запроса (например, «HTTP / 1.1»).
Как я могу сделать то же самое с Apache?
У nginx есть $scheme
переменная, используемая в его log_format
строках.
%H
протокол запроса (например, «HTTP / 1.1»).
Как я могу сделать то же самое с Apache?
Ответы:
Один из способов сделать это состоит в том, чтобы иметь две условные CustomLog
директивы, контролируемые тем, установлена ли HTTPS
переменная.
CustomLog logs/access.log "https://..." env=HTTPS
CustomLog logs/access.log "http://..." env=!HTTPS
Я также попытался использовать SetEnvIf
следующим образом, но он не работает (он регистрирует -
):
SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."
SetEnvIf
строка не работает на Apache <2.4.1, потому что, mod_setenvif
очевидно, не имеет доступа к среде ssl . почти сводил меня с ума на 2.2.22.
mod_ssl
переменная окружения устанавливается только в том случае, если вы явно указали ей сделать это через SSLOptions
.
По какой-то причине я не смог заставить работать приведенные выше примеры, поэтому нашел другой способ: вы можете добавить 2 правила перезаписи в вашу конфигурацию следующим образом:
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [E=SCHEME:HTTP]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [E=SCHEME:HTTPS]
Затем добавьте это в определение LogFormat.
scheme=\"%{SCHEME}e\"
Поскольку схема URL не доступна напрямую в формате журнала Apache, вы можете зарегистрировать канонический порт (например, 80/443) сервера, обслуживающего запрос, используя% p в качестве альтернативы:
CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Это работает для меня с Apache 2.4.23:
LogFormat "%{REQUEST_SCHEME}x ..." my_log_format
%{varname}x
доступно только при загрузке mod_ssl, см .: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats
Определите выход журнала и добавьте% H к нему. Это то же самое для Apache.
Итак, вы создаете LogFormat
подобное и afaik есть пара, определенная в конфигурации apache по умолчанию.
LogFormat "%h %l %u %t \"%r\" %>s %b" common
и добавьте имя LogFormat (в данном случае «общего») в конец вашего вызова файла журнала
CustomLog logs/access_log common
Просто посмотрите здесь для получения дополнительной информации о журнале и здесь о различных форматных строках.
%H
не делает то, что мне нужно.
mod_env
усилия могут потерпеть неудачу из-за синтаксических ошибок .SetEnv
берет свою переменную и значение без знака равенства:SetEnv URL_SCHEME http
.