Chrome ปฏิเสธที่จะเรียกใช้งานสคริปต์ AJAX เนื่องจากประเภท MIME ผิด


146

ฉันพยายามเข้าถึงสคริปต์ในฐานะ 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 บางทีเขาอาจจะพยายามที่จะใช้API ภายนอกเช่น LinkedIn
Dan Dascalescu

2
@DanDascalescu: เขาควรรายงานว่านี่เป็นข้อผิดพลาดเพราะทำให้ API ไม่สามารถใช้งานได้ ในขณะที่รอการแก้ไขนี้เขาสามารถใช้พร็อกซีที่เปลี่ยนประเภทหรือเนื้อหาของ mime
Bergi

คำตอบ:


70

โดยการเพิ่มอาร์กิวเมนต์โทรกลับคุณกำลังบอก jQuery ว่าคุณต้องการร้องขอให้ JSONP ใช้องค์ประกอบสคริปต์แทนการร้องขอ JSON โดยใช้ XMLHttpRequest

JSONP ไม่ใช่ JSON มันเป็นโปรแกรมจาวาสคริปต์

เปลี่ยนเซิร์ฟเวอร์ของคุณเพื่อให้เอาต์พุตชนิด MIME ที่ถูกต้องสำหรับ JSONP ซึ่งก็คือ application/javascriptซึ่งเป็น

(ในขณะที่คุณกำลังที่จะหยุดบอก jQuery ที่คุณจะคาดหวังว่า JSON เป็นที่ขัดแย้ง: dataType: 'jsonp')


1
ฉันจะใช้ ajax ระหว่างสองไซต์ แนะนำฉันเกี่ยวกับสิ่งที่คุณกำลังพูดถึงเพื่อตั้งค่า "เปลี่ยนเซิร์ฟเวอร์ของคุณเพื่อให้มันแสดงผลชนิด MIME ที่ถูกต้องสำหรับ JSONP ซึ่งเป็น application / javascript" วิธีทำ thi
Taimoor Changaiz

@TaimoorChangaiz - ฉันไม่สามารถบอกได้ว่า หากคุณกำลังสร้างไฟล์สแตติกมันขึ้นอยู่กับเซิร์ฟเวอร์ที่คุณใช้ หากคุณกำลังสร้างเนื้อหาแบบไดนามิกมันขึ้นอยู่กับภาษาการเขียนโปรแกรม (และกรอบงานที่เป็นไปได้) ที่คุณกำลังใช้ ลองถามคำถามที่อธิบายถึงสิ่งที่คุณมีจนถึงตอนที่คุณติดอยู่
Quentin

ขอบคุณเพื่อน. Btw ฉันคิดออกปัญหา ฉันใช้ไฟล์ไดนามิก
Taimoor Changaiz

20
"เปลี่ยนเซิร์ฟเวอร์ของคุณ" ไม่ทำงานถ้าคุณกำลังพยายามที่จะใช้API ภายนอกเช่น LinkedIn
Dan Dascalescu

1
@Quentin มันเป็นเรื่องสำคัญเนื่องจากคำถามควรจะเป็นประโยชน์กับผู้อื่นไม่ใช่เฉพาะ OP Google ชี้ฉันที่นี่และนี่ไม่ได้ช่วยกรณีของฉัน
Juan Mendes

56

หากพร็อกซีเซิร์ฟเวอร์หรือคอนเทนเนอร์ของคุณเพิ่มส่วนหัวต่อไปนี้เมื่อแสดงไฟล์. js มันจะบังคับให้เบราว์เซอร์บางตัวเช่น Chrome ทำการตรวจสอบประเภท MIME อย่างเข้มงวด:

X-Content-Type-Options: nosniff

ลบส่วนหัวนี้เพื่อป้องกันไม่ให้ Chrome ทำการตรวจสอบ MIME


14
เป็นการปฏิบัติที่ไม่ดีที่จะไม่ให้ส่วนหัวของประเภทเนื้อหาของทรัพยากรที่แสดงในเว็บแอปพลิเคชัน หลีกเลี่ยงการสูดดม MIME จากฝั่งเซิร์ฟเวอร์ (ใช้X-Content-Type-Options: nosniffส่วนหัว) เป็นตัวเลือกที่ดีเพื่อป้องกันการโจมตีการดมกลิ่นเนื้อหา
Andrés Morales

ฉันต้องเพิ่มนี่เป็นส่วนหนึ่งของการตรวจสอบความปลอดภัย - ตอนนี้ฉันไม่รู้จะทำอย่างไร !! :-(
James Poulose

11

FYI ฉันได้รับข้อผิดพลาดเดียวกันจากคอนโซล Chrome ฉันคิดว่าฟังก์ชั่น AJAX ของฉันทำให้มัน แต่ฉัน uncommented สคริปต์ minified ของฉันจากไป/javascripts/ajax-vanilla.min.js แต่ในความเป็นจริงแฟ้มแหล่งที่มาอยู่ที่/javascripts/ajax-vanilla.js /javascripts/src/ajax-vanilla.jsดังนั้นใน Chrome คุณจะได้รับข้อผิดพลาดประเภท MIME ไม่ดีแม้ว่าจะไม่พบไฟล์ ในกรณีนี้ข้อความแสดงข้อผิดพลาดอธิบายว่าเป็นtext/plainชนิด MIME ที่ไม่ดี


1
ขอบคุณมาก! นี่คือปัญหาของฉันเช่นกัน มันอยู่ในไดเรกทอรีที่ไม่ถูกต้อง
Ellisan

2
คุณช่วยฉันในวันนี้ 1 ชั่วโมง champ! ขอบคุณ
Beto Aveiga

1

ฉันพบข้อผิดพลาดนี้โดยใช้ IIS 7.0 พร้อมกับหน้าข้อผิดพลาด 404 ที่กำหนดเองถึงแม้ว่าฉันสงสัยว่าสิ่งนี้จะเกิดขึ้นกับหน้า 404 เซิร์ฟเวอร์ส่งคืนการตอบกลับ html 404 ด้วยประเภทข้อความ / html mime ซึ่งไม่สามารถดำเนินการได้ (ถูกต้อง)


เรามีปัญหาที่คล้ายกันเนื้อหาที่ส่งคืนคือ 302 (เนื่องจากผู้ใช้ไม่ได้รับการตรวจสอบสิทธิ์) และไม่มีประเภทเนื้อหาเลย -> ไม่สามารถดำเนินการได้
Pasi Savolainen

1

สำหรับบันทึกและผู้ใช้การค้นหาของ Googleหากคุณเป็นผู้พัฒนา. NET Core คุณควรตั้งค่าประเภทเนื้อหาด้วยตนเองเนื่องจากค่าเริ่มต้นของพวกเขาเป็นโมฆะหรือว่างเปล่า:

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

0

ในกรณีของฉันฉันใช้

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

เพื่อขอ (API ของ Flickr) และฉันได้รับข้อผิดพลาด MIME เดียวกัน เช่นเดียวกับคำตอบข้างต้นที่แนะนำเพิ่มรหัสต่อไปนี้:

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

แก้ไขปัญหาและฉันไม่เห็นข้อผิดพลาดประเภท MIME ในคอนโซลของ Chrome อีกต่อไป


0

ถ้าแอปพลิเคชันโฮสต์บน IIS ตรวจสอบให้แน่ใจว่ามีการติดตั้งเนื้อหาแบบคงที่ แผงควบคุม> โปรแกรม> เปิดหรือปิดคุณสมบัติ Windows> บริการข้อมูลอินเทอร์เน็ต> บริการเวิลด์ไวด์เว็บ> คุณสมบัติ HTTP ทั่วไป> เนื้อหาคงที่

ฉันประสบปัญหานี้เมื่อพยายามเรียกใช้แอปพลิเคชันที่มีอยู่ในการติดตั้ง IIS 10.0 ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.