Вызов службы 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.