带有 Apache 环境变量的 RequestHeader

带有 Apache 环境变量的 RequestHeader

我已将 Apache 设置为负载均衡器。我想让 Apache 设置 X-Forwarded-Proto 标头,但这不起作用:

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

标头被设置为空。知道原因吗?

答案1

虽然很晚了,但我刚刚处理了同样的问题,这对我有用:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

文档说:

当 RequestHeader 指令与 add、append 或 set 参数一起使用时,可以使用第四个参数来指定执行操作的条件。如果 env=... 参数中指定的环境变量存在(或者如果环境变量不存在且指定了 env=!...),则 RequestHeader 指令指定的操作将生效。否则,该指令对请求不起作用。

而仅当通过 SSL 发出请求时才会设置 HTTPS 环境变量。

答案2

你不希望这样;它会将你的标头设置为“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>

答案3

您可以使用以下方法解决此问题early关键词:

RequestHeader set X-Forwarded-Proto "https" early

否则,您可以按照 John Crenshaw 的建议,使用RewriteRule而不是ProxyPass指令。

答案4

找到原因了。原来是操作顺序问题。mod_rewrite 负责提供这些环境变量,但 Apache 直到处理完任何 ProxyPass 请求后才会处理它。在此之前,它只会设置为空。唯一的解决方法似乎是通过 mod_rewrite 进行代理。

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

相关内容