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

316

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

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

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

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

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

Ответы:

203

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

Content-Type: text/plain

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

Content-Type: application/javascript
SLaks
источник
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

egallardo
источник
7

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

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

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

MAK
источник
7

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

<?php Header("Content-Type: application/x-javascript; charset=UTF-8"); ?>
mopsyd
источник
Если у вас есть другой определенный заголовок, замените его, чтобы не было ошибки.
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

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

bestprogrammerintheworld
источник
1

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

Стив Мак
источник
1

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

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

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

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

Мохд Абдул Муджиб
источник
1

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

TFA
источник
0

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

JJ.
источник
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/"/>
sendon1982
источник
0

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

falsarella
источник
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 .
Сэмюэль Хармер