为什么浏览器请求<script>资源时Accept头用*/*而非application/javascript
浏览器请求脚本资源时Accept头为
*/*的原因 这一行为完全是出于历史兼容性和实际业务逻辑的考量,核心原因有三点:
- 历史存量站点的兼容包袱
早期Web生态中JavaScript的MIME类型长期没有统一标准,不同站点、不同服务器配置的JS资源返回的MIME类型五花八门,包括text/javascript、application/x-javascript、application/javascript甚至text/plain都是非常常见的情况。如果浏览器在请求脚本时的Accept头里明确限定仅接受某几种JS相关类型,会导致大量历史站点的脚本资源被服务器返回406 Not Acceptable错误,完全无法正常加载。使用*/*可以规避这类兼容问题,保证所有存量站点的脚本都能正常请求。 - 脚本加载的校验逻辑不依赖内容协商
浏览器加载脚本资源时,不会靠Accept头和响应的Content-Type做严格的匹配校验:只要资源内容可以被JS引擎正常解析执行,哪怕响应头的Content-Type不符合官方标准,浏览器也会正常执行该脚本(当代浏览器的CORB等安全校验逻辑也不会和Accept头绑定)。这种情况下发送带有明确JS类型的Accept头做内容协商本身没有实际意义,直接使用*/*反而可以减少不必要的请求头体积和协商成本。 - 避免触发服务器异常逻辑
很多早期的动态服务会根据Accept头返回不同格式的内容,如果浏览器请求脚本时携带了明确的JS类型Accept头,可能会触发部分服务的异常分支逻辑,反而返回非预期的内容。使用*/*可以让服务器直接返回对应路径的默认资源内容,更符合加载脚本资源的预期。
内容的提问来源于stack exchange,提问作者Yongjian Wang
相关产品推荐
相关产品推荐

