Chrome se niega a ejecutar un script AJAX debido a un tipo MIME incorrecto

146

Estoy tratando de acceder a un script como JSON a través de AJAX, que funciona bien en Safari y otros navegadores, pero desafortunadamente no se ejecutará en Chrome. Viene con el siguiente error:

Se negó a ejecutar el script desde '*' porque su tipo MIME ('application / json') no es ejecutable, y la verificación estricta del tipo MIME está habilitada.

Aquí está la solicitud:

$.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);
    }
});

¿Alguien tiene una solución para esto?

Paul Nelligan
fuente
2
Entonces, ¿qué es este recurso? ¿Un script JSONP o un archivo JSON? ¿Su tipo MIME coincide con eso? Aparentemente no. No hay necesidad de una solución, solo arréglalo .
Bergi
eliminar la devolución de llamada y usar dataType jsonp no soluciona el problema
Paul Nelligan
2
Quise decir, arreglar la respuesta del servidor .
Bergi
55
@ Bergi: ¿y si el servidor está fuera del control del OP? Tal vez está tratando de usar una API externa como LinkedIn .
Dan Dascalescu
2
@DanDascalescu: Debería informar esto como un error, porque hace que la API sea inutilizable. Mientras espera que esto se solucione, puede usar un proxy que cambie el tipo o contenido de mime.
Bergi

Respuestas:

70

Al agregar un argumento de devolución de llamada, le está diciendo a jQuery que desea realizar una solicitud de JSONP utilizando un elemento de script en lugar de una solicitud de JSON utilizando XMLHttpRequest.

JSONP no es JSON. Es un programa de JavaScript.

Cambie su servidor para que muestre el tipo MIME correcto para JSONP, que es application/javascript.

(Mientras estás en ello, deja de decirle a jQuery que esperas que JSON sea contradictorio:) dataType: 'jsonp'.

Quentin
fuente
1
Tengo que usar ajax entre dos sitios. Guíeme acerca de lo que está hablando para configurar "Cambiar su servidor para que muestre el tipo MIME correcto para JSONP que es aplicación / javascript". Cómo hacer esto
Taimoor Changaiz
@TaimoorChangaiz - No puedo decirte eso. Si está generando archivos estáticos, depende del servidor que esté utilizando. Si está generando dinámicamente el contenido, depende del lenguaje de programación (y posiblemente del marco) que esté utilizando. Intente hacer una pregunta que describa lo que tiene hasta ahora y exactamente dónde está atrapado.
Quentin
gracias amigo. Por cierto, descubrí el problema. Estaba usando archivos dinámicos
Taimoor Changaiz
20
"Cambiar su servidor" no funciona si está intentando utilizar una API externa como LinkedIn .
Dan Dascalescu
1
@Quentin Es importante ya que se supone que las preguntas son útiles para otros, no solo para el OP. Google me señaló aquí y esto no ayuda a mi caso
Juan Mendes
56

Si su servidor proxy o contenedor agrega el siguiente encabezado al servir el archivo .js, obligará a algunos navegadores como Chrome a realizar una comprobación estricta de los tipos MIME:

X-Content-Type-Options: nosniff

Elimine este encabezado para evitar que Chrome realice la verificación MIME.

Tom Chamberlain
fuente
14
Es una mala práctica no proporcionar el encabezado Content-Type de los recursos servidos en las aplicaciones web. Evitar la detección de MIME desde el lado del servidor (usando el X-Content-Type-Options: nosniffencabezado) es una buena opción para evitar ataques de detección de contenido.
Andrés Morales
Tuve que agregar esto como parte de una auditoría de seguridad, ¡ahora no sé qué hacer! :-(
James Poulose
11

FYI, tengo el mismo error de la consola de Chrome. Pensé que mi función AJAX lo causaba, pero descomenté mi script minified de /javascripts/ajax-vanilla.min.jsa /javascripts/ajax-vanilla.js. Pero en realidad el archivo fuente estaba en /javascripts/src/ajax-vanilla.js. Entonces, en Chrome, obtienes un error de tipo MIME incorrecto incluso si no se puede encontrar el archivo. En este caso, el mensaje de error se describe como text/plainun tipo MIME incorrecto.

Lanti
fuente
1
¡Muchas gracias! Este fue mi problema también. Estaba en el directorio equivocado.
Ellisan
2
¡Me salvaste 1 hora hoy campeón! Gracias
Beto Aveiga
1

Encontré este error usando IIS 7.0 con una página de error 404 personalizada, aunque sospecho que esto sucederá con cualquier página 404. El servidor devolvió una respuesta html 404 con un tipo text / html mime que no se pudo ejecutar (correctamente).

James Westgate
fuente
Tuvimos un problema similar, el contenido devuelto era un 302 (porque el usuario no se autenticó) y no tenía ningún tipo de contenido -> no ejecutable.
Pasi Savolainen el
1

Para el registro y los usuarios de búsqueda de Google , si es un desarrollador de .NET Core, debe configurar los tipos de contenido manualmente, porque su valor predeterminado es nulo o vacío:

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

En mi caso, yo uso

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

para hacer la solicitud (a la API de Flickr), y obtuve el mismo error MIME. Como sugiere la respuesta anterior, agregue el siguiente código:

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

Se solucionó el problema y ya no veo el error de tipo MIME en la consola de Chrome.

Daniel
fuente
0

Si la aplicación está alojada en IIS, asegúrese de que el Contenido estático esté instalado. Panel de control> Programas> Activar o desactivar las funciones de Windows> Servicios de información de Internet> Servicios de la World Wide Web> Funciones HTTP comunes> Contenido estático.

Me enfrenté a este problema al intentar ejecutar una aplicación existente en una nueva instalación de IIS 10.0

user890255
fuente