Chrome говорит: «Ресурс интерпретируется как скрипт, но передается с MIME-типом text / plain.», Что дает?


316

В FF и все, мой JavaScript работает нормально. Но в Chrome выдает это сообщение:

Ресурс интерпретируется как скрипт, но передается с MIME-типом text / plain.

Я проверил все теги сценария, и все они имеют MIME type="text/javascript". Это даже говорит так с JQuery и JQuery UI. Что не так с Chrome?

В чем проблема и как это исправить? Это то, что я должен изменить в «настройках» браузера, или это с сервера, или я должен настроить свой код?


14
Некоторый код будет полезен. Никогда не вините сначала компилятор (браузер), независимо от того, насколько он заманчив, потому что вы почти всегда ошибаетесь.
— MSW

из любопытства вы используете html5?
— Болло

Ответы:


203

Это означает, что сервер отправляет Javascript HTTP-ответ с

Content-Type: text/plain

Вам необходимо настроить сервер для отправки ответа JavaScript с

Content-Type: application/javascript

3
Я использую Weblogic Server 11g, но я не знаю, где я могу настроить MIME в нем. Пожалуйста, вы можете показать мне путь?
— Шаоз

6
Хм, а как насчет того, когда нет сервера, но скрипт на самом деле является файлом JSONP в вашей локальной файловой системе? Я думаю, тогда просто проигнорируйте предупреждение, так как оно несерьезно и находится вне вашего контроля?
— hippietrail

2
Должно быть content-type:application/javascript, application/x-javascriptэто не стандарт RFC или ECMAScript.
— Джасдип Халса,

Есть много похожих вопросов. Этот ответ был для меня простым решением: stackoverflow.com/a/12057490/1617395
— Джо Лео,

@JoeLeo: это для IIS.
— SLaks

124

Это не имеет ничего общего с jQuery или каким-либо изюминкой кода скрипта на стороне клиента. Это проблема на стороне сервера : сервер (приложение на стороне) не отправляет ожидаемое значение Content-Typeполя заголовка HTTP для ресурса сценария на стороне клиента. Это происходит, если веб-сервер недостаточно настроен, неправильно настроен или приложение на стороне сервера (например, PHP) генерирует ресурс сценария на стороне клиента.

Правильные типы мультимедиа MIME для реализаций ECMAScript, таких как JavaScript, включают:

  • text/javascript(зарегистрировано как устаревшее , не устарело; но все еще действует и поддерживается лучше )
  • text/ecmascript(зарегистрировано как устаревшее , не устарело; но все еще действует )
  • application/javascript
  • application/ecmascript

Они не включают в себя application/x-javascript, поскольку перечисленные выше типы носителей MIME уже зарегистрированы в дереве стандартов (поэтому больше нет необходимости и не должно быть необходимости использовать экспериментальные типы). Ср RFC 4329, «Типы носителей со сценариями» (2005 CE) и мой тестовый пример: Поддержка типов носителей со сценариями .

Одним из решений является настройка сервера, если это возможно, как уже рекомендовано. Для Apache это может быть так просто, как добавление директивы

AddType text/javascript .js

(подробности см. в документации по Apache HTTP Server ).

Но если ресурс сценария на стороне клиента генерируется серверным приложением, таким как PHP, то необходимо Content-Typeявно установить значение поля заголовка, так как по умолчанию это вероятно text/html:

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

(Эти и аналогичные операторы должны предшествовать любому другому выводу - см. Руководство по PHP - иначе тело сообщения HTTP уже началось и уже слишком поздно отправлять больше полей заголовка.)

Генерация на стороне сервера может легко произойти с ресурсом сценария на стороне клиента, даже если у вас есть простые файлы .js на сервере, если комментарии удаляются из них по мере их доставки, если они все упакованы в один большой ответ (чтобы уменьшить количество запросов (что может быть более эффективным), либо они минимизируются серверным приложением любым другим способом.


1
Что если у нас нет доступа к серверу?
— Адонис К. Какоулидис

1
Найдите того, кто имеет.
— PointedEars

Большое спасибо за это объяснение. Слишком много людей говорят что-то дерзкое, типа «просто пошли JSONP, ты должен знать, как это сделать». Когда нужно время, чтобы правильно объяснить это, как у вас, ясно, как день. Это исправило проблему, которая возникла у меня в течение нескольких недель. Еще раз спасибо!

@ Rick-777: я не ценю, что вы меняете мой ответ, даже не комментируя ваши изменения. Если вы внимательно прочитаете мой ответ, вы поймете, почему я рекомендую text/javascriptзакончить application/javascript. Если у вас есть основания полагать, что application/javascriptсейчас это лучший ответ, то по крайней мере вам следует пояснить это в комментарии. Неуместно, что мне требуется механизм уведомления Stack Overflow, чтобы я знал о ваших изменениях. Я отменил ваши изменения, которые я называю фальсификацией , на ответы на этот вопрос, где я считаю их неуместными.
— PointedEars

19

Для серверов приложений Java, таких как Weblogic

1) Убедитесь, что ваш файл weblogic.xml не содержит ошибок

как этот:

    <?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) Добавьте MIME-тип для JavaScript в ваш файл web.xml :

    ...
        </servlet-mapping>

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

        <welcome-file-list>
    ...

Это также будет работать для других контейнеров Java - Tomcat и т. Д. В application/javascriptнастоящее время является единственным допустимым mime-типом; другие, как text/javascriptбыли устарели.

3) Вам может понадобиться очистить кеш браузера или нажать CTRL-F5


7

У меня была эта проблема, и я понял, как ее исправить.

Это происходит, когда файл стиля (CSS) находится в другой кодировке, чем файл PHP, который ссылается на файл .css.

Например, использование jQuery.js в кодировке Unix и использование index.php в UTF-8 вызовут эту проблему, поэтому вам нужно сделать так, чтобы кодировкой была либо UTF-8, либо любая другая кодировка, если она одинакова.


7

Если вы генерируете свой javascript с помощью php-файла, добавьте его в начало вашего файла:

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

Если у вас есть другой определенный заголовок, замените его, чтобы не было ошибки.
— mopsyd

1
Наряду с постом PointedEars это помогло мне решить проблему, на которую, казалось бы, не было ответа, и я ломал голову над неделями. Большое спасибо: D Почему, когда я набираю в Google «как установить заголовки в PHP-документе», я получаю 1000 ошибочных результатов, которые ничего не говорят о том, как это сделать, поэтому я не знаю, но я наконец нашел ваш пост lol

3

В httpd.conf вашего apache просто добавьте такую ​​строку:

AddType application/x-javascript .js

Моя запись " .js" содержала "application / javascript" под типами IIS 8 MIME. Когда я изменил запись « .js» на «application / x-javascript», это сработало! Это происходит из приложения ExtJS / ASP.NET / ExtDirect4DotNet
— MacGyver

3

Я получил это сообщение отладки по более глупой причине, чем другие ответы здесь: это сообщение об ошибке, полученное, когда вы не высыпаетесь и ссылаетесь на файл js, используя синтаксис для файла css. Как в,

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

скорее, чем

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

Я подумал, что это здесь, потому что это первый пост, который появляется при поиске сообщения об ошибке.


2

Странная проблема, но это помогло мне решить мою проблему. Иногда даже самые простые вещи трудно понять ...

Вместо того, чтобы использовать /js/main.cssв моем скрипте тег, я использовалjs/main.css

Да , это действительно имело значение. Я сижу на WAMP / Windows, и у меня не было vhost, а просто использовалlocalhost/<project>

Если я ссылаюсь на /js/main.cssто я имею в виду, localhost/css/main.cssа не наlocalhost/<project>/css/main.css

Когда вы думаете об этом, это совершенно очевидно, но если кто-то наткнется на это, я подумаю, что поделюсь этим ответом.


1

Проверьте, действительно ли ваши js-файлы существуют на сервере. У меня возникла эта проблема, и я обнаружил, что js-файлы не были загружены на сервер, а сервер фактически возвращал html-страницу - это был документ по умолчанию, настроенный на сервере (например, default.html)


1

Если вы работаете на Joomla! и получая эту досадную ошибку при попытке включить .jsфайл JavaScript ( ), тогда следующее решение для вас.

Наиболее вероятная проблема заключается в том, что вы пытаетесь включить .js файл, которого там нет , или вы просто потеряли этот .jsфайл, и когда Joomla! не находит ресурс, то вместо общего сообщения 404, он возвращает полноценное сообщение 404 с полной веб-страницей, HTML и т. д.

Веб-браузер интерпретирует его так, .jsкак будто это просто веб-страница, сообщающая, что нужный файл не найден .

Это может работать для


1

Для меня это произошло только на некоторых страницах, потому что я использовал window.locationвместо $location.url(...);этого исправил мою проблему. Потребовалось время, чтобы выяснить :)


0

У меня была эта проблема при использовании веб-фреймворка, и я исправил ее, переместив соответствующие файлы javascript в указанную (фреймворком) папку javascript.


0

Обычно это происходит, если вы просто забыли включить typeвызовы скрипта. Вы должны будете установить это явно, поскольку это - согласно W3 - требуется :

type(content-type): Этот атрибут определяет язык сценариев содержимого элемента и переопределяет язык сценариев по умолчанию. Язык сценариев указывается в качестве типа контента (например, "text/javascript"). Авторы должны предоставить значение для этого атрибута. Для этого атрибута нет значения по умолчанию .

Тем не менее, кажется, что браузеры имеют значение по умолчанию plain/text.

Пример:

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

Вы также можете установить значение по умолчанию для этого расширения файла в конфигурации Apache:

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

0

Если его IIS убедитесь, что под вашим common HTTP Featuresвы Static Contentвключили


0

У меня была та же ошибка, и наконец (в моем конкретном случае) я нашел проблему в дескрипторе развертывания (web.xml)

Эта проблема:

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

решение:

<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

Если вы используете Spring MVC, вы можете добавить следующий тег mvn, чтобы исключить файл ресурсов из сервлета Spring Dispatch.

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

0

В моем случае сервер отправлял правильный, Content-Typeно с неправильным Content-Encoding. Убедитесь, что вы установили только Content-Encoding: gzipдля gzipped ресурсов. Кроме того, после того, как я исправил заголовки на сервере (в моем случае, в Google Cloud Storage), мне пришлось подождать несколько минут, чтобы должным образом отразить изменения, вызванные кэшированием.


0

Если вы используете AdonisJS (REST API, например), один из способов избежать этого - определить заголовок ответа следующим образом:

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

-1

У меня возникла та же проблема при попытке изменить фоновые изображения в массиве с помощью JavaScript (в данном случае jQuery).

Тем не мение.

Вместо этого:

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

сделай это:

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

Chrome javascript не работает при попытке проанализировать переменную внутри элемента, структурированного с помощью '. В моем случае это остановилось как раз перед вставкой массива изображения. Вместо того, чтобы анализировать URL-адрес изображения + имя изображения (внутри массива), он анализировал только URL-адрес изображения.

Вам, вероятно, нужно искать внутри кода и видеть, где это происходит. FF, IE и все остальные не имеют этой проблемы.


4
Не используйте , evalесли вы можете помочь ему: javascripttoolbox.com/bestpractices/#eval
— Индру

-1

Ответ отправил здесь на Симона-Сарриса помог мне.

Это помогло мне решить мою проблему.

Установщик Visual Studio должен добавить ошибочную строку в реестр.

Откройте regedit и взгляните на этот раздел реестра:

введите описание изображения здесь

Видишь этот ключ? Ключ типа контента? измените его значение с text / plain на text / javascript.

Наконец хром может дышать легко снова.

Я должен отметить, что по умолчанию в Windows 7 нет ни Content Type, ни PerctainedType, так что вы, вероятно, можете безопасно удалить их оба, но минимум, что вам нужно сделать, это редактировать.

В любом случае, я надеюсь, это исправит и вас!

Не забудьте перезагрузить систему после внесения изменений.


Привет, обман. Плагиат это плохо. (mmmmkay?) Я отредактировал ваш ответ, чтобы убрать плагиат в соответствии с рекомендациями SO .
— Сэмюэль Хармер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.