在后端服务中启动的Nginx Ingress服务调用未重定向到https

时间:2018-12-19 20:35:48

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

我从后端发起的呼叫重定向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。是否缺少一些注释?

2 个答案:

答案 0 :(得分:0)

不,我不是Java专家,但是我想您的Java应用程序不遵循重定向(因为您将获得308个永久重定向),尤其是因为您确认这在浏览器中有效。尝试这样的事情:

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

答案 1 :(得分:0)

在我的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 Client使用301响应代码进行重定向,因此现在一切正常。最近还提交了对Apache Http Client存储库的提交,该存储库以与301相同的方式处理308响应代码。