Po prostu nie można uzyskać zawartości dowolnego pliku, do którego odwołuje się znacznik <script>
. Jest to słuszne: pozwoliłoby to na obchodzenie zasad XHR o tym samym pochodzeniu.
Rozważmy:
<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>
Jeśli można uzyskać dostęp do tekstu respnse, byłbyś w stanie to zrobić:
var stolenAuthToken = $('#s').text();
To oczywiście źle. Dlatego nigdy nie wolno ci czytać treści wprowadzonych przez tagi <script>
.
danej sytuacji komplikuje stosunkowo niedawno wprowadzone change gdzie błędy w skryptach przekroju pochodzenia nie zgłaszają dowolny przydatnych informacji do swojej strony za onerror
obsługi. (Zasadniczo zostało to zrobione, aby załatać dziurę bezpieczeństwa informacyjną, która pozwala złośliwej witrynie na stwierdzenie, czy jesteś zalogowany w niektórych znanych witrynach, między innymi.)
Oznacza to, że nie masz żadnych przydatnych informacji o błędach ze skryptu hostowanego przez CDN, więc another change zostało wprowadzone, aby umożliwić użycie CORS dla serwera CDN (lub innego serwera innego pochodzenia), aby umożliwić przekazanie szczegółowych informacji o błędzie do obsługi onerror
.
My (Facebook) potrzebują mechanizm wyłączania window.onerror
wyciszenia zachowanie realizowane w #363897. Nasze zasoby skryptów statycznych są dostarczane na CDN w innej domenie niż strona główna. Ponieważ te domeny różnią się, mamy do czynienia z logiką domeny x, która uniemożliwia nam zbieranie przydatnych informacji o błędach przeglądarki.
Ta "cecha" została na tyle szeroko przyjęta w środowisku naturalnym (w przeglądarkach Firefox i Webkit), że większość niezatrzymanych wyjątków, które widzimy w produkcji, nie zawiera w sobie żadnych przydatnych informacji.
crossorigin
attribute (pierwotnie przeznaczony dla <img>
) pozwala określić, że zasób powinien być ładowany z zasadami Cors. Został zaimplementowany przez Mozillę, WebKit i Chrome.
<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script>
Niestety dla Ciebie, moim testing, okazało się, że Google robi CDN nie wysłać nagłówki 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
...
zauważyć obecność nagłówka w żądaniu (wskazywania żądania CORS) Origin
i Nieobecność Access-Control-Allow-Origin
nagłówka odpowiedzi. Dlatego nawet jeśli umieścisz atrybut crossorigin
, sprawdzenie CORS nie powiedzie się, a twoje skrypty otrzymają szczegółowe informacje o błędach.
Istnieje three-year-old issue, aby włączyć CORS na serwerze Google CDN. Nie wstrzymałbym oddechu.
tldr: Jeśli chcesz znaczące komunikaty o błędach, trzeba zorganizować wszystkie JavaScript samodzielnie, na tym samym pochodzeniu.
trochę, co wymyśliłem. Zobaczę, czy mogę zbadać sprawę bezpośrednio u użytkowników, których dotyczy problem. Dzięki. – Pyro979
Tak szczegółowy, doskonały post! – potench