Por que o REMOTE_ADDR está disponível apenas como uma variável de ambiente do Apache?

4

Para evitar a necessidade de analisar X-Forwarded-For no Varnish, estou tentando apenas definir um cabeçalho no terminador SSL (atualmente Apache) que armazena o IP do cliente direto em um cabeçalho.

Na nossa máquina de desenvolvimento, isso funciona:

RequestHeader set X-Foo %{REMOTE_ADDR}e

No entanto, na preparação, não. Especificamente, o cabeçalho está vazio, conforme ilustrado por ambos os varnishlog :

13 TxHeader     b X-Foo: (null)

(Na máquina de desenvolvimento, isso mostra o endereço IP como esperado).

Da mesma forma, a criação de log REMOTE_ADDR mostra que ela parece estar preenchida na máquina dev:

# Config
LogFormat "%{X-Forwarded-For}i %{REMOTE_ADDR}e" combined
CustomLog "/var/log/httpd/access_log" combined

# Log file, staging
<my ip> -

# Log file, development
<my ip> <my ip>

Como a máquina dev é, bem, uma máquina dev, é diferente de várias maneiras; No entanto, não consigo rastrear qual diferença está causando isso. As versões do Apache são as mesmas (2.2.22), e não vejo nada relevante em nenhum dos arquivos de configuração padrão ou /etc/sysconfig/httpd . E o resto do sistema é razoavelmente semelhante, já que eles são construídos a partir da mesma imagem base do CentOS 5.

Eu não posso nem mesmo dizer na documentação do Apache se espera-se que REMOTE_ADDR exista ou não como um ambiente variável , mas funciona claramente em uma máquina, seja pela fluke ou pelo design, e a inconsistência está me enlouquecendo.

    
por Xiong Chiamiov 22.08.2014 / 22:29

2 respostas

3

Examinando as fontes, REMOTE_ADDR é definido apenas para esses manipuladores que vêm com o próprio servidor: mod_proxy_scgi, mod_ext_filter, mod_include, mod_isapi, mod_cgid e mod_cgi (somente eles chamam ap_add_common_vars ) então, de alguma forma, um desses manipuladores está sendo chamado antes de mod_headers ou mod_log_config na sua caixa dev, mas não na caixa de teste. (Você pode ter outros manipuladores.)

Em menos falas técnicas, no documento que você mencionou, diz a mesma coisa:

In addition to all environment variables set within the Apache configuration and passed from the shell, CGI scripts and SSI pages (emphasis mine) are provided with a set of environment variables containing meta-information about the request as required by the CGI specification.

    
por 23.08.2014 / 00:23
1

Se você usar mod_ssl use 's' para obter o valor de uma variável (trabalhando no apache 2.4). Este é um exemplo para definir o cabeçalho X-Forwarded-For como REMOTE_ADDR.

RequestHeader setifempty x-forwarded-for %{REMOTE_ADDR}s

Mais informações sobre mod_headers.

    
por 23.11.2014 / 11:52

Tags