X-Forwarded-Proto 为 http 时取消设置 HTTPS 环境变量
Posted
技术标签:
【中文标题】X-Forwarded-Proto 为 http 时取消设置 HTTPS 环境变量【英文标题】:Unset HTTPS environment variable when X-Forwarded-Proto is http 【发布时间】:2016-11-11 13:41:11 【问题描述】:我在我的 Google Cloud Platform HTTP 负载平衡器上设置了端点终止设置,并将 HTTPS 设置为与我的后端通信的协议。
这意味着所有请求,HTTP 或 HTTPS,都是 HTTPS 到 apache。这个问题是HTTPS
环境变量设置为on
,即使X-Forwarded-Proto
设置为http
。
我所有的研究和测试都只指向相反的情况(当X-Forwarded-Proto
是https
时,通过SetEnvIf X-Forwarded-Proto https HTTPS=on
规则将HTTPS
设置为on
)。
但是,当X-Forwarded-Proto
是http
时,我需要取消设置HTTPS
。
我尝试设置SSLOptions -StdEnvVars
以及SetEnvIf
、SetEnv
和UnsetEnv
的许多组合。通过 mod_rewrite 设置它对我来说不是一个选项(我不知道它是否会起作用)。关于关闭StdEnvVars
的一个有趣的注意事项是,即使它关闭,所有与 SSL 相关的变量都消失了,除了 HTTPS
,我可以确认在我的任何配置文件中都没有设置它。
编辑:
我在服务器配置、vhost 和 htaccess 中尝试过的一些指令示例:
SetEnvIf X-Forwarded-Proto http HTTPS=Off
SetEnvIf X-Forwarded-Proto http HTTPS=0
SetEnvIf X-Forwarded-Proto http !HTTPS
SetEnv HTTPS Off
SetEnv HTTPS 0
SetEnv HTTPS
UnsetEnv HTTPS
将这些指令与其他变量一起使用,包括像 foo
这样的测试,效果很好。
【问题讨论】:
您能否展示一些您尝试过的SetEnvIf
、SetEnv
和UnsetEnv
组合,这样我们的答案就不会重复您已经尝试过的实验?
@Castaglia 当然,我更新了我的问题
【参考方案1】:
将这些指令与其他变量一起使用,包括像 foo 这样的测试,效果很好。
首先只是一个想法(如果有人有更好的想法,很高兴收回)
https://cloud.google.com/compute/docs/load-balancing/http/ 说:目标代理
Target proxies 终止来自客户端的 HTTP(S) 连接,并且 被一个或多个全局转发规则引用并路由 对 URL 映射的传入请求。
代理设置 HTTP 请求/响应标头如下:
通过:1.1 google
(请求和响应)X-Forwarded-Proto: [http | https]
(仅限请求)X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>
(仅限请求) 可以是逗号分隔的 IP 地址列表,具体取决于客户端所在的中介附加的 X-Forwarded-For 条目 穿越。部分中的第一个元素 显示原始地址。
问题是在哪里设置。如果在 apache 配置文件中,您可以更改配置。如果设置在其他地方,你需要找出在哪里。
The TargetHttpsProxies resource 也没有列出任何改变它的方法。那么您如何发布导致上述行为的配置文件?
【讨论】:
以上是关于X-Forwarded-Proto 为 http 时取消设置 HTTPS 环境变量的主要内容,如果未能解决你的问题,请参考以下文章
什么是X-Forwarded-Proto HTTP标头的完整规范?
.htaccess 中的 apache HTTP:X-Forwarded-Proto 导致开发环境中的重定向循环
Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头