Chrome отказался выполнять этот файл JavaScript

32

В заголовке моей HTML-страницы есть:

<script src="https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js"></script>

Когда я загружаю страницу в своем браузере (Google Chrome v 27.0.1453.116) и включаю инструменты разработчика, он говорит:

Отказался выполнять скрипт из « https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js », потому что его тип MIME («text / plain») не является исполняемым, и строгая проверка типов MIME включена.

Действительно, скрипт не запустится. Почему Chrome считает, что это простой текстовый файл? У него явно есть .jsрасширение файла.

Поскольку я использую HTML5, я пропустил typeатрибут, поэтому я подумал, что это может быть причиной проблемы. Поэтому я добавил type="text/javascript"к <script>метке, и получил тот же результат. Я даже попробовал type="application/javascript"и все еще получил ту же ошибку.

Тогда я попытался изменить это type="text/plain"просто из любопытства. Браузер не вернул ошибку, но, конечно, JavaScript тоже не работал.

Наконец я подумал, что точки в имени файла могут сбить браузер. Поэтому в моем HTML-коде я изменил все точки на escape-символ URL %2E:

<script src="https://raw.github.com/cloudhead/less%2Ejs/master/dist/less-1%2E3%2E3.js"></script>

Это все еще не сработало. Единственное, что действительно работает (т. Е. Браузер не выдает ошибку и JS успешно запускается), это если я загружаю файл, загружаю его в локальный каталог, а затем изменяюsrc значение на локальный файл. Я бы предпочел не делать этого, так как я пытаюсь сэкономить место на своем собственном сайте.

Как заставить Chrome распознавать, что связанный файл на самом деле является типом JavaScript?

chharvey
источник

Ответы:

16

Проблема, которая у вас есть, находится вне вашего контроля, поскольку именно так настроен хостинг в Github по указанному вами пути. Тип расширения является не только фактором, когда дело доходит до выполнения файлов, так как веб-хостинг может нарушать правила Браузер отображает файл.

Вы можете получить рендеринг файла .zip в виде файла .html, если для этого настроен хост, вы можете проверить это самостоятельно с помощью firebug и просмотреть ответ заголовка на то, что запрашивается .... так что если вы запрашиваете файл JS, но ответ заголовка возвращает другое ожидаемое значение, тогда браузеры будут учитывать ответ заголовка, а не то, что запрашивается ...

Хостинг GitHub на сыром поддомене возвращается Content-Type text/plain; charset=utf-8 как MIME-тип, что означает, что он будет работать не как JS, а как необработанный текст. Ниже приведен пример того, что вам нужно вернуть серверу для рендеринга файла, и далее код, который возвращается github.

Сервер, который поддерживает тип JS MIME, будет выглядеть примерно так:

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Encoding    gzip
Content-Length  31097
Content-Type    application/javascript
Vary    Accept-Encoding
Request Headersview source
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

И это то, что https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.jsзаголовок отвечает как (RAW VIEW).

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Disposition inline
Content-Encoding    gzip
Content-Length  41354
Content-Transfer-Encoding   binary
Content-Type    text/plain; charset=utf-8
Саймон Хейтер
источник
Э, что? Так в чем же дело?
Пабрамс
2
@pabrams - использование правильного хоста в вашем контроле - это исправление или использование rawgit
Саймон Хейтер
25

Дек. 2018 г.

RawGit в настоящее время находится в состоянии заката из-за злонамеренного использования, поэтому вместо него рекомендуется использовать один из следующих сервисов:


Оригинальный пост

Rawgithub.com позволяет пользователям брать «сырые» версии Git и превращать их в URL-адрес, используемый в <script>тегах. Его довольно просто использовать, просто удалите первый .из необработанного URL. Например, это:

https://raw.github.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

превратится в это

https://rawgithub.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

а затем вы помещаете его в <script>тег с соответствующим типом. Так просто!

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

2014 редактировать

Как упоминал Рейндериен, rawgithub теперь просто rawgit, поэтому новая ссылка на скрипт будет

https://rawgit.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js
Зак Соусье
источник
6
На домашней странице rawgithub написано: не используйте его для рабочих сайтов . Также это не официальный сайт Github.
DisgruntledGoat
1
Я никогда не говорил, что не ...
Зак Сауцер
1
Обратите внимание - теперь это перенаправляет на rawgit.com. И это работает!
Reinderien
1
Этот сайт теперь дает 403 секунды для запросов, а заголовки сообщают вам, что это закат.
Майкл
@Michael Sad :( К счастью, rawgit предоставил некоторые альтернативы на своем веб-сайте, поэтому я обновил свой ответ с учетом предоставленных.
Zach Saucier
6

Расширение файла не имеет значения, важен заголовок Content-Type, и этот файл обслуживается text/plainтипом контента (который является целью «сырого» представления Github).

Вы действительно должны скачать копию файла локально на свой сайт и включить его оттуда. Даже если это работает с Github, поскольку вы не загружаете файл JS асинхронно, размещение этого <script>тега в заголовке страницы делает ваш сайт зависимым от доступности Github.

Тим Фонтан
источник
8
«Вы должны действительно загрузить копию файла локально на свой сайт и включить ее оттуда», - вот ключ. Его нельзя размещать на GitHub.
Осьминог
@ Осьминог мы можем настроить для загрузки и сохранения локальной копии этого, а затем указать программный сценарий на него ...
Судип Бхандари
2

Это преднамеренная функция, предназначенная для предотвращения определенных атак XSS .

Как объясняет Майк Уэст , не используйте raw.github.comв качестве CDN; использовать GitHub Pagesвместо этого .

Кроме того, явное кодирование незарезервированных символов не изменит способ обработки URL.

Lèse Majesté
источник
1

Как указывает bybe проблема заключается в том, что почти весь контент, обслуживаемый raw.github.com, отправляется в виде текстового файла - таким образом, контент отображается в вашем браузере в виде обычного текста без каких-либо других приложений или проблем. В противном случае вы попадаете в ситуацию, когда попытка просмотреть файл .js может привести к тому, что браузер попытается запустить его, а не покажет его вам.

Кроме того, ни github, ни pages.github не пытаются быть CDN. Вы действительно должны:

  1. Разместите файл самостоятельно, он не такой большой.
  2. Используйте выделенный CDN для этого и других статических файлов на вашем сайте.
  3. Используйте что-то вроде cdnjs.com, у которого есть разные версии lessjs .
Жаф - Бен Дюгуид
источник