Chrome sagt: "Ressource als Skript interpretiert, aber mit MIME-Typ Text / Plain übertragen." Was gibt es?

316

In FF und allem funktioniert mein Javascript einwandfrei. Aber in Chrome gibt es diese Nachricht:

Ressource als Skript interpretiert, aber mit MIME-Typ text / plain übertragen.

Ich habe alle Skript-Tags überprüft und alle haben die MIME type="text/javascript". Das sagt es sogar mit jquery und jquery ui. Was ist los mit Chrome?

Was ist das Problem und die Lösung dafür? Muss ich die 'Optionen' des Browsers ändern oder ist es vom Server oder muss ich meinen Code optimieren?

Shaoz
quelle
14
Ein Code wäre hilfreich. Beschuldigen Sie niemals zuerst den Compiler (Browser), egal wie verlockend er ist, denn Sie werden sich fast immer irren.
Msw
Verwenden Sie aus Neugier HTML5?
Bollo

Antworten:

203

Dies bedeutet, dass der Server eine Javascript-HTTP-Antwort mit sendet

Content-Type: text/plain

Sie müssen den Server so konfigurieren, dass eine JavaScript-Antwort mit gesendet wird

Content-Type: application/javascript
SLaks
quelle
3
Ich verwende Weblogic Server 11g, weiß aber nicht, wo ich das MIME darin konfigurieren kann. Können Sie mir bitte den Weg zeigen?
Shaoz
6
Hmm, was ist, wenn es keinen Server gibt, aber das Skript tatsächlich eine JSONP-Datei in Ihrem lokalen Dateisystem ist? Ich denke dann ignoriere einfach die Warnung, da sie nicht ernst ist und außerhalb deiner Kontrolle liegt?
Hippietrail
2
Es sollte content-type:application/javascriptaber application/x-javascriptist nicht ein RFC oder ECMAScript - Standard.
Jasdeep Khalsa
Es gibt viele ähnliche Fragen. Diese Antwort war eine einfache Lösung für mich: stackoverflow.com/a/12057490/1617395
Joe Leo
@ JoeLeo: Das ist für IIS.
SLaks
124

Dies hat nichts mit jQuery oder einer Eigenart von clientseitigem Skriptcode zu tun. Es handelt sich um ein serverseitiges Problem: Der Server (-seitige Anwendung) sendet nicht den erwarteten Wert des HTTP- Content-TypeHeaderfelds für die clientseitige Skriptressource. Dies geschieht, wenn der Webserver nicht ausreichend konfiguriert oder falsch konfiguriert ist oder eine serverseitige Anwendung (z. B. PHP) die clientseitige Skriptressource generiert.

Zu den richtigen MIME-Medientypen für ECMAScript-Implementierungen wie JavaScript gehören:

  • text/javascript(als veraltet registriert , nicht veraltet, aber immer noch gültig und am besten unterstützt )
  • text/ecmascript(registriert als veraltet , nicht veraltet; aber immer noch gültig )
  • application/javascript
  • application/ecmascript

Sie sind nicht enthalten application/x-javascript, da die oben aufgeführten MIME-Medientypen bereits im Standardbaum registriert sind (daher besteht keine Notwendigkeit mehr und es sollte auch kein Wunsch mehr bestehen, experimentelle zu verwenden). Vgl. RFC 4329, "Scripting Media Types" (2005 CE) und mein Testfall: Unterstützung für Scripting Media Types .

Eine Lösung besteht darin, den Server nach Möglichkeit zu konfigurieren, wie bereits empfohlen. Für Apache kann dies so einfach sein wie das Hinzufügen der Direktive

AddType text/javascript .js

( Weitere Informationen finden Sie in der Apache HTTP Server-Dokumentation .)

Wenn die clientseitige Skriptressource jedoch von einer serverseitigen Anwendung wie PHP generiert wird, muss der Content-TypeHeaderfeldwert explizit festgelegt werden, da der Standard wahrscheinlich ist text/html:

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

(Diese und ähnliche Aussagen müssen vor jeder anderen Ausgabe stehen - siehe das PHP-Handbuch - sonst wird angenommen, dass der HTTP-Nachrichtentext bereits begonnen hat und es zu spät ist, weitere Headerfelder zu senden.)

Die serverseitige Generierung kann leicht zu einer clientseitigen Skriptressource führen, selbst wenn Sie einfache .js-Dateien auf dem Server haben, wenn Kommentare während der Zustellung von ihnen entfernt werden, wenn sie alle in einer großen Antwort zusammengefasst sind (um die Anzahl der Anforderungen, die effizienter sein können) oder die von der serverseitigen Anwendung auf andere Weise minimiert werden.

Spitze Ohren
quelle
1
Was ist, wenn wir keinen Zugriff auf den Server haben?
Adonis K. Kakoulidis
1
Finde jemanden, der hat.
PointedEars
Vielen Dank für diese Erklärung. Viel zu viele Leute sagen etwas Übermütiges wie "Schicken Sie einfach ein JSONP-Kind, Sie sollten wissen, wie es geht". Wenn die Zeit gebraucht wird, um es richtig zu erklären, wie Sie es getan haben, ist es klar wie ein Tag. Dies hat ein Problem behoben, das ich seit mehreren Wochen hatte. Danke noch einmal!
@ Rick-777: Ich weiß es nicht zu schätzen, dass Sie meine Antwort geändert haben, ohne Ihre Änderung zu kommentieren. Wenn Sie meine Antwort sorgfältig lesen, erkennen Sie, warum ich text/javascriptüber empfehle application/javascript. Wenn Sie Grund zu der Annahme haben, dass dies application/javascriptjetzt die bessere Antwort ist, sollten Sie sich zumindest in einem Kommentar erklären . Es ist unangemessen, dass der Benachrichtigungsmechanismus von Stack Overflow erforderlich ist, damit ich auf Ihre Änderungen aufmerksam werde. Ich habe Ihre Änderungen, die ich als Fudging bezeichne , auf die Antworten auf diese Frage zurückgesetzt, die ich für unangemessen halte.
PointedEars
19

Für Java-Anwendungsserver wie Weblogic

1) Stellen Sie sicher, dass Ihre Datei weblogic.xml fehlerfrei ist

wie dieser:

    <?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) Fügen Sie Ihrer web.xml- Datei einen MIME-Typ für Javascript hinzu :

    ...
        </servlet-mapping>

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

        <welcome-file-list>
    ...

Dies funktioniert auch für andere Java-Container - Tomcat usw. application/javascriptist derzeit der einzige gültige MIME-Typ. andere wie text/javascriptwurden veraltet.

3) Möglicherweise müssen Sie Ihren Browser-Cache leeren oder STRG-F5 drücken

egallardo
quelle
7

Ich hatte dieses Problem und fand heraus, wie ich es beheben kann.

Dies geschieht, wenn sich die CSS-Datei (Style) in einer anderen Codierung befindet als die PHP-Datei, die auf die CSS-Datei verweist

Wenn Sie beispielsweise jQuery.js in der Unix-Codierung und index.php in UTF-8 verwenden, tritt dieses Problem auf, sodass Sie beide UTF-8-Codierungen oder andere Codierungen festlegen müssen, solange sie identisch sind.

mak
quelle
7

Wenn Sie Ihr Javascript mit einer PHP-Datei generieren, fügen Sie dies als Anfang Ihrer Datei hinzu:

<?php Header("Content-Type: application/x-javascript; charset=UTF-8"); ?>
Mopsyd
quelle
Wenn Sie einen anderen Header definiert haben, ersetzen Sie ihn, damit Sie keinen Fehler erhalten.
Mopsyd
1
Zusammen mit dem Beitrag von PointedEars hat mir dies geholfen, ein Problem zu beheben, das anscheinend keine Antwort hatte, und ich habe mir seit Wochen den Kopf zerbrochen. Vielen Dank: D Warum ist es so, wenn ich in Google "Wie setze ich die Header in PHP-Dokumenten?" Eingebe. Ich erhalte 1000 fehlerhafte Ergebnisse, die mir nichts darüber sagen, wie ich das tun soll. Ich weiß es nicht, aber ich habe endlich Ihren Beitrag gefunden. Lol
3

Fügen Sie in der httpd.conf Ihres Apachen einfach eine solche Zeile hinzu:

AddType application/x-javascript .js
Ruslan Abuzant
quelle
Mein Eintrag " .js" hatte "application / javascript" unter IIS 8 MIME Types. Als ich den Eintrag " .js" in "application / x-javascript" geändert habe , hat es funktioniert! Dies entstand aus einer ExtJS / ASP.NET / ExtDirect4DotNet-Anwendung
MacGyver
3

Ich habe diese Debug-Nachricht aus einem dümmeren Grund erhalten als die anderen Antworten hier: Dies ist die Fehlermeldung, die erhalten wird, wenn Sie nicht genug Schlaf bekommen und auf eine JS-Datei verweisen, indem Sie die Syntax für eine CSS-Datei verwenden. Wie in,

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

eher, als

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

Ich dachte, ich würde dies hier veröffentlichen, da dies der erste Beitrag ist, der bei der Suche nach der Fehlermeldung angezeigt wird.

Robert Townley
quelle
2

Seltsames Problem, aber das hat mir geholfen, mein Problem zu lösen. Manchmal sind selbst die einfachsten Dinge schwer herauszufinden ...

Anstatt /js/main.cssin meinem Skript-Tag zu verwenden, habe ich verwendetjs/main.css

JA , es hat tatsächlich einen Unterschied gemacht. Ich sitze auf WAMP / Windows und hatte keinen vhost, sondern nur benutztlocalhost/<project>

Wenn ich mich beziehe, /js/main.cssdann beziehe ich mich auf localhost/css/main.cssund nicht auflocalhost/<project>/css/main.css

Wenn Sie daran denken, ist es ziemlich offensichtlich, aber wenn jemand darauf stößt, dachte ich, ich würde diese Antwort teilen.

bestprogrammerintheworld
quelle
1

Überprüfen Sie, ob Ihre JS-Dateien tatsächlich auf dem Server vorhanden sind. Ich hatte dieses Problem und stellte fest, dass die js-Dateien nicht auf den Server hochgeladen wurden und der Server stattdessen die HTML-Seite zurückgab - dies war das auf dem Server konfigurierte Standarddokument (z. B. default.html).

Steve Mc
quelle
1

Wenn Sie an Joomla arbeiten! Wenn Sie diesen nervigen Fehler erhalten, wenn Sie versuchen, eine ( .js) JavaScript-Datei einzuschließen, ist die folgende Lösung für Sie.

Das wahrscheinlichste Problem ist, dass Sie versuchen, eine .js Datei einzuschließen, die nicht vorhanden ist , oder dass Sie diese einfach verlegt haben.js Datei , und wenn Joomla! findet keine Ressource und gibt anstelle der generischen 404-Nachricht eine vollwertige 404-Nachricht mit einer vollständigen Webseite und HTML usw. zurück.

Der Webbrowser interpretiert es so, als sei es .jsnur eine Webseite, die besagt, dass die erforderliche Datei nicht gefunden wurde .

Dies kann funktionieren für

Mohd Abdul Mujib
quelle
1

Für mich ist es nur auf einigen Seiten passiert, weil ich window.locationanstelle von $location.url(...);Dies mein Problem behoben habe. Es hat eine Weile gedauert, um herauszufinden :)

tfa
quelle
0

Ich hatte dieses Problem bei der Verwendung eines Webframeworks und habe es behoben, indem ich die relevanten Javascript-Dateien in den angegebenen (vom Framework) Javascript-Ordner verschoben habe.

JJ.
quelle
0

In diesem Fall kommt es häufig vor, dass Sie einfach vergessen haben , die typeAufrufe in Ihr Skript aufzunehmen. Sie müssen es explizit setzen, wie es ist - nach W3 - erforderlich :

type(Inhaltstyp): Dieses Attribut gibt die Skriptsprache des Inhalts des Elements an und überschreibt die Standard-Skriptsprache. Die Skriptsprache wird als Inhaltstyp angegeben (z "text/javascript". B. ). Autoren müssen einen Wert für dieses Attribut angeben. Für dieses Attribut gibt es keinen Standardwert .

Dennoch scheint es, dass Browser einen Standardwert von haben plain/text.

Beispiel:

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

Sie können in Ihrer Apache-Konfiguration auch einen Standard für diese Dateierweiterung festlegen:

<IfModule mod_mime.c>
    AddType text/javascript .js
</IfModule>
Kaiser
quelle
0

Wenn seine IIS sicherstellen, dass unter Ihrer common HTTP Featureshaben Sie Static Contenteingeschaltet

varun
quelle
0

Ich hatte den gleichen Fehler und schließlich (in meinem speziellen Fall) ein Problem im Bereitstellungsdeskriptor (web.xml) gefunden.

Das Problem:

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

die Lösung:

<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>
Daniel Kennedy
quelle
0

Wenn Sie Spring MVC verwenden, können Sie das folgende MVN-Tag hinzufügen, um die Ressourcendatei vom Spring Dispatch Servlet auszuschließen

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

In meinem Fall hat der Server das Richtige gesendet, Content-Typeaber mit einem Falschen Content-Encoding. Content-Encoding: gzipStellen Sie sicher, dass Sie nur komprimierte Ressourcen festlegen. Nachdem ich die Header auf dem Server (in meinem Fall Google Cloud Storage) repariert hatte, musste ich einige Minuten warten, um die Änderungen aufgrund des Cachings richtig wiederzugeben.

Falsarella
quelle
0

Wenn Sie AdonisJS (z. B. REST-API) verwenden, können Sie dies vermeiden, indem Sie den Antwortheader folgendermaßen definieren:

response.safeHeader('Content-type', 'application/json')
Billal Begueradj
quelle
-1

Ich hatte das gleiche Problem beim Versuch, Hintergrundbilder in einem Array über Javascript (in diesem Fall jQuery) zu ändern.

Wie auch immer.

An Stelle von:

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

mach das:

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

Chrome Javascript wird beim Versuch, eine Variable in einem mit 'strukturierten Element zu analysieren, verschraubt. In meinem Fall wurde es kurz vor dem Einfügen des Bildarrays gestoppt. Anstatt die Bild-URL + den Bildnamen (innerhalb des Arrays) zu analysieren, wurde nur die Bild-URL analysiert.

Sie müssen wahrscheinlich im Code suchen und sehen, wo es passiert. FF, IE und alle anderen haben dieses Problem nicht.

Marco G.
quelle
4
Nicht verwenden, evalwenn Sie helfen können: javascripttoolbox.com/bestpractices/#eval
indra
-1

Die Antwort gepostet hier von simon-sarris hat mir geholfen.

Dies hat mir geholfen, mein Problem zu lösen.

Das Visual Studio-Installationsprogramm muss der Registrierung eine fehlerhafte Zeile hinzugefügt haben.

Öffnen Sie regedit und sehen Sie sich diesen Registrierungsschlüssel an:

Geben Sie hier die Bildbeschreibung ein

Sehen Sie diesen Schlüssel? Der Inhaltstyp-Schlüssel? Ändern Sie den Wert von text / plain in text / javascript.

Endlich kann Chrom wieder leicht atmen.

Ich sollte beachten, dass unter Windows 7 standardmäßig weder Content Type noch PercievedType vorhanden sind, sodass Sie wahrscheinlich beide sicher löschen können, aber das Minimum, das Sie tun müssen, ist diese Bearbeitung.

Wie auch immer, ich hoffe, das behebt es auch für Sie!

Vergessen Sie nicht, Ihr System nach den Änderungen neu zu starten.

Schein
quelle
Hallo Schein. Plagiat ist schlecht. (mmmmkay?) Ich habe Ihre Antwort bearbeitet, um Plagiate gemäß den SO- Richtlinien zu entfernen .
Samuel Harmer