RequestHeader avec la variable d'environnement Apache

13

J'ai installé Apache comme équilibreur de charge. Je voulais que Apache définisse l'en-tête X-Forwarded-Proto, mais cela ne fonctionne pas:

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

L'en-tête est défini sur null. Une idée pourquoi?

John Crenshaw
la source

Réponses:

15

Tard mais quand même, je viens de traiter le même problème, et cela a fonctionné pour moi:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

La documentation dit:

Lorsque la directive RequestHeader est utilisée avec l'argument add, append ou set, un quatrième argument peut être utilisé pour spécifier les conditions dans lesquelles l'action sera effectuée. Si la variable d'environnement spécifiée dans l'argument env = ... existe (ou si la variable d'environnement n'existe pas et env =! ... est spécifiée), l'action spécifiée par la directive RequestHeader prendra effet. Sinon, la directive n'aura aucun effet sur la demande.

Alors que la variable d'environnement HTTPS n'est définie que lorsque la demande est effectuée via SSL.

iNecas
la source
3
Selon en.wikipedia.org/wiki/List_of_HTTP_header_fields, l'en-tête devrait avoir des tirets plutôt que des traits de soulignement: RequestHeader set X-Forwarded-Proto 'https' env = HTTPS C'est également l'en-tête que l'ELB d'Amazon envoie.
loevborg du
9

Vous ne voulez pas ça; il définirait votre en-tête sur "HTTP / 1.1" (même sur une demande https) - probablement pas terriblement utile à tout ce que vous passez.

Vous avez différents blocs VirtualHost pour http et https; il suffit de coder en dur le RequestHeaderparamètre dans chacun.

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

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>
Shane Madden
la source
1
Cela ne répond toujours pas à la question de savoir pourquoi les variables d'environnement ne fonctionnent pas. Je voulais également conserver le port et certaines autres valeurs, dont certaines ne peuvent pas être codées en dur comme ça.
John Crenshaw
3

Vous pouvez résoudre ce problème en utilisant le earlymot clé:

RequestHeader set X-Forwarded-Proto "https" early

Sinon, vous pouvez faire ce que John Crenshaw a suggéré, c'est-à-dire utiliser RewriteRuleau lieu de ProxyPassdirectives.

docwhat
la source
1
Comment puis-je déboguer si apache envoie réellement cet en-tête?
codecowboy
2

J'ai trouvé la cause. Il s'avère que c'est un problème d'ordre des opérations. mod_rewrite est responsable de la fourniture de ces variables d'environnement, mais Apache ne les traite qu'après avoir traité les demandes ProxyPass. Jusque-là, il va simplement mettre null. La seule solution de contournement semble être de faire le proxy via mod_rewrite.

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

John Crenshaw
la source