Chrome dice "Risorsa interpretata come script ma trasferita con testo / plain di tipo MIME". Cosa offre?


316

In FF e tutto il mio javascript funziona bene. Ma in Chrome dà questo messaggio:

Risorsa interpretata come script ma trasferita con testo / plain di tipo MIME.

Ho controllato tutti i tag di script e tutti hanno il MIME type="text/javascript". Lo dice anche con jquery e jquery ui. Cosa c'è che non va in Chrome?

Qual è il problema e la soluzione per questo? È qualcosa che devo modificare nelle "opzioni" del browser o proviene dal server o devo modificare il mio codice?


14
Qualche codice sarebbe utile. Non dare mai la colpa al compilatore (browser) prima, non importa quanto sia allettante perché quasi sempre ti sbagli.
msw,

per curiosità, stai usando HTML5?
bollo,

Risposte:


203

Significa che il server sta inviando una risposta HTTP Javascript con

Content-Type: text/plain

È necessario configurare il server con cui inviare una risposta JavaScript

Content-Type: application/javascript

3
Sto usando Weblogic Server 11g, ma non so dove posso configurare il MIME in esso. Per favore, puoi mostrarmi la strada?
Shaoz,

6
Cosa succede quando non c'è un server, ma lo script è in realtà un file JSONP sul tuo filesystem locale? Immagino quindi semplicemente ignorare l'avvertimento poiché non è grave ed è al di fuori del tuo controllo?
hippietrail,

2
Dovrebbe essere content-type:application/javascriptperò, nonapplication/x-javascript è uno standard RFC o ECMAScript.
Jasdeep Khalsa

Ci sono molte domande simili. Questa risposta è stata una soluzione semplice per me: stackoverflow.com/a/12057490/1617395
Joe Leo

@JoeLeo: è per IIS.
SLaks

124

Questo non ha nulla a che fare con jQuery o qualsiasi stranezza del codice di script lato client. È un problema sul lato server : il server (applicazione sul lato) non sta inviando il valore del Content-Typecampo di intestazione HTTP previsto per la risorsa di script sul lato client. Ciò accade se il server Web non è configurato correttamente, configurato in modo errato o un'applicazione sul lato server (ad esempio PHP) sta generando la risorsa di script sul lato client.

I tipi di media MIME corretti per le implementazioni di ECMAScript come JavaScript includono:

  • text/javascript(registrato come obsoleto , non deprecato; ma comunque valido e supportato al meglio )
  • text/ecmascript(registrato come obsoleto , non deprecato; ma comunque valido )
  • application/javascript
  • application/ecmascript

Essi non comprendono application/x-javascript, come i mezzi di comunicazione tipi MIME sopra elencati sono quelli registrati nella struttura standard ormai (quindi non c'è bisogno, e non ci dovrebbe essere bisogno, più utilizzare quelli sperimentali). Cf. RFC 4329, "Tipi di supporti di scripting" (2005 CE) e il mio caso di prova: supporto per tipi di supporti di scripting .

Una soluzione è configurare il server, se possibile, come già raccomandato. Per Apache, questo può essere semplice come aggiungere la direttiva

AddType text/javascript .js

( per i dettagli, consultare la documentazione del server HTTP Apache ).

Ma se la risorsa di script sul lato client viene generata da un'applicazione sul lato server, come PHP, è necessario impostare Content-Typeesplicitamente il valore del campo di intestazione, poiché è probabile che il valore predefinito text/html:

<?php
  header('Content-Type: text/javascript; charset=UTF-8');
  // ...
?>

(Questa e altre affermazioni simili devono precedere qualsiasi altro output - vedi il manuale di PHP -, altrimenti il ​​corpo del messaggio HTTP è considerato già iniziato ed è troppo tardi per inviare più campi header).

La generazione sul lato server può avvenire facilmente su una risorsa di script sul lato client anche se sul server sono presenti file .js semplici, se i commenti vengono rimossi da essi man mano che vengono pubblicati, se sono tutti raggruppati in un'unica risposta di grandi dimensioni (per ridurre il numero di richieste, che possono essere più efficienti) o che sono minimizzate dall'applicazione lato server in qualsiasi altro modo.


1
Cosa succede se non abbiamo accesso al server?
Adonis K. Kakoulidis,

1
Trova qualcuno che abbia.
Pointed Ears

Grazie mille per questa spiegazione. Troppe persone dicono qualcosa di arrogante come 'basta mandare JSONP bambino, dovresti sapere come farlo'. Quando è il momento di spiegarlo correttamente come hai fatto, è chiaro come il giorno. Questo ha risolto un problema che avevo da diverse settimane. Grazie ancora!

@ Rick-777: non apprezzo che tu abbia cambiato la mia risposta senza nemmeno commentare la tua modifica. Se leggete con attenzione la mia risposta, ti rendi conto perché mi raccomando text/javascriptsopra application/javascript. Se hai motivo di credere che application/javascriptsia la risposta migliore adesso, il minimo che dovresti fare è spiegarti in un commento. Non è appropriato che richieda il meccanismo di notifica di Stack Overflow per rendermi conto delle tue modifiche. Ho ripristinato le tue modifiche, che chiamo fudging , alle risposte a questa domanda in cui le considero inadeguate.
Orecchie appuntite

19

Per server di applicazioni Java come Weblogic

1) Assicurati che il tuo file weblogic.xml sia privo di errori

come questo:

    <?xml version = '1.0' encoding = 'windows-1252'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>
    <context-root>MyWebApp</context-root>
</weblogic-web-app>

2) Aggiungi un tipo mime per javascript al tuo file web.xml :

    ...
        </servlet-mapping>

        <mime-mapping>    
            <extension>js</extension>        
            <mime-type>application/javascript</mime-type>        
        </mime-mapping>

        <welcome-file-list>
    ...

Questo funzionerà anche con altri container Java - Tomcat ecc. application/javascriptÈ attualmente l'unico tipo mime valido; altri come text/javascriptsono stati deprecati.

3) Potrebbe essere necessario svuotare la cache del browser o premere CTRL-F5


7

Ho avuto questo problema e ho capito come risolverlo.

Succede quando il file di stile (CSS) ha una codifica diversa dal file PHP che fa riferimento al file .css

Ad esempio, l'utilizzo di jQuery.js nella codifica Unix e l'utilizzo di index.php in UTF-8 causeranno questo problema, quindi è necessario renderli UTF-8 o qualsiasi altra codifica purché uguale.


7

Se stai generando il tuo javascript con un file php, aggiungi questo come l'inizio del tuo file:

<?php Header("Content-Type: application/x-javascript; charset=UTF-8"); ?>

Se hai un'intestazione diversa definita, sostituiscila in modo da non ricevere un errore.
mopsyd,

1
Insieme al post Pointed Ears mi ha aiutato a risolvere un problema che apparentemente non aveva risposta e mi sono impantanato per settimane. Grazie mille: D Perché quando scrivo su Google "come impostare le intestazioni nel documento PHP" Ottengo 1000 risultati errati che non mi dicono nulla su come fare, quindi non lo so, ma finalmente ho trovato il tuo post lol

3

In httpd.conf del tuo apache, aggiungi una riga del genere:

AddType application/x-javascript .js

La mia voce " .js" aveva "application / javascript" in Tipi MIME di IIS 8. Quando ho cambiato la voce " .js" in "application / x-javascript", ha funzionato! Questo ha avuto origine da un'applicazione ExtJS / ASP.NET / ExtDirect4DotNet
MacGyver

3

Ho ricevuto questo messaggio di debug per una ragione più stupida rispetto alle altre risposte qui: questo è il messaggio di errore ricevuto quando non si ha abbastanza sonno e si fa riferimento a un file js utilizzando la sintassi per un file css. Come in,

<link rel='stylesheet' type='text/css' href='clearly_javascript.js'/>

piuttosto che

<script src='clearly_javascript.js'></script>

Ho pensato di metterlo qui perché questo è il primo post che compare quando si cerca il messaggio di errore.


2

Strano problema, ma questo mi ha aiutato a risolvere il mio problema. A volte anche le cose più semplici sono difficili da capire ...

Invece di usare il /js/main.cssmio script-tag che ho usatojs/main.css

, ha fatto davvero la differenza. Sono seduto su WAMP / Windows e non avevo un vhost, ma ho appena usatolocalhost/<project>

Se mi riferisco a /js/main.cssallora mi riferisco a localhost/css/main.csse non alocalhost/<project>/css/main.css

Quando ci pensi, è abbastanza ovvio, ma se qualcuno si imbatte in questo, ho pensato di condividere questa risposta.


1

Controlla che i tuoi file js esistano effettivamente sul server. Ho avuto questo problema e ho scoperto che i file js non erano stati caricati sul server e il server stava effettivamente restituendo la pagina html, che era il documento predefinito configurato sul server (ad esempio default.html)


1

Se stai lavorando su Joomla! e ottenere questo fastidioso errore quando si tenta di includere un ( .js) file JavaScript, la seguente soluzione è per te.

Il problema più probabile è che stai provando a includere un .js file che non è lì , o hai semplicemente smarrito quel .jsfile e quando Joomla! non trova una risorsa, quindi invece del messaggio 404 generico, restituisce un messaggio 404 completo con una pagina Web completa, HTML ecc.

Il browser lo sta interpretando come se fosse .jssolo una pagina web che dice che il file richiesto non è stato trovato .

Questo può funzionare per


1

Per me, è successo solo in alcune pagine perché ho usato al window.locationposto di $location.url(...);Questo risolto il mio problema. Ci è voluto un po 'per capire :)


0

Ho riscontrato questo problema durante l'utilizzo di un framework Web e l'ho risolto spostando i relativi file javascript nella cartella javascript designata (dal framework).


0

Una cosa comune quando ciò accade è se hai semplicemente dimenticato di includere il typenelle tue chiamate di script. Dovrai impostarlo esplicitamente, in quanto è - secondo W3 - richiesto :

type(content-type): questo attributo specifica il linguaggio di scripting dei contenuti dell'elemento e sovrascrive il linguaggio di scripting predefinito. Il linguaggio di scripting è specificato come tipo di contenuto (ad es "text/javascript".). Gli autori devono fornire un valore per questo attributo. Non esiste un valore predefinito per questo attributo.

Tuttavia sembra che i browser abbiano un valore predefinito di plain/text.

Esempio:

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&language=en"></script>

Puoi anche impostare un valore predefinito per l'estensione del file nella configurazione di Apache:

<IfModule mod_mime.c>
    AddType text/javascript .js
</IfModule>

0

Se è IIS, assicurati che Under Your common HTTP Featuressia Static Contentattivo


0

Ho avuto lo stesso errore e infine (nel mio caso particolare) ho riscontrato un problema nel descrittore di distribuzione (web.xml)

Il problema:

<servlet-mapping>
    <servlet-name>SessionController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
    <welcome-file>/</welcome-file>
</welcome-file-list>

la soluzione:

<servlet-mapping>
    <servlet-name>SessionController</servlet-name>
    <url-pattern>/SessionController</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
    <welcome-file>desktop.jsp</welcome-file>
</welcome-file-list>

0

Se si utilizza Spring MVC, è possibile aggiungere il seguente tag mvn per escludere il file di risorse da Spring Dispatch Servlet

<mvc:resources mapping="/js/*.js" location="/js/"/>
<mvc:resources mapping="/css/*.css" location="/css/"/>
<mvc:resources mapping="/images/*.*" location="/images/"/>

0

Nel mio caso, il server stava inviando il corretto Content-Typema con un errore Content-Encoding. Assicurati di aver impostato solo Content-Encoding: gzipper le risorse gzip. Inoltre, dopo aver corretto le intestazioni nel server (nel mio caso, Google Cloud Storage), ho dovuto attendere alcuni minuti per riflettere correttamente le modifiche dovute alla memorizzazione nella cache.


0

Se si utilizza AdonisJS (API REST, ad esempio), un modo per evitare ciò è definire l'intestazione della risposta in questo modo:

response.safeHeader('Content-type', 'application/json')

-1

Stavo avendo lo stesso problema quando provavo a cambiare un'immagine di sfondo in un array tramite javascript (jQuery in questo caso).

Comunque.

Invece di questo:

m.setStyle('background-image','url(/templates/site/images/style5/'+backgs[i]+')')

Fai questo:

eval("m.setStyle('background-image','url(/templates/site/images/style5/'+backgs[i]+')')");

Chrome JavaScript viene rovinato quando si tenta di analizzare una variabile all'interno di un elemento strutturato con '. Nel mio caso si è fermato poco prima dell'inserimento dell'array di immagini. Invece di analizzare l'URL dell'immagine + il nome dell'immagine (all'interno dell'array), stava analizzando solo l'URL dell'immagine.

Probabilmente dovrai cercare all'interno del codice e vedere dove succede. FF, IE e tutti gli altri non hanno questo problema.


4
Non usarlo evalse puoi aiutarlo: javascripttoolbox.com/bestpractices/#eval
indra

-1

La risposta pubblicata qui da Simon-Sarris mi ha aiutato.

Questo mi ha aiutato a risolvere il mio problema.

Il programma di installazione di Visual Studio deve aver aggiunto una riga errante al registro.

apri regedit e dai un'occhiata a questa chiave di registro:

inserisci qui la descrizione dell'immagine

Vedi quella chiave? La chiave del tipo di contenuto? cambia il suo valore da text / plain a text / javascript.

Finalmente il cromo può respirare di nuovo facilmente.

Dovrei notare che né Tipo di contenuto né PercievedType sono presenti per impostazione predefinita su Windows 7, quindi probabilmente potresti eliminarli entrambi in modo sicuro, ma il minimo che devi fare è quella modifica.

Comunque spero che questo risolva anche per te!

Non dimenticare di riavviare il sistema dopo le modifiche.


Ciao finto Il plagio è cattivo. (mmmmkay?) Ho modificato la tua risposta per rimuovere il plagio in conformità con le linee guida SO .
Samuel Harmer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.