RequestHeader con la variable de entorno Apache

13

Tengo Apache configurado como equilibrador de carga. Quería que apache configurara el encabezado X-Fordered-Proto, pero esto no funciona:

RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"

El encabezado se establece en nulo. ¿Alguna idea de por qué?

John Crenshaw
fuente

Respuestas:

15

Tarde pero aún así, he tratado el mismo problema, y ​​esto funcionó para mí:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

La documentación dice:

Cuando la directiva RequestHeader se usa con el argumento agregar, agregar o establecer, se puede usar un cuarto argumento para especificar las condiciones bajo las cuales se tomará la acción. Si la variable de entorno especificada en el argumento env = ... existe (o si la variable de entorno no existe y se especifica env =! ...), la acción especificada por la directiva RequestHeader surtirá efecto. De lo contrario, la directiva no tendrá efecto en la solicitud.

Si bien la variable de entorno HTTPS solo se establece cuando la solicitud se realiza a través de SSL.

iNecas
fuente
3
De acuerdo con en.wikipedia.org/wiki/List_of_HTTP_header_fields, el encabezado debe tener guiones en lugar de guiones bajos: RequestHeader establece X-Fordered-Proto 'https' env = HTTPS Este es también el encabezado que envía el ELB de Amazon.
loevborg
9

No quieres eso; configuraría su encabezado en "HTTP / 1.1" (incluso en una solicitud https), probablemente no sea muy útil para lo que sea que esté pasando.

Tiene diferentes bloques de VirtualHost para http y https; simplemente codifique la RequestHeaderconfiguración en cada uno.

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"
    ...
</VirtualHost>

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>
Shane Madden
fuente
1
Esto todavía no responde a la pregunta de por qué las variables de entorno no funcionan. También quería preservar el puerto y algunos otros valores, algunos de los cuales no pueden codificarse así.
John Crenshaw
3

Puede solucionar esto usando la earlypalabra clave:

RequestHeader set X-Forwarded-Proto "https" early

De lo contrario, puede hacer lo que sugirió John Crenshaw, que es usar en RewriteRulelugar de ProxyPassdirectivas.

docwhat
fuente
1
¿Cómo puedo depurar si Apache realmente está enviando este encabezado?
codecowboy
2

Encontrado la causa. Resulta que es un problema de orden de operaciones. mod_rewrite es responsable de proporcionar estas variables de entorno, pero Apache no lo procesa hasta DESPUÉS de que maneja cualquier solicitud de ProxyPass. Hasta entonces, se establecerá como nulo. La única solución parece ser hacer el proxy a través de mod_rewrite.

Ver http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160

John Crenshaw
fuente