Вызов службы Nginx Ingress, инициированный в серверной службе, не перенаправлен на https

У меня проблема с переадресацией https от вызова, инициированного в бэкэнде. У меня есть Nginx Ingress Controller со следующей настройкой:

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 для связи с балансировщиком нагрузки, а трафик от балансировщика нагрузки к модулям в кластере использует HTTP (поэтому SSL завершается на уровне LB, и клиент вынужден использовать HTTPS). Однако, когда я пытаюсь вызвать из моего приложения Java URL, который использует HTTP (как это делает клиент), я ожидаю, что он будет автоматически перенаправлен на HTTPS. Я получаю правильный ответ (308 постоянных перенаправлений), но мой вызов не переносится автоматически на https. Отсутствует ли какая-нибудь аннотация?

2 ответа

Нет , я не эксперт по java, но я полагаю, что ваше java-приложение не выполняет перенаправления (поскольку вы получаете постоянное перенаправление 308), тем более что вы подтвердили, что это работает в браузере. Попробуйте что-то вроде этого:

https://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/
URLConnection не следует за редиректом

В моем 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"

Apache Http Client в версии 4.5.5 выполняет перенаправления с кодом ответа 301, так что теперь все работает нормально. Недавно была также сделана фиксация клиентского репо Apache Http, которая обрабатывает код ответа 308 так же, как 301.

Другие вопросы по тегам