Chrome từ chối thực thi tập lệnh AJAX do loại MIME sai


146

Tôi đang cố gắng truy cập tập lệnh dưới dạng JSON thông qua AJAX, hoạt động tốt trên Safari và các trình duyệt khác nhưng không may sẽ không thực thi trong Chrome. Nó đến với lỗi sau:

Từ chối thực thi tập lệnh từ '*' vì loại MIME của nó ('application / json') không thể thực thi được và kiểm tra loại MIME nghiêm ngặt được bật.

Đây là yêu cầu:

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

Có ai có một cách giải quyết cho điều này?


2
Vì vậy, nguồn tài nguyên này là gì? Tập lệnh JSONP hoặc tập tin JSON? Liệu loại MIME của nó phù hợp với điều đó? Rõ ràng là không. Không cần một cách giải quyết, chỉ cần sửa nó.
Bergi

xóa cuộc gọi lại và sử dụng dataType jsonp không khắc phục được sự cố
Paul Nellectan

2
Tôi có nghĩa là, sửa chữa các phản ứng máy chủ .
Bergi

5
@Bergi: nếu máy chủ nằm ngoài tầm kiểm soát của OP thì sao? Có lẽ anh ta đang cố gắng sử dụng một API bên ngoài như LinkedIn .
Dan Dascalescu 20/03/2015

2
@DanDascalescu: Anh ta nên báo cáo đây là một lỗi, vì nó làm cho API không thể sử dụng được. Trong khi chờ đợi điều này được khắc phục, anh ta có thể sử dụng proxy thay đổi loại mime hoặc nội dung.
Bergi

Câu trả lời:


70

Bằng cách thêm một đối số gọi lại, bạn đang nói với jQuery rằng bạn muốn đưa ra yêu cầu cho JSONP bằng cách sử dụng phần tử tập lệnh thay vì yêu cầu JSON bằng XMLHttpRequest.

JSONP không phải là JSON. Đây là một chương trình JavaScript.

Thay đổi máy chủ của bạn để nó xuất ra loại MIME phù hợp cho JSONP application/javascript.

(Trong khi bạn đang ở đó, hãy ngừng nói với jQuery rằng bạn đang mong đợi JSON vì điều đó là mâu thuẫn dataType: 'jsonp':).


1
Tôi đã sử dụng ajax giữa hai trang web. Hướng dẫn cho tôi về họ mà bạn đang nói về việc đặt "Thay đổi máy chủ của bạn để nó xuất ra loại MIME phù hợp cho JSONP là ứng dụng / javascript". Cách làm thi
Taimoor Changaiz 15/12/14

@TaimoorChangaiz - Tôi không thể nói với bạn điều đó. Nếu bạn đang tạo các tệp tĩnh, nó phụ thuộc vào máy chủ bạn đang sử dụng. Nếu bạn đang tự động tạo nội dung, nó phụ thuộc vào ngôn ngữ lập trình (và có thể là khung) mà bạn đang sử dụng. Hãy thử hỏi một câu hỏi mô tả những gì bạn có cho đến nay và chính xác nơi bạn đang bị mắc kẹt.
Quentin

cảm ơn cậu. Btw tôi đã tìm ra vấn đề. Tôi đã sử dụng các tệp động
Taimoor Changaiz 16/12/14

20
"Thay đổi máy chủ của bạn" không hoạt động nếu bạn đang cố sử dụng API bên ngoài, chẳng hạn như LinkedIn .
Dan Dascalescu 20/03/2015

1
@Quentin Không thành vấn đề vì các câu hỏi được cho là hữu ích cho người khác, không chỉ OP. Google chỉ tôi ở đây và điều này không giúp ích gì cho trường hợp của tôi
Juan Mendes

56

Nếu máy chủ hoặc bộ chứa proxy của bạn thêm tiêu đề sau khi phân phát tệp .js, nó sẽ buộc một số trình duyệt như Chrome thực hiện kiểm tra nghiêm ngặt các loại MIME:

X-Content-Type-Options: nosniff

Xóa tiêu đề này để ngăn Chrome thực hiện kiểm tra MIME.


14
Đó là một thực tế tồi khi không cung cấp tiêu đề Loại nội dung được phục vụ trong các ứng dụng web. Tránh đánh hơi MIME từ phía máy chủ (sử dụng X-Content-Type-Options: nosnifftiêu đề) là một lựa chọn tốt để ngăn chặn các cuộc tấn công đánh hơi nội dung.
Andrés Morales

Tôi đã phải thêm điều này như một phần của kiểm toán bảo mật - bây giờ tôi không biết phải làm gì !! :-(
James Poulose

11

FYI, tôi đã gặp lỗi tương tự từ bảng điều khiển Chrome. Tôi nghĩ rằng hàm AJAX của tôi gây ra nó, nhưng tôi đã bỏ ghi chú tập lệnh rút gọn của mình từ /javascripts/ajax-vanilla.min.jssang /javascripts/ajax-vanilla.js. Nhưng trong thực tế các tập tin nguồn là tại /javascripts/src/ajax-vanilla.js. Vì vậy, trong Chrome bạn gặp lỗi loại MIME xấu ngay cả khi không thể tìm thấy tệp. Trong trường hợp này, thông báo lỗi được mô tả là text/plainloại MIME xấu.


1
Cảm ơn bạn rất nhiều! Đây là vấn đề của tôi. Đó là trong thư mục sai.
Ellisan

2
Bạn đã tiết kiệm cho tôi 1 giờ hôm nay vô địch! Cảm ơn
Beto Aveiga

1

Tôi đã gặp lỗi này khi sử dụng IIS 7.0 với trang lỗi 404 tùy chỉnh, mặc dù tôi nghi ngờ điều này sẽ xảy ra với bất kỳ trang 404 nào. Máy chủ trả về phản hồi html 404 với loại mime văn bản / html mà không thể (đúng) được thực thi.


Chúng tôi có vấn đề tương tự, nội dung được trả về là 302 (vì người dùng không được xác thực) và nó hoàn toàn không có loại nội dung -> không thể thực thi.
Pasi Savolainen

1

Đối với người dùng bản ghi và tìm kiếm Google , Nếu bạn là nhà phát triển .NET Core, bạn nên đặt loại nội dung theo cách thủ công, vì giá trị mặc định của chúng là null hoặc trống:

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

0

Trong trường hợp của tôi, tôi sử dụng

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

để thực hiện yêu cầu (với API của Flickr) và tôi đã gặp lỗi MIME tương tự. Giống như câu trả lời được đề xuất ở trên, thêm mã sau đây:

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

Đã khắc phục sự cố và tôi không còn thấy lỗi loại MIME trong bảng điều khiển của Chrome.


0

nếu ứng dụng được lưu trữ trên IIS, hãy đảm bảo Nội dung tĩnh được cài đặt. Bảng điều khiển> Chương trình> Bật hoặc tắt các tính năng của Windows> Dịch vụ thông tin Internet> Dịch vụ web toàn cầu> Các tính năng HTTP phổ biến> Nội dung tĩnh.

Tôi gặp phải vấn đề này khi cố chạy một ứng dụng hiện có trên bản cài đặt IIS 10.0 mới

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.