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-Protohttps 时,通过SetEnvIf X-Forwarded-Proto https HTTPS=on 规则将HTTPS 设置为on)。

但是,X-Forwarded-Protohttp 时,我需要取消设置HTTPS

我尝试设置SSLOptions -StdEnvVars 以及SetEnvIfSetEnvUnsetEnv 的许多组合。通过 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 这样的测试,效果很好。

【问题讨论】:

您能否展示一些您尝试过的SetEnvIfSetEnvUnsetEnv 组合,这样我们的答案就不会重复您已经尝试过的实验? @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 导致开发环境中的重定向循环

X-Forwarded-Proto 和 Flask

Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头

IIS 等效于“proxy_set_header X-Forwarded-Proto https;”

apache 2.4,嵌套if指令