【问题标题】:Google Cloud Run for Anthos (Knative) not setting X-Forwarded-Proto header correctly on https requestsGoogle Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头
【发布时间】:2020-11-26 14:42:41
【问题描述】:

我有一个 django 应用程序在谷歌云中运行(在 Kube 集群中),通过 uwsgi 服务的 Docker(但我已经尝试过 manage.py runserver 并且它是相同的)。默认情况下,云运行接受 http 和 https 上的连接。

我想将用户重定向到 https 版本,但 cloud run 没有正确设置标头。

我有一个处理程序,它通过以下方式返回标头:json.dumps(request.headers.__dict__['_store'])

并且返回的相关标头是:

"x-forwarded-proto": ["X-Forwarded-Proto", "http"]

但即使我访问 https 版本的网站,http 的值也不会改变。

django 应该如何正确检测云上运行的 http 请求?我无法使用

SECURE_PROXY_SSL_HEADER

检测http请求并将其重定向到https,因为它们似乎都是http请求,因此您最终会陷入重定向循环。

但是,如果我点击这篇文章中的链接:https://www.jhanley.com/google-cloud-run-https-part-2/

到他们的“显示标题”链接,该值确实从 http 更改为 https。这是一个django的东西吗?还是“在 kube 上运行云”的东西?

在纯云上托管有问题的应用程序并访问 http 版本会内部重定向到 HTTPS 版本并给出原因:Non-Authoritative-Reason: HSTS

这正是我想要实现的目标。我得到的标头似乎来自内部路由,而不是在 Anthos 模式下运行时的原始请求本身。

【问题讨论】:

    标签: python django docker google-cloud-platform google-cloud-run


    【解决方案1】:

    article you linked 似乎与“Cloud Run(完全托管)”有关,但您没有使用它。 Cloud Run for Anthos (Knative) 有一个完全不同的堆栈来处理请求和 HTTPS 终止。所以请忽略。


    以下是如何使用由 Knative 管理的 TLS 证书(由 Let's Encrypt 颁发)创建域并执行 HTTP→ HTTPS 重定向。

    此过程在 Cloud Run 官方文档中有说明:https://cloud.google.com/run/docs/gke/managed-tls

    1. 确保您的集群是 1.17.7-gke.15 及更高版本。这些版本默认启用“托管证书”功能。

    2. 为您的服务创建域映射。 (您可以在 Cloud Console 上执行此操作)

    3. 将您域的 DNS 记录指向给您的 IP 地址(可以在 gke-system Kubernetes 命名空间中找到的网关 IP 服务)

    4. 将在后台为您的域自动配置 TLS 证书(并将每 80 天左右更新一次)

    5. 要设置 HTTP→HTTPS 重定向,follow these instructions 需要您运行:

      kubectl annotate domainmappings [YOUR_DOMAIN] domains.cloudrun.com/httpsRedirect=Enabled
      

      这基本上是在 Kubernetes 中为 DomainMapping 对象添加注释。

      这会将集群中的入口网关配置为为您执行重定向。 您无需阅读x-forwarded-proto 标头并采取行动。

    【讨论】:

    • 我已经阅读了很多文档页面,但不知何故我错过了那个页面。谢谢!
    【解决方案2】:

    这个问题是已知的,我在几个月前报告了它。您可以在 Google Cloud Run for Anthos 问题跟踪器上跟踪它here

    我为这个问题找到的解决方法是使用 JavaScript 在前端进行重定向,方法是检查 window.location.protocol 的值是否为 http 并重写位置:

    window.location = "https://" + window.location.hostname + window.location.pathname + window.location.search;
    
    

    【讨论】:

    • 我接受了另一个答案,因为它将解决问题,但感谢您的建议。
    猜你喜欢
    • 2020-05-20
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多