Kubernetes Nginx Ingress HTTP на HTTPS перенаправить через 301 вместо 308? - PullRequest
0 голосов
/ 02 октября 2018

Мы запускаем несколько кластеров k8s в Azure AKS.Служба (блог-призрак) находится за входом Nginx и защищена сертификатом от Letsencrypt.Все это прекрасно работает, но с переадресацией у меня возникают проблемы.

Вход правильно перенаправляет с http://whatever.com на https://whatever.com - проблемачто он делает это, используя редирект 308, который удаляет все мета-посты / страницы каждый раз, когда пользователь открывает страницу с сайта.

Эта проблема приводит к тому, что пользователи разделяют любую страницу сайта в большинстве социальных сетей.получение «Предварительной ссылки» - когда заголовок страницы и мета-просмотр страницы не работают и вместо этого заменяются текстом «308 Permanent Redirect» - который выглядит следующим образом:

enter image description here

Из документов ingress-nginx здесь Я могу видеть, что это предполагаемое поведение (т.е. перенаправление 308), что я считаю не предназначенным, это взаимодействие с социальным обменомсервисы, когда эти сервисы пытаются создать предварительный просмотр страницы.

Хотя проблема будет решена Facebook (или Twitter, и т. д.), указывая по умолчанию прямо на сайт https,В настоящее время у меня нет возможности заставить эти сайты искать в https контент, который будет использоваться для создания превью.

Настройка постоянного перенаправления кода

Я также вижу, что он выглядиткак я должен иметь возможность установить код перенаправления на то, что я хочу (я считаю, что перенаправление 301 позволит Facebook и др.для правильного извлечения мета-фрагмента поста / страницы), документов, найденных здесь .

Проблема заключается в том, что когда я добавляю аннотацию кода перенаправления, как указано:

nginx.ingress.kubernetes.io/permanent-redirect-code: "301"

Я все еще получаю 308 перенаправления на мои ресурсы, несмотря на то, что могу видеть (из моего прокси-сервера kubectl), что аннотация кода перенаправления правильно применена.Для справки, мой полный список аннотаций на моем Ingress выглядит так:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ghost-ingress
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/permanent-redirect-code: "301"

Повторюсь - мой вопрос;Как правильно заставить перенаправить на https через пользовательский код ошибки (в моем случае 301)?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Эти инструкции предназначены для пользователей Azure AKS, но решение для этого решения для ссылок предварительного просмотра Facebook / социальных сетей с постоянным перенаправлением 308, вероятно, будет работать на любом облачном провайдере (хотя это не было проверено) - вы простонеобходимо изменить способ входа / получения учетных данных и т. д.

Спасибо Rico за решение!Так как это проверяется только на Facebook, вы можете или не хотите идти по маршруту приложения ConfigMap (о котором упоминал Рико выше), в этом случае выполняется ручное редактирование ConfigMap вместо использования kubectl apply -f для применения одного сохраненного локально.

  1. Pickup AZ Credentials для вашего cluser (az login)
  2. Примите роль для вашего кластера: az aks get-credentials --resource-group yourGroup --name your-cluster
  3. Просмотрите ваш кластер: az aks browse --resource-group yourGroup --name your-cluster
  4. Перейдите к пространству имен, содержащему ваши контейнеры Ingress nGinx (не бэкэнд-сервисы - хотя они могут быть в том же NS).
  5. В левом меню навигации (чуть выше настроек) найдите вкладку «ConfigMaps» ищелкните по нему.
  6. Отредактируйте элемент «Данные» в YAML и добавьте следующую строку (обратите внимание на кавычки вокруг имени и номера в ключе / значении): "data": { "some-other-setting-here": "false", "http-redirect-code": "301" } Вам потребуется запятая после каждогострока ключ / значение, кроме последней.
  7. Перезапустите POD контроллера nginx, удалив его заставьте SURE вы не удалите развертывание, как я.
  8. Если вы хотите работать продуктивно, вы можете обновить вашу установку nginx (от helm), которая перезапустит / заново создаст контейнер в процессе, используя: helm upgrade ngx-ingress stable/nginx-ingress Где ngx-ingress - имя вашего шлемаустановить.Также обратите внимание, что использование флага '--reuse-values' приведет к сбою обновления (re: https://github.com/helm/helm/issues/4337)
  9. Если вы не знаете имя, которое вы использовали для nginx при первоначальной установке его из Helmвы можете использовать helm list, чтобы найти его.
  10. Наконец, чтобы проверить и убедиться, что ваши Re-Directs используют правильный код ConfigMap, сверните ваш http-сайт с помощью: curl myhttpdomain.com Вы должны получить что-то вроде этого:

`` `

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.15.3</center>
</body>
</html>

` ``

Здесь важно отметить, что если вы вносите изменения в 301, перенаправьтепопытайтесь исправить ссылку предварительного просмотра для Facebook или одного из других свойств социальных сетей (твиттер и т. д.), тогда, по всей вероятности, это не исправит никакой ссылки на любую страницу / пост, на который вы уже ссылались - по крайней мере, не сразу.

Все социальные свойства используют интенсивное кэширование, чтобы ограничить использование своих ресурсов, но вы можете проверить, исправляет ли это выше проблему с ссылкой для предварительного просмотра, ссылаясь на НОВУЮ страницу / сообщение, на которое вы ранее не ссылалисьed.

Будьте осведомлены о последствиях для 'POST'

Таким образом, основная причина, по которой nginx-ingress использует код 308, заключается в том, что он сохраняет "тело" / полезную нагрузку в тех случаях, когда вы находитесьотправка запроса POST (в отличие от обычной ссылки GET-запроса, которую вы делаете с помощью браузера и т. д.).

Для меня это не было проблемой, но если вы по какой-либо причине отправляете сообщение по адресу http и ожидаете, что оно будет перенаправлено без проблем, что, вероятно, не будет работать - после того, как вы переключитесь на перенаправление 301, обсуждаемое всообщение.

ОДНАКО, если вы не ожидаете бесшовного перенаправления при отправке запросов POST (я думаю, что большинство людей, вероятно, нет, я знаю, что нет), то я думаю, что это лучший способ исправить Facebook308 Постоянное поведение перенаправления.

0 голосов
/ 03 октября 2018

Я предполагаю, что тени перенаправления TLS аннотации nginx.ingress.kubernetes.io/permanent-redirect-code.

На самом деле вы можете изменить ConfigMap для вашего nginx-configuration так, чтобы перенаправление по умолчанию было 301. Это конфигурация, которую ваш входной контроллер nginx использует для самого nginx.ConfigMap выглядит следующим образом:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  name: nginx-configuration
  namespace: ingress-nginx
data:
  use-proxy-protocol: "true"
  http-redirect-code: "301"

Подробнее о ConfigMap options можно узнать здесь .Обратите внимание, что если вы измените ConfigMap, вам придется перезапустить ваш модуль nginx-ingress-controller.

Вы также можете зайти в модуль nginx-ingress-controller и посмотреть фактические конфигурации nginx, которые создает контроллер:

kubectl -n ingress-nginx exec -it nginx-ingress-controller-xxxxxxxxxx-xxxxx bash
www-data@nginx-ingress-controller-xxxxxxxxx-xxxxx:/etc/nginx$ cat /etc/nginx/nginx.conf
...