Como registrar o esquema de URL (http / https) no Apache?

8

O nginx tem a $schemevariável utilizável em suas log_formatlinhas.

%H é o protocolo de solicitação (por exemplo, "HTTP / 1.1").

Como posso fazer o mesmo com o Apache?

Vladimir Panteleev
fonte

Respostas:

3

Uma maneira de fazer isso é ter duas CustomLogdiretivas condicionais , controladas se a HTTPSvariável está definida.

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

Também tentei usar SetEnvIfda seguinte maneira, mas não funciona (registra -):

SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."
Vladimir Panteleev
fonte
1
seus mod_envempreendimentos podem ter falhado devido a erros sintáticos . SetEnvleva o seu variável e valor sem um sinal de igual: SetEnv URL_SCHEME http.
glasz
1
Além disso, a SetEnvIflinha não funciona no apache <2.4.1 porque, mod_setenvifaparentemente, não tem acesso ao ambiente ssl . quase me deixou louco em 2.2.22.
glasz
Essa variável de ambiente parece específica para mod_ssl. Se você usar outro módulo, como mod_gnutls, você não o possui.
precisa saber é o seguinte
Além disso, mod_sslapenas define a variável de ambiente se você solicitar explicitamente a fazê-lo via SSLOptions.
Florian Brucker
3

Por alguma razão, não consegui que os exemplos acima funcionassem, então encontrei outra maneira: você pode adicionar 2 regras de reescrita em sua configuração da seguinte maneira:

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

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

Em seguida, adicione isso à sua definição de LogFormat.

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

Como o esquema de URL não está diretamente disponível no formato de log apache, você pode registrar a porta canônica (por exemplo, 80/443) do servidor que atende à solicitação usando% p como alternativa:

CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Stefan
fonte
Como isso conseguiu dois votos positivos tão rapidamente? De qualquer forma, isso não é útil se você deseja registrar efetivamente os URLs das solicitações, para as quais você precisa do esquema de URI do protocolo.
Vladimir Panteleev
A porta indica o protocolo.
Wick
3

Isso funciona para mim com o Apache 2.4.23:

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

%{varname}xestá disponível apenas quando o mod_ssl é carregado, consulte: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats

David Caldwell
fonte
httpd.apache.org/docs/current/mod/mod_rewrite.html documenta essa variável.
Artem Russakovskii
Onde está% {VARNAME} x documentado? httpd.apache.org/docs/current/mod/mod_log_config.html não menciona x variáveis. Trabalho confirmado embora.
Artem Russakovskii
-2

Defina sua saída do log e adicione% H a ela. É o mesmo para o Apache.

Então, você constrói algo LogFormatassim e depois há alguns definidos na configuração padrão do apache.

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

e adicione o nome do LogFormat (neste caso "comum") ao final da sua chamada do arquivo de log

CustomLog logs/access_log common

Basta procurar aqui mais informações sobre o log e aqui sobre as diferentes seqüências de formato.

Chris
fonte
1
Hum ... eu já olhei lá. Afirmei na minha pergunta que %Hnão faz o que eu preciso.
Vladimir Panteleev 13/02/2012