잘못된 MIME 유형으로 인해 Chrome에서 AJAX 스크립트 실행을 거부 함


146

AJAX를 통해 JSON으로 스크립트에 액세스하려고합니다 .AJAX는 Safari 및 기타 브라우저에서 잘 작동하지만 불행히도 Chrome에서는 실행되지 않습니다. 다음과 같은 오류가 발생합니다.

MIME 유형 ( 'application / json')이 실행 가능하지 않고 엄격한 MIME 유형 검사가 사용 가능하므로 '*'에서 스크립트 실행을 거부했습니다.

요청은 다음과 같습니다.

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

누구든지 이것에 대한 해결 방법이 있습니까?


2
이 자원은 무엇입니까? JSONP 스크립트 또는 JSON 파일? MIME 형식이 일치합니까? 분명히 아닙니다. 해결 방법이 필요하지 않습니다 . 해결 하십시오.
Bergi

콜백을 제거하고 dataType jsonp를 사용해도 문제가 해결되지 않습니다.
Paul Nelligan

2
나는 의미 해결 서버 응답을 .
Bergi

5
@ Bergi : 서버가 OP의 통제 범위를 벗어나면 어떻게됩니까? 그는 LinkedIn과 같은 외부 API 를 사용하려고합니다 .
Dan Dascalescu 23.16에

2
@ DanDascalescu : API를 사용할 수 없기 때문에 버그로보고해야합니다. 이 문제가 해결되기를 기다리는 동안 MIME 유형이나 내용을 변경 하는 프록시 를 사용할 수 있습니다 .
Bergi

답변:


70

콜백 인수를 추가하면 jQuery에 XMLHttpRequest를 사용하는 JSON 요청 대신 스크립트 요소를 사용하여 JSONP를 요청한다고 알립니다.

JSONP는 JSON이 아닙니다. JavaScript 프로그램입니다.

JSONP에 적합한 MIME 유형을 출력하도록 서버를 변경하십시오 application/javascript.

(당신이 그것에있는 동안 jQuery에게 JSON을 기대한다고 말하지 마십시오 dataType: 'jsonp'.)


1
두 사이트간에 아약스를 사용해야합니다. "서버를 변경하여 응용 프로그램 / 자바 스크립트 인 JSONP에 적합한 MIME 유형을 출력하도록"서버를 설정하십시오. 어떻게 생을 할 수
Taimoor Changaiz

@TaimoorChangaiz — 말할 수 없습니다. 정적 파일을 생성하는 경우 사용중인 서버에 따라 다릅니다. 컨텐츠를 동적으로 생성하는 경우 사용중인 프로그래밍 언어 (및 가능한 프레임 워크)에 따라 다릅니다. 지금까지 가지고있는 것과 정확히 어디에 붙어 있는지 설명 하는 질문 을 하십시오 .
Quentin

고마워 친구. Btw 나는 문제를 알아 냈습니다. 나는 동적 파일을 사용하고 있었다
Taimoor Changaiz을

20
LinkedIn과 같은 외부 API 를 사용하려고하면 "서버 변경"이 작동하지 않습니다 .
Dan Dascalescu 23.15에

1
@Quentin 문제는 OP뿐만 아니라 다른 사람들에게도 도움이 될 것이기 때문에 중요합니다. 구글이 여기에 나를 지적하고 이것은 내 사건을 도움이되지 않습니다
Juan Mendes

56

프록시 서버 또는 컨테이너가 .js 파일을 제공 할 때 다음 헤더를 추가하면 Chrome과 같은 일부 브라우저가 MIME 유형을 엄격하게 검사하도록합니다.

X-Content-Type-Options: nosniff

Chrome에서 MIME 확인을 수행하지 못하게하려면이 헤더를 제거하십시오.


14
웹 응용 프로그램에서 제공되는 리소스의 Content-Type 헤더를 제공하지 않는 것은 좋지 않습니다. X-Content-Type-Options: nosniff헤더를 사용하여 서버 측에서 MIME 스니핑을 피하는 것은 컨텐츠 스니핑 공격을 방지하는 좋은 옵션입니다.
Andrés Morales

보안 감사의 일환으로 이것을 추가해야했습니다. 이제 무엇을해야할지 모르겠습니다 !! :-(
James Poulose 20:02에

11

참고로, Chrome 콘솔에서 동일한 오류가 발생했습니다. 내 AJAX 함수가 원인이라고 생각했지만 축소 된 스크립트의에서 주석을 해제 /javascripts/ajax-vanilla.min.js했습니다 /javascripts/ajax-vanilla.js. 그러나 실제로 소스 파일은에있었습니다 /javascripts/src/ajax-vanilla.js. 따라서 Chrome에서는 파일을 찾을 수 없어도 잘못된 MIME 유형 오류가 발생합니다. 이 경우 오류 메시지는 text/plain잘못된 MIME 유형으로 설명됩니다 .


1
정말 고마워! 이것은 내 문제이기도했다. 잘못된 디렉토리에있었습니다.
엘리 자신

2
당신은 오늘 1 시간 챔피언을 구했습니다! 감사합니다
Beto Aveiga

1

IIS 7.0을 사용자 지정 404 오류 페이지와 함께 사용하면이 오류가 발생했지만 404 페이지에서이 오류가 발생한다고 생각합니다. 서버는 text / html mime 유형을 가진 html 404 응답을 (올바르게) 실행할 수없는 것으로 반환했습니다.


우리는 비슷한 문제가 있었고 반환 된 컨텐츠는 302 (사용자가 인증되지 않았기 때문에)였으며 컨텐츠 유형이 전혀 없었습니다.
Pasi Savolainen

1

레코드 및 Google 검색 사용자 의 경우 .NET Core 개발자 인 경우 기본값이 null이거나 비어 있으므로 컨텐츠 유형을 수동으로 설정해야합니다.

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

0

내 경우에는

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

Flickr의 API에 대한 요청을하기 위해 동일한 MIME 오류가 발생했습니다. 위의 제안과 같이 다음 코드를 추가하십시오.

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

문제를 해결하고 더 이상 Chrome 콘솔에 MIME 유형 오류가 표시되지 않습니다.


0

응용 프로그램이 IIS에서 호스팅되는 경우 정적 콘텐츠가 설치되어 있는지 확인하십시오. 제어판> 프로그램> Windows 기능 설정 또는 해제> 인터넷 정보 서비스> 월드 와이드 웹 서비스> 공통 HTTP 기능> 정적 컨텐츠.

새 IIS 10.0 설치에서 기존 응용 프로그램을 실행하려고 할 때이 문제에 직면했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.