带有 Apache 环境变量的 RequestHeader

Joh*_*haw 14 load-balancing http-headers apache-2.2

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

RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"
Run Code Online (Sandbox Code Playgroud)

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

小智 16

迟到了,但我刚刚处理了同样的问题,这对我有用:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS
Run Code Online (Sandbox Code Playgroud)

文件说:

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

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

  • 根据 http://en.wikipedia.org/wiki/List_of_HTTP_header_fields,标头应该有连字符而不是下划线: RequestHeader set X-Forwarded-Proto 'https' env=HTTPS 这也是亚马逊 ELB 发送的标头。 (4认同)

Sha*_*den 10

你不想那样;它会将您的标头设置为“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>
Run Code Online (Sandbox Code Playgroud)

  • 这仍然没有回答为什么环境变量不起作用的问题。我还想保留端口和其他一些值,其中一些不能像这样硬编码。 (2认同)

doc*_*hat 6

您可以使用early关键字修复此问题:

RequestHeader set X-Forwarded-Proto "https" early
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*haw 2

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

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