【发布时间】:2013-04-09 04:31:48
【问题描述】:
我有一个反向代理,它在外部执行 HTTPS,但在内部执行 HTTP。
这意味着默认情况下,应用内 URL 将使用 HTTP 作为方案,因为这是联系它的方式。
代理如何告诉后端应该使用HTTPS?
【问题讨论】:
标签: https http-headers reverse-proxy
我有一个反向代理,它在外部执行 HTTPS,但在内部执行 HTTP。
这意味着默认情况下,应用内 URL 将使用 HTTP 作为方案,因为这是联系它的方式。
代理如何告诉后端应该使用HTTPS?
【问题讨论】:
标签: https http-headers reverse-proxy
代理可以向它接收的请求添加额外(或覆盖)标头并传递到后端。这些可用于将信息传达给后端。
到目前为止,我已经看到一对用于在 URL 方案中强制使用 https:
X-Forwarded-Protocol: https
X-Forwarded-Ssl: on
X-Url-Scheme: https
而wikipedia 还提到:
# a de facto standard:
X-Forwarded-Proto: https
# Non-standard header used by Microsoft applications and load-balancers:
Front-End-Https: on
这是您应该添加到 apache 上的 VirtualHost 的内容:其他代理应该具有类似的功能
RequestHeader set X-FORWARDED-PROTOCOL https
RequestHeader set X-Forwarded-Ssl on
# etc.
我认为最好将它们全部设置,或者设置一个有效的并删除其他已知的。以防止邪恶的客户与他们纠缠不清。
【讨论】:
我花了几个小时在谷歌上搜索才能找到适合我的环境的神奇设置。我在码头应用服务器和 apache2 http 服务器前面有一个 SSL httpd Apache 反向代理。这个answer 实际上给了我有用的信息。对我来说,添加:
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
到站点 conf 文件足以让目标在响应中构建链接时使用 https 而不是 http 作为协议。我尝试了上面的X-FORWARDED-PROTOCOL,但是没有用。希望这对未来的 Google 搜索有所帮助!
【讨论】: