Chrome, yanlış MIME türü nedeniyle bir AJAX komut dosyası yürütmeyi reddediyor


146

Safari ve diğer tarayıcılarda iyi çalışan ancak maalesef Chrome'da çalışmayan AJAX aracılığıyla JSON olarak bir komut dosyasına erişmeye çalışıyorum. Aşağıdaki hatayla geliyor:

MIME türü ('application / json') yürütülebilir olmadığından ve sıkı MIME türü denetimi etkinleştirildiğinden '*' konumundan komut dosyası yürütme reddedildi.

İşte istek:

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

Bunun için bir çözümü olan var mı?


2
Peki bu kaynak nedir? Bir JSONP komut dosyası mı yoksa bir JSON dosyası mı? MIME türü bununla eşleşiyor mu? Görünüşe göre öyle değil. Geçici bir çözüme gerek yok, sadece düzeltin .
Bergi

geri aramayı kaldırmak ve dataType jsonp kullanmak sorunu çözmüyor
Paul Nelligan

2
Ben, demek düzeltmek sunucu yanıtı .
Bergi

5
@Bergi: Ya sunucu OP'nin kontrolü dışındaysa? Belki LinkedIn gibi harici bir API kullanmaya çalışıyor .
Dan Dascalescu

2
@DanDascalescu: API'yi kullanılamaz hale getirdiği için bunu bir hata olarak bildirmesi gerekiyor. Bunun düzeltilmesini beklerken, mime türünü veya içeriğini değiştiren bir proxy kullanabilir .
Bergi

Yanıtlar:


72

Bir geri arama bağımsız değişkeni ekleyerek, jQuery'ye XMLHttpRequest kullanarak JSON isteği yerine bir komut dosyası öğesi kullanarak JSONP için istek yapmak istediğinizi söylüyorsunuz.

JSONP, JSON değildir. Bir JavaScript programıdır.

Sunucunuzu, JSONP için doğru MIME türünü verecek şekilde değiştirin application/javascript.

(Siz oradayken, çelişkili olduğu için jQuery'ye JSON beklediğinizi söylemeyi bırakın :) dataType: 'jsonp'.


1
İki site arasında ajax kullanmalıyım. "Sunucunuzu, uygulama / javascript olan JSONP için doğru MIME türünü verecek şekilde değiştirin" ayarını yapmaktan bahsettiğiniz hakkında bana rehberlik edin. Nasıl thi yapılır
Taimoor Changaiz

@TaimoorChangaiz - Bunu sana söyleyemem. Statik dosyalar oluşturuyorsanız, kullandığınız sunucuya bağlıdır. İçeriği dinamik olarak oluşturuyorsanız, kullandığınız programlama diline (ve muhtemelen çerçeveye) bağlıdır. Şu ana kadar sahip olduklarınızı ve tam olarak nerede sıkıştığınızı açıklayan bir soru sormayı deneyin .
Quentin

sağol kanka. Btw sorunu çözdüm. Dinamik dosyalar kullanıyordum
Taimoor Changaiz

21
LinkedIn gibi harici bir API kullanmaya çalışıyorsanız "sunucunuzu değiştirin" çalışmaz .
Dan Dascalescu

1
@Quentin Soruların sadece OP'ye değil, başkalarına da yardımcı olması gerektiği için önemli. Google beni buraya işaret etti ve bu
Juan Mendes

56

Proxy sunucunuz veya kapsayıcınız .js dosyasını sunarken aşağıdaki üstbilgiyi eklerse, Chrome gibi bazı tarayıcıları MIME türlerini katı bir şekilde denetlemeye zorlar:

X-Content-Type-Options: nosniff

Chrome'un MIME kontrolü yapmasını önlemek için bu başlığı kaldırın.


14
Web uygulamalarında sunulan kaynakların Content-Type başlığını sağlamamak kötü bir uygulamadır. Sunucu tarafından MIME koklamasından kaçınmak ( X-Content-Type-Options: nosniffbaşlık kullanarak ), içerik algılama saldırılarını önlemek için iyi bir seçenektir.
Andrés Morales

Bunu bir güvenlik denetiminin parçası olarak eklemek zorunda kaldım - şimdi ne yapacağımı bilmiyorum !! :-(
James Poulose

11

Bilginize, Chrome konsolunda da aynı hatayı aldım. Bunu neden benim AJAX işlevini düşündüm, ama benim minified senaryoyu uncommented /javascripts/ajax-vanilla.min.jsiçin /javascripts/ajax-vanilla.js. Ama gerçekte kaynak dosya adresindeydi /javascripts/src/ajax-vanilla.js. Yani Chrome'da, dosya bulunamasa bile kötü MIME tipi hatası alıyorsunuz. Bu durumda, hata mesajı text/plainhatalı MIME türü olarak tanımlanır .


1
Çok teşekkür ederim! Bu benim de sorunumdu. Yanlış dizindeydi.
Ellisan

2
Bugün beni 1 saat kurtardın şampiyon! Teşekkürler
Beto Aveiga

2

Kayıt ve Google arama kullanıcıları için , .NET Core geliştiriciyseniz, içerik türlerini manuel olarak ayarlamalısınız, çünkü bunların varsayılan değeri null veya boştur:

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

1

IIS 7.0'ı özel bir 404 hata sayfasıyla kullanarak bu hatayla karşılaştım, ancak bunun herhangi bir 404 sayfasında olacağından şüpheleniyorum. Sunucu, (doğru olarak) yürütülemeyen bir text / html mime türüne sahip bir html 404 yanıtı döndürdü.


Benzer bir sorunla karşılaştık, döndürülen içerik 302 idi (çünkü kullanıcı kimliği doğrulanmadı) ve içerik türü hiç yoktu -> yürütülemez.
Pasi Savolainen

0

Benim durumumda kullanıyorum

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

istekte bulunmak için (Flickr'ın API'sine) ve aynı MIME hatasını aldım. Yukarıdaki yanıtın önerdiği gibi, aşağıdaki kodu ekleyin:

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

Sorun düzeltildi ve artık Chrome konsolunda MIME türü hatasını görmüyorum.


0

uygulama IIS'de barındırılıyorsa, Statik İçeriğin yüklü olduğundan emin olun. Denetim Masası> Programlar> Windows özelliklerini açın veya kapatın> Internet Information Services> World Wide Web Hizmetleri> Ortak HTTP Özellikleri> Statik İçerik.

Yeni bir IIS 10.0 yüklemesinde mevcut bir uygulamayı çalıştırmaya çalışırken bu sorunla karşılaştım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.