Просто невозможно получить содержимое любого файла, на который ссылается тег <script>
. Это не без оснований: это позволит вам обойти политику XHR Same Origin.
Рассмотрим:
<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>
Если бы вы могли получить доступ к текст respnse, вы были бы в состоянии сделать это:
var stolenAuthToken = $('#s').text();
Очевидно, что это плохо. Поэтому вам никогда не разрешается читать содержимое чего-то, что было добавлено в теги <script>
.
Ваша конкретная ситуация осложняется сравнительно недавно представила change где ошибки в кросс происхождения сценариев не сообщают любой полезной информации на вашей странице onerror
обработчика. (По сути, это было сделано для исправления дыры безопасности раскрытия информации, которая позволяет злоумышленнику определить, вошли ли вы на некоторые известные сайты.)
Это означает, что вы не получаете никакой полезной информации об ошибках из сценария, размещенного на CDN, поэтому было сделано another change, чтобы разрешить использование CORS для сервера CDN (или другого не одного происхождения), чтобы разрешить полную информацию об ошибке передать обработчик onerror
.
Мы (Facebook) нужен механизм для отключения window.onerror
приглушения поведения, реализованного в #363897. Наши ресурсы статического сценария подаются на CDN в другом домене с основного сайта. Поскольку эти домены отличаются друг от друга, мы отстаем от логики x-домена, которая мешает нам собирать полезную информацию о ошибках браузера.
Эта «функция» была достаточно широко принята в дикой природе (в браузерах Firefox и Webkit), что большинство исключений, которые мы видим в производстве, теперь не имеют в них никакой информации.
crossorigin
attribute (первоначально предназначалась для <img>
) позволяет указать, что ресурс должен быть загружен с правилами CORS. Он был реализован Mozilla, WebKit и Chrome.
<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script>
К сожалению для вас, в моем testing, я обнаружил, что Google CDN делает не отправки заголовков CORS.
GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js HTTP/1.1
Host: ajax.googleapis.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://fiddle.jshell.net/josh3736/jm2JU/show/
Origin: http://fiddle.jshell.net
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Vary: Accept-Encoding
Content-Type: text/javascript; charset=UTF-8
Last-Modified: Tue, 13 Nov 2012 19:53:02 GMT
Date: Wed, 02 Jan 2013 22:54:25 GMT
Expires: Thu, 02 Jan 2014 22:54:25 GMT
X-Content-Type-Options: nosniff
Server: sffe
Content-Length: 93637
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=31536000
Age: 169036
...
Обратите внимание на наличие Origin
заголовка в запросе (с указанием запроса CORS), а также отсутствие Access-Control-Allow-Origin
заголовка в ответе. Таким образом, даже если вы поместите атрибут crossorigin
, проверка CORS завершится неудачно, и ваши скрипты получат данные об очищенной ошибке.
Для включения CORS на сервере CDN Google существует three-year-old issue. Я бы не затаил дыхание.
tldr: Если вы хотите содержательные сообщения об ошибках, вы должны разместить все JavaScript самостоятельно, на то же происхождение.
видa что я понял. Я посмотрю, могу ли я напрямую исследовать с затронутыми пользователями. Благодарю. – Pyro979
Так подробно, отличный пост! – potench