错误监控做为开发平常的工做保证,但却常常在错误平台看到的是这种莫明其妙,少得可怜的错误信息,让人无从下手html
Script Error
错误,是因为浏览器的同源策略,对于跨域的脚本捕获的错误,只会输出如此简短一句;CORS
宝典,给JS
请求返回Access-Control-Allow-Origin: *
,就能够解决了;Script Error
的缘由浏览器在同源策略限制下,出于安全上的考虑,页面无权限获取异常详情, 只输出 Script error
的错误信息。nginx
在 webkit 的源码里能够看到 Script error
的输出过程,从下面的代码看到,web
canIncludeErrorDetails
判断Origin
请求头是否是同源dispatchErrorEvent
抛出错误详情,抛出方式由上面的同源与否来决定bool ScriptExecutionContext::dispatchErrorEvent(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL, JSC::Exception* exception, CachedScript* cachedScript)
{
auto* target = errorEventTarget();
if (!target)
return false;
RefPtr<ErrorEvent> errorEvent;
if (canIncludeErrorDetails(cachedScript, sourceURL))
errorEvent = ErrorEvent::create(errorMessage, sourceURL, lineNumber, columnNumber, { vm(), exception ? exception->value() : JSC::jsNull() });
else
errorEvent = ErrorEvent::create("Script error."_s, { }, 0, 0, { });
// other code
}
// FIXME: Should this function be in SecurityContext or SecurityOrigin instead?
bool ScriptExecutionContext::canIncludeErrorDetails(CachedScript* script, const String& sourceURL)
{
ASSERT(securityOrigin());
if (script) {
ASSERT(script->origin());
ASSERT(securityOrigin()->toString() == script->origin()->toString());
return script->isCORSSameOrigin();
}
return securityOrigin()->canRequest(completeURL(sourceURL));
}
复制代码
其实很简单,给JS请求返回Access-Control-Allow-Origin: *
,浏览器就能正常经过window.onerror
来捕获详细的错误鸟~跨域
location ~* \.js$ {
add_header access-control-allow-origin *;
}
复制代码
*
会不会有什么安全问题呢,没想出来会有什么安全问题(若是有想到的能够留言说下),JS脚本原本就是能够跨域请求的。看了下淘宝,也是这么干的Access-Control-Allow-Origin
呢正常状况下,跨域JS请求是不会发送Origin
请求头,咱们在script
标签里加上crossorigin
属性就能够使浏览器发送了。 而后服务器就能够根据Origin
头部来判断来者何人鸟浏览器
<script src="other-domain.com/path/to/s.js" crossorigin></script>
复制代码
参考文章:安全
webkit: trac.webkit.org/browser/tru…服务器
what the heck is 'script error': blog.sentry.io/2016/05/17/…dom