CORS 通过控制 Access-Control-Allow-Origin 控制哪些域名可以共享资源,取值如下

Access-Control-Allow-Origin: <origin> | *

其中 * 代表所有域名,origin 代表指定特定域名,那如何设置多个域名了?

此时需要通过代码实现,根据请求头中的 Origin 来设置响应头 Access-Control-Allow-Origin,那 Origin 又是什么东西?

请求头: Origin

并不是所有请求都会自动带上 Origin,在浏览器中带 Origin 的逻辑如下

  1. 如果存在跨域,则带上 Origin,值为当前域名
  2. 如果不存在跨域,则不带 Origin

逻辑理清楚后,关于服务器中对于 Access-Control-Allow-Origin 设置多域名的逻辑也很清晰了

  1. 如果请求头不带有 Origin,证明未跨域,则不作任何处理
  2. 如果请求头带有 Origin,证明跨域,根据 Origin 设置相应的 Access-Control-Allow-Origin: <Origin>

使用伪代码实现如下:

// 获取 Origin 请求头
const requestOrigin = ctx.get('Origin'); // 如果没有,则跳过
if (!requestOrigin) {
return await next();
} // 设置响应头
ctx.set('Access-Control-Allow-Origin', requestOrigin)

Vary: Origin

此时可以给多个域名控制 CORS,但此时假设有两个域名访问 static.shanyue.tech 的跨域资源

  1. foo.shanyue.tech,响应头中返回 Access-Control-Allow-Origin: foo.shanyue.tech
  2. bar.shanyue.tech,响应头中返回 Access-Control-Allow-Origin: bar.shanyue.tech

看起来一切正常,但如果中间有缓存怎么办?

  1. foo.shanyue.tech,响应头中返回 Access-Control-Allow-Origin: foo.shanyue.tech,被 CDN 缓存
  2. bar.shanyue.tech,因由缓存,响应头中返回 Access-Control-Allow-Origin: foo.shanyue.tech,跨域出现问题

此时,Vary: Origin 就上场了,代表为不同的 Origin 缓存不同的资源

总结 (简要答案)

CORS 如何指定多个域名?

根据请求头中的 Origin 来设置响应头 Access-Control-Allow-Origin,思路如下

  1. 总是设置 Vary: Origin,避免 CDN 缓存破坏 CORS 配置
  2. 如果请求头不带有 Origin,证明未跨域,则不作任何处理
  3. 如果请求头带有 Origin,证明浏览器访问跨域,根据 Origin 设置相应的 Access-Control-Allow-Origin: <Origin>

使用伪代码实现如下

// 获取 Origin 请求头
const requestOrigin = ctx.get('Origin'); ctx.set('Vary', 'Origin') // 如果没有,则跳过
if (!requestOrigin) {
return await next();
} // 设置响应头
ctx.set('Access-Control-Allow-Origin', requestOrigin)

最新文章

  1. C# Windows API
  2. jQuery包装集
  3. 为什么我坚持学习C语言?
  4. 什么是Mbps、Kbps、bps、kb、mb及其换算和区别
  5. flume ng系列之——flume安装
  6. jQuery Transit
  7. Sublime Text 3 搭建 React.js 开发环境
  8. java17 线程的方法
  9. WF学习笔记(二)
  10. .NET开发人员必须知道的八个网站
  11. opencv如何截取子图像
  12. Mybatis插件原理和PageHelper结合实战分页插件(七)
  13. 打印时鼠标键盘移动的div创建
  14. Python之测试webservice接口
  15. 使用localhost可以访问,但使用本地ip+端口号无法访问
  16. 如何用Github删除repository
  17. Linux C 读取文件夹下所有文件(包括子文件夹)的文件名【转】
  18. Python编译安装遇到的问题
  19. [mongoDB]PyMongo Cursor Not Found Error
  20. MYSQL锁表问题解决

热门文章

  1. bootstrap 4 学习笔记
  2. zabbix 监控redis 挂掉自动重启 并发送企业微信
  3. 浅谈对typora的使用
  4. seq2seq之双向解码
  5. Linux usb 3. Host 详解
  6. 基于hadoop_yarn的资源隔离配置
  7. 大爽Python入门教程 2-5 *拓展实践,对比与思考
  8. python3 在webelement对象里面获取元素路径的方法
  9. 菜鸡的Java笔记 第二十二 - java 对象多态性
  10. 【Sass/SCSS】预加载器中的“轩辕剑”