Смешанное содержимое Ошибка входа nginx в приложение kubernetes for rails

Развертывание Portus в GCP с внедрением балансировщика нагрузки Nginx Ingress. Portus загружается просто отлично, но при попытке использовать приложение и заполнить некоторые формы я получаю следующую ошибку:

VM798: 1 Смешанный контент: страница по адресу https://staging.foo.bar/admin/registries/new была загружена через HTTPS, но запросила небезопасную конечную точку XMLHttpRequest ' http://staging.foo.bar//api/v1/registries/validate?name=devreg&hostname=staging-foo-barregistry%3A5000&external_hostname=&use_ssl=false&force=false&only%5B%5D=hostname'. Этот запрос был заблокирован; содержание должно быть подано через HTTPS.

Конфигурация Nginx: https://github.com/kubic-project/caasp-services/blob/master/contrib/helm-charts/portus/templates/nginx-configmap.yaml

Среда:

  • Кубернетес в GCP
  • все ресурсы развернуты через руль
  • ssl предоставлен kube-lego
  • Приложение Rails с гемом Grape API
  • Виноград устанавливает API следующим образом: mount API::RootAPI => "/"

Поэтому я проверил код для http-вызовов вручную и ничего не увидел. И я провел целый день, пытаясь копаться в rails docs и nginx docs, чтобы увидеть, что заставляет некоторые приложения загружаться должным образом с помощью ssl и API, которые не следуют одним и тем же правилам.

----- Обновление 1 ------ После дальнейшего изучения, похоже, что это как-то связано с Vue validator. Проверка инструментов разработчика показала следующее:

curl ' http://staging.foo.bar//api/v1/registries/validate?name=devreg&hostname=st&external_hostname=&use_ssl=false&force=false&only%5B%5D=name' -X OPTIONS -H 'Access-Control-Request-Request -Метод: GET' -H ' Источник: https://staging.foo.bar/' -H 'Access-Control-Request-Headers: x-csrf-token' --compressed

И похоже, что здесь вызывается корневой URL:

javascript:
      window.API_ROOT_URL = '#{root_url}';

root_url установлен в / как упомянуто выше.

Тем не менее, анализ кода Vue ближе упивается:

Vue.http.options.root = window.API_ROOT_URL;

Vue.http.interceptors.push((_request, next) => {
  window.$.active = window.$.active || 0;
  window.$.active += 1;

  next(() => {
    window.$.active -= 1;
  });
});

Vue.http.interceptors.push((request, next) => {
  if ($.rails) {
    // eslint-disable-next-line no-param-reassign
    request.headers.set('X-CSRF-Token', $.rails.csrfToken());
  }
  next();
});

// we are not a SPA and when user clicks on back/forward
// we want the page to be fully reloaded to take advantage of
// the url query params state
window.onpopstate = function (e) {
  // phantomjs seems to trigger an oppopstate event
  // when visiting pages, e.state is always null and
  // in our component we set an empty string
  if (e.state !== null) {
    window.location.reload();
  }
};

Vue.config.productionTip = process.env.NODE_ENV !== 'production';

Параметры настроены на использование SSL в запросе

params do
          requires :name,
                   using: API::Entities::Registries.documentation.slice(:name)
          requires :hostname,
                   using: API::Entities::Registries.documentation.slice(:hostname)
          optional :external_hostname,
                   using: API::Entities::Registries.documentation.slice(:external_hostname)
          requires :use_ssl,
                   using: API::Entities::Registries.documentation.slice(:use_ssl)
          optional :only, type: Array[String]
        end

1 ответ

Я не уверен в том, как работает ваше приложение, и в каком механизме куда данные передаются, но я подозреваю, что вам, возможно, придется передавать use_ssl=true в параметре querystring к вашему /validate конечная точка.

В настоящее время, use_ssl=false передается, что, вероятно, возвращает ответ не-SSL.

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