web-dev-qa-db-ja.com

Apache環境変数を使用したRequestHeader

Apacheをロードバランサーとして設定しています。 ApacheにX-Forwarded-Protoヘッダーを設定させたいのですが、これは機能しません。

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

ヘッダーはnullに設定されます。なぜだろう?

13
John Crenshaw

原因を見つけました。それは操作の順序の問題であることがわかりました。 mod_rewriteはこれらの環境変数を提供する役割を果たしますが、Apacheは、ProxyPass要求を処理した後まで処理しません。それまでは、nullを設定するだけです。唯一の回避策は、mod_rewriteを介してプロキシを行うことです。

参照 http://www.gossamer-threads.com/lists/Apache/users/267160?do=post_view_threaded#26716

2
John Crenshaw

遅いが、それでも、私は同じ問題を扱っただけで、これは私にとってはうまくいった:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

documentation はこう言っています:

RequestHeaderディレクティブをadd、append、またはset引数と共に使用する場合、4番目の引数を使用して、アクションが実行される条件を指定できます。 env = ...引数で指定された環境変数が存在する場合(または環境変数が存在せず、env =!...が指定されている場合)、RequestHeaderディレクティブで指定されたアクションが有効になります。それ以外の場合、ディレクティブはリクエストに影響を与えません。

HTTPS環境変数は、リクエストがSSLを介して行われた場合にのみ設定されます。

15
iNecas

あなたはそれを望まない。ヘッダーを "HTTP/1.1"に設定します(httpsリクエストでも)-おそらく、あなたが渡そうとしているものにはあまり役に立たないでしょう。

Httpとhttpsに異なるVirtualHostブロックがあります。それぞれのRequestHeader設定をハードコードするだけです。

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

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>
9
Shane Madden

early キーワードを使用してこれを修正できます:

RequestHeader set X-Forwarded-Proto "https" early

それ以外の場合は、RewriteRuleディレクティブの代わりにProxyPassを使用して、John Crenshawが提案したことを実行できます。

3
docwhat