我已将 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