Как войти в схему URL (http / https) в Apache?

8

У nginx есть $schemeпеременная, используемая в его log_formatстроках.

%H протокол запроса (например, «HTTP / 1.1»).

Как я могу сделать то же самое с Apache?

Владимир Пантелеев
источник

Ответы:

3

Один из способов сделать это состоит в том, чтобы иметь две условные 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://..."
Владимир Пантелеев
источник
1
Ваши mod_envусилия могут потерпеть неудачу из-за синтаксических ошибок . SetEnvберет свою переменную и значение без знака равенства: SetEnv URL_SCHEME http.
glasz
1
Кроме того, SetEnvIfстрока не работает на Apache <2.4.1, потому что, mod_setenvifочевидно, не имеет доступа к среде ssl . почти сводил меня с ума на 2.2.22.
Glasz
Эта переменная окружения кажется специфичной для mod_ssl. Если вы используете другой модуль, такой как mod_gnutls, у вас его нет.
bortzmeyer
Кроме того, mod_sslпеременная окружения устанавливается только в том случае, если вы явно указали ей сделать это через SSLOptions.
Флориан Брукер
3

По какой-то причине я не смог заставить работать приведенные выше примеры, поэтому нашел другой способ: вы можете добавить 2 правила перезаписи в вашу конфигурацию следующим образом:

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

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

Затем добавьте это в определение LogFormat.

scheme=\"%{SCHEME}e\"
bstokes
источник
3

Поскольку схема URL не доступна напрямую в формате журнала Apache, вы можете зарегистрировать канонический порт (например, 80/443) сервера, обслуживающего запрос, используя% p в качестве альтернативы:

CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Стефан
источник
Как это получило два отката так быстро? В любом случае, это бесполезно, если вы хотите эффективно регистрировать URL-адреса запросов, для которых вам нужна схема протокола URI.
Владимир Пантелеев
Порт указывает на протокол.
фитиль
3

Это работает для меня с 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

Дэвид Колдуэлл
источник
httpd.apache.org/docs/current/mod/mod_rewrite.html документирует эту переменную.
Артем Руссаковский
Где% {VARNAME} x задокументировано, хотя? httpd.apache.org/docs/current/mod/mod_log_config.html не упоминает x переменных. Подтвердил работу, хотя.
Артем Руссаковский
-2

Определите выход журнала и добавьте% H к нему. Это то же самое для Apache.

Итак, вы создаете LogFormatподобное и afaik есть пара, определенная в конфигурации apache по умолчанию.

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

и добавьте имя LogFormat (в данном случае «общего») в конец вашего вызова файла журнала

CustomLog logs/access_log common

Просто посмотрите здесь для получения дополнительной информации о журнале и здесь о различных форматных строках.

Крис
источник
1
Хм ... Я уже посмотрел там. Я сказал в своем вопросе, что %Hне делает то, что мне нужно.
Владимир Пантелеев