錯誤監控做爲開發平常的工做保證,但卻常常在錯誤平臺看到的是這種莫明其妙,少得可憐的錯誤信息,讓人無從下手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