Erro de conteúdo misto nginx in kubernetes for rails app

9

Implantando o Portus no GCP com um balanceador de carga de ingresso Nginx implementado. Portus carrega muito bem, mas ao tentar usar o aplicativo e preencher alguns dos formulários recebo o seguinte erro:

  

VM798: 1 conteúdo misto: a página em   ' link ' foi carregado por HTTPS,   mas solicitou um ponto de extremidade XMLHttpRequest inseguro   ' link ".   Este pedido foi bloqueado; o conteúdo deve ser veiculado por HTTPS.

Configuração do Nginx: link

Ambiente:

  • Kubernetes no GCP
  • todos os recursos implantados por meio do leme
  • ssl é fornecido por kube-lego
  • aplicativo Rails com gem da API de uva
  • Grape monta a API da seguinte forma: mount API::RootAPI => "/"

Por isso, verifiquei o código para chamadas manuais manuais e não vi nada. E passei um dia tentando cavar docs rails e nginx docs para ver o que faz com que alguns aplicativos sejam carregados corretamente com ssl e a API não siga as mesmas regras

----- Atualização 1 ------ Após uma investigação mais aprofundada, parece que tem algo a ver com o validador Vue. Verificar as ferramentas do desenvolvedor revelou o seguinte:

  

curl   ' link '   -X OPTIONS -H 'Método de Pedido de Controle de Acesso: GET' -H 'Origem: link ' -H 'Access-Control- Cabeçalhos de Solicitação:   x-csrf-token '--compressed

E parece que o URL raiz está sendo chamado aqui:

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

root_url é definido como / como mencionado acima.

No entanto, analisar o código Vue mais próximo revela:

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';

Os parâmetros são configurados para usar SSL na consulta

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
    
por niharvey 28.12.2017 в 06:17
fonte

1 resposta

2

Não sei ao certo como o seu aplicativo funciona e a mecânica de quais dados estão sendo passados, mas suspeito que você precise passar use_ssl=true no parâmetro querystring para o /validate endpoint.

Atualmente, use_ssl=false está sendo transmitido, o que provavelmente está retornando uma resposta não SSL.

    
por grizzthedj 31.12.2017 / 15:05
fonte