Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Access-Control-Allow-Origin 的正确玩法

  前端发起的跨域请求需要适当地响应 Access-Control-Allow-Origin 头。但是这个头目前并不支持部分通配符,无法匹配某个域名下的子域。直接使用星号又可能带来各种问题。更坑爹的是它还不支持设置多个值。那么如果一个后端程序用于多个域名的访问该怎么办呢?
  很多时候一套后端的程序都对应了多个调用方,它们使用的的域名不同,scheme 可能也不同。所以 Access-Control-Allow-Origin 的值没法写死一个域名。如果直接暴力地将其设置为「*」,可能导致一些未被授权的域名也能请求到资源。而且当 Access-Control-Allow-Credentials 的值为 true 时会导致Access-Control-Allow-Origin 无法被设置为「*」。
  正确的玩法应该是在后端程序中获取从 HTTP 请求头传过来的 Origin 字段,然后在程序中验证它的值是否合法,并且做出适当的响应。也就是说,可以不依赖前端的跨域限制,后端如果认为一个请求的 Origin 来自不正确的地方就直接毫不留情地 403 掉。其它情况如果没有 Origin 或者 Origin 正确则将 Origin 的值原原本本地放入 Access-Control-Allow-Origin 中响应回去。
  其实虽然这个问题可以完全通过后端解决,但我还是很费解规范中无法使用局部通配符,和无法配置多个值的设定。也许这么设计的目的就是希望后端直接 403,而不是让浏览器来拦截吧(反正让浏览器来拦截还需要额外的传输成本,有点浪费)?
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^