【问题标题】:Nginx Ingress service call initiated in the backend service not redirect to https在后端服务中发起的 Nginx Ingress 服务调用未重定向到 https
【发布时间】:2019-05-20 09:24:02
【问题描述】:

我遇到了来自后端发起的呼叫的 https 重定向问题。我有一个具有以下设置的 Nginx 入口控制器:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: ingress-sample
    annotations:
      kubernetes.io/ingress.class: "nginx"
      nginx.ingress.kubernetes.io/affinity: cookie
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
    rules:
    - http:
        paths:
        - path: /
          backend:
            serviceName: sample
            servicePort: 8080

当客户端通过浏览器访问页面时,它工作正常 - 它使用 https 与负载均衡器联系,并且从负载均衡器到集群中 pod 的流量使用 HTTP(因此 SSL 在 LB 级别终止,并且客户端是强制使用 HTTPS)。 但是,当我尝试从我的 Java 应用程序调用使用 HTTP 的 URL(就像客户端正在做的那样)时,我希望被自动重定向到 HTTPS。我收到正确的响应(308 永久重定向),但我的呼叫不会自动转移到 https。是否缺少一些注释?

【问题讨论】:

    标签: azure kubernetes kubernetes-ingress nginx-ingress azure-aks


    【解决方案1】:

    在我的 Java 应用程序中,我使用的是 Apache Http Client 4.5.5 版。此客户端使用处理重定向的 DefaultRedirectStrategy 类。我检查了实现,在这个版本中它不处理代码 308(不重定向)。因为我不想更改应用程序代码中的任何内容,所以我发现可以更改 Nginx 使用的重定向代码。可以通过ConfigMap实现:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        app: nginx-ingress
        chart: nginx-ingress-0.17.1
        component: "controller"
        heritage: Tiller
        release: sample-nginx
      name: sample-ingress-controller
    data:
      http-redirect-code: "301"
    

    4.5.5 版中的 Apache Http 客户端使用 301 响应代码进行重定向,因此现在一切正常。最近还有一个提交给 Apache Http Client repo,它处理 308 响应代码的方式与 301 相同。

    【讨论】:

      【解决方案2】:

      不,我不是 java 专家,但我想你的 java 应用程序不遵循重定向(因为你得到 308 永久重定向),特别是因为你确认这在浏览器中有效。试试这样的:

      https://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/
      URLConnection Doesn't Follow Redirect

      【讨论】:

      • 我现在无法更改应用程序。我想弄清楚如何通过 Nginx 来完成。
      • 它做到了。如果您的应用程序不遵循重定向,则 nginx 不能做任何事情。它使用 HTTP 协议运行。它根据协议做所有事情。你不能通过入口来实现,你可以通过服务来实现,只需将端口 80 转发到 443,但你会失去 ssl 终止
      • 代理不能这样做?
      • 就像我说的,入口正在发出一个 http 重定向返回码,它的调用者(在这种情况下是 java 应用程序)有责任兑现返回码。如果应用程序不支持它,nginx 无能为力。 developer.mozilla.org/en-US/docs/Web/HTTP/Redirections
      • 是否可以定义自定义重定向代码?而不是 308?
      猜你喜欢
      • 2021-11-09
      • 2019-03-04
      • 2013-09-06
      • 2017-06-19
      • 2022-06-21
      • 2017-05-16
      • 2019-05-30
      • 2021-10-26
      • 2021-10-26
      相关资源
      最近更新 更多