CORS 是一种机制,它允许来自其他域(例如 myothersite.com)的页面上的浏览器脚本与您的服务器(例如 api.mysite.com)进行通信。与 JSONP 一样,CORS 的目标是绕过 同源策略,允许您的 Sails 服务器成功响应来自其他域页面上运行的客户端 JavaScript 代码的请求。与 JSONP 不同的是,它不仅支持 GET 请求,而且允许您将特定来源(例如 staging.yoursite.com 或 yourothersite.net)列入白名单,并阻止来自其他来源(例如 evil.com)的请求。
Sails 可以配置为允许来自您指定的域列表或来自所有域的跨域请求。这可以在每个路由的基础上完成,也可以在全局范围内针对您的应用程序中的每个路由完成。
出于安全原因,CORS 在 Sails 中默认情况下处于禁用状态。但启用它很简单。
要允许来自受信任域的白名单对您应用程序中的任何路由发出跨域请求,只需在 config/security.js
中启用 allRoutes
并提供 origin
设置。
cors: {
allRoutes: true,
allowOrigins: ['http://example.com','https://api.example.com','http://blog.example.com:1337','https://foo.com:8888']
}
要允许来自任何域对您应用程序中的任何路由发出跨域请求,请使用 allowOrigins: '*'
cors: {
allRoutes: true,
allowOrigins: '*',
allowCredentials: false
}
请注意,当使用 allowOrigins: '*'
时,allowCredentials
设置必须为 false
,这意味着包含 cookie 的请求将被阻止。此限制的存在是为了防止第三方网站能够欺骗您已登录的用户向您的应用程序发出未经授权的请求。您可以使用 allowAnyOriginWithCredentialsUnsafe
设置解除此限制(但风险自负!)。
有关所有可用选项的完整参考,请参见 sails.config.security.cors
。
除了 config/security.js
中的全局 CORS 配置之外,这些设置也可以在 config/routes.js
中的每个路由的基础上进行配置。
如果您在 config/security.js
中设置了 allRoutes: true
,但要排除某个特定路由,请在该路由的目标中设置 cors: false
'POST /signup': {
action: 'user/signup',
cors: false
}
要启用或覆盖特定路由的全局 CORS 配置,请将 cors
作为字典提供
'GET /videos': {
action: 'video/find',
cors: {
allowOrigins: ['http://example.com','https://api.example.com','http://blog.example.com:1337','https://foo.com:8888'],
allowCredentials: false
}
}
- CORS 支持仅与 HTTP 请求相关。通过套接字发出的请求不受跨域限制。要确保您的应用程序通过套接字安全,请配置
onlyAllowOrigins
设置(通常在config/env/production.js
中)。- Internet Explorer 7 不支持 CORS。幸运的是,它在 IE8 及更高版本以及所有其他现代浏览器中都得到支持。
- 阅读 有关 CORS 的更多信息(来自 MDN)。
- 阅读 CORS 规范。