到目前为止一切都很好,但是……有时候会出现这样的错误:
“Script error.”,”Error loading script”,”Unexpected token <“
我的假设是谷歌CDN在这些情况下被阻止(无论出于何种原因).我确实有一个jQuery的本地回退,我相当确定它运行良好,但我想知道返回什么,以便我可以测试我的假设,并可能将这些用户列入Google CDN的白名单(如果是公司防火墙阻止它).
但到目前为止,我还没有弄清楚如何检索返回的内容.如果它是文件,则无法检索SCRIPT标记的innerText,因跨域策略而无法执行ajax请求等.
有没有人对如何做到这一点有任何想法?
解决方法
考虑:
<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>
如果您可以访问respnse的文本,您将能够执行此操作:
var stolenAuthToken = $('#s').text();
那显然很糟糕.因此,您永远不会被允许阅读< script>带来的内容.标签.
最近引入的change使您的特定情况变得复杂,其中跨源脚本中的错误不会向页面的错误处理程序报告任何有用的信息. (基本上,这是为了修补信息泄露安全漏洞,允许恶意网站推断您是否登录到某些知名网站等.)
这意味着您没有从CDN托管脚本获得有关错误的有用信息,因此another change允许使用CORS用于CDN(或其他非同源)服务器以选择允许完整错误详细信息传递给一个恐怖处理程序.
We (Facebook) need a mechanism for disabling the
window.onerror
muting behavior implemented in 07003. Our static script resources are served on a CDN under a different domain from the main site. Because these domains differ we’re falling afoul of the x-domain logic that prevents us from gathering useful information about browser errors.This “feature” has been widely enough adopted in in the wild (in Firefox and Webkit browsers) that the majority of uncaught exceptions we see in production now have no actionable information in them.
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检查也会失败,并且您的脚本将收到已清除的错误详细信息.
在Google CDN服务器上启用CORS有一个three-year-old issue.我不会屏住呼吸.
tldr:如果您需要有意义的错误消息,则必须在同一个源上自己托管所有JavaScript.