Chrome se recusa a executar um script AJAX devido a um tipo MIME errado

146

Estou tentando acessar um script como JSON via AJAX, que funciona bem no Safari e em outros navegadores, mas infelizmente não será executado no Chrome. Está vindo com o seguinte erro:

Recusou-se a executar o script a partir de '*' porque seu tipo MIME ('application / json') não é executável e a verificação estrita do tipo MIME está ativada.

Aqui está o pedido:

$.ajax({
    url: "http://some_url/test.json?callback=?",
    type: "GET",
    dataType: 'json',
    cache: true,
    success: function (data, status, error) {
      console.log('success', data);
    },
    error: function (data, status, error) {
      console.log('error', data, status, error);
    }
});

Alguém tem uma solução alternativa para isso?

Paul Nelligan
fonte
2
Então, qual é esse recurso? Um script JSONP ou um arquivo JSON? Seu tipo MIME corresponde a isso? Aparentemente não. Não há necessidade de uma solução alternativa, basta corrigi- lo.
Bergi 02/07/2014
remover o retorno de chamada e usando dataType jsonp não corrigir o problema
Paul Nelligan
2
Eu quis dizer, conserte a resposta do servidor .
Bergi 02/07/2014
5
@ Bergi: e se o servidor estiver fora do controle do OP? Talvez ele esteja tentando usar uma API externa como o LinkedIn .
Dan Dascalescu 20/03/2015
2
@ DanDascalescu: Ele deve relatar isso como um bug, porque torna a API inutilizável. Enquanto espera que isso seja corrigido, ele pode usar um proxy que altera o tipo ou o conteúdo MIME.
Bergi 21/03/2015

Respostas:

70

Ao incluir um argumento de retorno de chamada, você está dizendo ao jQuery que deseja fazer uma solicitação para JSONP usando um elemento de script em vez de uma solicitação para JSON usando XMLHttpRequest.

JSONP não é JSON. É um programa JavaScript.

Altere seu servidor para que ele produz o tipo MIME correto para JSONP, que é application/javascript.

(Enquanto você está nisso, pare de dizer ao jQuery que você está esperando o JSON, pois isso é contraditório:) dataType: 'jsonp'.

Quentin
fonte
1
Eu tenho que usar ajax entre dois sites. Guie-me sobre eles que você está falando para definir "Altere seu servidor para que ele produz o tipo MIME correto para JSONP, que é application / javascript". Como fazer thi
Taimoor Changaiz
@ TaimoorChangaiz - Eu não posso te dizer isso. Se você estiver gerando arquivos estáticos, isso depende do servidor que você está usando. Se você está gerando dinamicamente o conteúdo, isso depende da linguagem de programação (e possivelmente da estrutura) que você está usando. Tente fazer uma pergunta que descreva o que você tem até agora e exatamente onde está preso.
Quentin
obrigado parceiro. Btw eu descobri questão. Eu estava usando arquivos dinâmicos
Taimoor Changaiz 16/12
20
"Alterar seu servidor" não funcionará se você estiver tentando usar uma API externa como o LinkedIn .
Dan Dascalescu 20/03/2015
1
@ Quentin Importa, pois as perguntas devem ser úteis para os outros, não apenas para o OP. Google apontou-me aqui e isso não ajuda o meu caso
Juan Mendes
56

Se o seu servidor ou contêiner proxy adicionar o cabeçalho a seguir ao exibir o arquivo .js, ele forçará alguns navegadores, como o Chrome, a executar uma verificação rigorosa dos tipos MIME:

X-Content-Type-Options: nosniff

Remova este cabeçalho para impedir que o Chrome execute a verificação MIME.

Tom Chamberlain
fonte
14
É uma prática ruim não fornecer o cabeçalho de tipo de conteúdo de recursos veiculados em aplicativos da web. Evitar a detecção de MIME do lado do servidor (usando o X-Content-Type-Options: nosniffcabeçalho) é uma boa opção para evitar ataques de detecção de conteúdo.
Andrés Morales
Eu tive que adicionar isso como parte de uma auditoria de segurança - agora não sei o que fazer! :-(
James Poulose
11

Para sua informação, tenho o mesmo erro no console do Chrome. Eu pensei que minha função AJAX estava causando isso, mas descomentei meu script minificado de /javascripts/ajax-vanilla.min.jspara /javascripts/ajax-vanilla.js. Mas, na realidade, o arquivo de origem estava em /javascripts/src/ajax-vanilla.js. Então, no Chrome, você está recebendo um erro de tipo MIME ruim, mesmo que o arquivo não possa ser encontrado. Nesse caso, a mensagem de erro é descrita como text/plainum tipo MIME inválido.

Lanti
fonte
1
Muito obrigado! Este foi o meu problema também. Estava no diretório errado.
Ellisan
2
Você me salvou 1 hora hoje campeão! Graças
Beto Aveiga
1

Encontrei esse erro usando o IIS 7.0 com uma página de erro 404 personalizada, embora eu suspeite que isso ocorra com qualquer página 404. O servidor retornou uma resposta html 404 com um tipo de mime text / html que não pôde (corretamente) ser executado.

James Westgate
fonte
Tivemos um problema semelhante, o conteúdo retornado era 302 (porque o usuário não era autenticado) e não possuía nenhum tipo de conteúdo -> não executável.
Pasi Savolainen 31/01
1

Para os usuários de registro e pesquisa do Google , se você é um desenvolvedor do .NET Core, defina os tipos de conteúdo manualmente, porque o valor padrão é nulo ou vazio:

var provider = new FileExtensionContentTypeProvider();
app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = provider
});
VahidN
fonte
0

No meu caso, eu uso

$.getJSON(url, function(json) { ... });

para fazer a solicitação (para a API do Flickr) e recebi o mesmo erro MIME. Como a resposta acima sugerida, adicione o seguinte código:

$.ajaxSetup({ dataType: "jsonp" });

Corrigido o problema e não vejo mais o erro de tipo MIME no console do Chrome.

Daniel
fonte
0

se o aplicativo estiver hospedado no IIS, verifique se o Conteúdo estático está instalado. Painel de controle> Programas> Ativar ou desativar recursos do Windows> Serviços de Informações da Internet> Serviços da World Wide Web> Recursos HTTP comuns> Conteúdo estático.

Eu enfrentei esse problema ao tentar executar um aplicativo existente em uma nova instalação do IIS 10.0

user890255
fonte