带Apache环境变量的RequestHeader


13

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

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

标头设置为空。知道为什么吗?

Answers:


15

很晚但仍然,我只是处理了同样的问题,这对我有用:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

文件说:

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

HTTPS环境变量仅在通过SSL发出请求时设置。


3
根据en.wikipedia.org/wiki/List_of_HTTP_header_fields,标头应带有连字符而不是下划线:RequestHeader设置X-Forwarded-Proto'https'env = HTTPS这也是Amazon ELB发送的标头。
loevborg 2014年

9

你不想要那个 它将您的标头设置为“ 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>

1
这仍然不能回答为什么环境变量不起作用的问题。我还想保留端口和其他一些值,其中一些不能像这样硬编码。
约翰·克伦肖

3

您可以使用early关键字解决此问题:

RequestHeader set X-Forwarded-Proto "https" early

否则,您可以按照John Crenshaw的建议进行操作,即使用指令RewriteRule代替ProxyPass指令。


1
如何调试apache是​​否实际发送了此标头?
codecowboy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.