如何将返回text/html类型的外部资源作为JavaScript文件加载执行?
问题原因
浏览器出于标准安全限制,当script标签请求的资源返回Content-Type为text/html时,会直接拒绝将其作为JavaScript执行,无法通过修改原生script标签属性直接绕过该限制。
可行解决方案
- 优先调整服务端配置:这是最合规的解决方案,联系对应资源的服务提供方,将
https://other-domain.com/AgencySystem/chat/js接口的响应头Content-Type修改为application/javascript或text/javascript,调整完成后原有script标签即可正常加载执行,不需要修改前端代码。 - 前端手动请求后执行:如果无法修改服务端配置,且确认该接口返回的内容本质是合法JS代码、只是响应头配置错误,可以通过fetch请求资源后手动执行:
fetch('https://other-domain.com/AgencySystem/chat/js') .then(res => res.text()) .then(jsContent => { // 方案1:直接eval执行 eval(jsContent); // 方案2:创建script标签注入内容执行,效果与eval一致 // const script = document.createElement('script') // script.textContent = jsContent // document.head.appendChild(script) })注意:该方案要求目标接口配置了跨域规则允许你的站点访问,否则会被CORS策略拦截。同时手动执行外部来源的代码存在极高的XSS安全风险,必须确认该资源完全可信再使用该方案。
- 搭建代理服务中转:如果以上两种方案都不可行,可以在自己的业务服务端新增代理接口,由服务端请求目标JS资源,再将资源内容以
application/javascript的正确响应头返回给前端,前端直接请求自己的代理接口即可正常加载。
内容的提问来源于stack exchange,提问作者Jamviet.com
相关产品推荐
相关产品推荐

